Конспект лекций FAU по распознаванию образов

Я твой отец, Deep Net — многослойный персептрон

Краткое введение в многослойный персептрон

Это конспект лекций FAU на YouTube Распознавание образов. Это полная стенограмма видео лекции и сопоставление слайдов. Исходники для слайдов доступны здесь. Мы надеемся, вам понравится это так же, как видео. Эта стенограмма была почти полностью сгенерирована машиной с использованием AutoBlog, и были внесены лишь незначительные изменения вручную. Если вы заметили ошибки, сообщите нам об этом!

Навигация

Предыдущая глава / Посмотреть это видео / Следующая глава / Верхний уровень

Добро пожаловать всем на распознавание образов! Сегодня мы хотим изучить многослойные персептроны, которые также называются нейронными сетями. Дадим краткий набросок идей нейронных сетей.

Давайте посмотрим на многослойные персептроны. Вы видите, что мы говорили об этом здесь только об очень основных понятиях. Если вас интересуют нейронные сети, у нас есть целый класс по глубокому обучению, где мы рассказываем обо всех деталях. Здесь мы останемся скорее на поверхности. Возможно, вы знаете, что нейронные сети чрезвычайно популярны, потому что они также имеют эту физиологическую мотивацию. Мы видели, что персептрон, по сути, вычисляет сумму входящих элементов, они взвешиваются внутренним произведением и некоторым смещением. Можно сказать, что это имеет какое-то отношение к нейронам, потому что нейроны связаны акцентами с другими нейронами и, по сути, получают электрические активации от этих других нейронов. Они собирают их, и как только входные данные превышают определенный порог, нейрон активируется. И у вас обычно есть этот ноль или один ответ. Таким образом, он либо активирован, либо нет, и не имеет значения, насколько сильным является фактическое срабатывание. Если вы выше порога, то у вас есть выход, а если нет, выхода просто нет. Если вас интересует биология обучения и памяти, пожалуйста, ознакомьтесь с прекрасным введением профессора Шульце.

Итак, у вас есть эти нейроны, и мы не говорим здесь о биологических. Но мы поговорим о математических, основанных на персептроне. Затем мы можем продолжить и расположить их слоями и слоями друг над другом. По сути, у нас есть несколько входных нейронов, где у нас есть просто вектор входных признаков и некоторое смещение, которое мы здесь указываем с помощью одного. Затем это передается в полностью связанном подходе. Таким образом, мы, по сути, соединяем все со всем, и у нас есть скрытые слои. Они скрыты, потому что мы почему-то не можем наблюдать, что с ними происходит на самом деле. Мы можем только заметить, что если у нас есть заданная входная выборка и мы знаем веса, то мы действительно можем вычислить, что там происходит. Если у нас этого нет, то обычно мы не видим, что происходит, а видим только вывод в самом конце. Затем результат снова становится наблюдаемым, и обычно мы получаем желаемый результат. Затем этот желаемый результат можно использовать для сравнения с выходом сети, что позволяет нам построить процедуру обучения. Обратите внимание, что мы не только суммируем взвешенные входные элементы, но и очень важна эта нелинейность.

Итак, нам нужно смоделировать эту функцию отклика «все или ничего». Мы видели, что изначально Розенблатт использовал ступенчатую функцию. Конечно, мы могли бы также использовать линейные функции, но если бы мы использовали линейные функции, то мы увидим, что к концу этого видео все по существу рухнуло бы до одного большого матричного умножения. Итак, на самом деле в каждом слое, если они полностью связаны, то вы, по сути, вычисляете матричное умножение активаций предыдущего слоя на следующий. Это можно смоделировать просто как матрицу. Теперь то, что обычно не моделируется как матрица, — это функция активации, и функция активации применяется поэлементно. Ступенчатая функция была таким подходом, как это сделал Розенблатт. Но в более поздних и классических подходах очень часто использовались следующие две функции: сигмовидная функция и логистическая функция, а в качестве альтернативы также использовался гиперболический тангенс, поскольку он имеет некоторые преимущества в отношении оптимизации. Итак, теперь мы можем записать наши единицы этих сетей как суммы по предыдущим слоям. Итак, у нас есть некоторый yi, который является результатом предыдущего слоя. Таким образом, мы указываем это здесь с L минус 1. Затем это умножается на некоторое Wij, и у нас также есть это смещение W0j в текущем слое L. Эта сумма, по сути, уже создает вывод, но затем чистый вывод также проходит через функцию активации. f и f — один из вариантов, который мы видим здесь выше. Таким образом, это вводит нелинейность, которая затем создает выходные данные слоя L в соответствующем нейроне.

Теперь вы хотите иметь возможность обучать этому, и это обычно делается с использованием алгоритма обратного распространения ошибки. Это контролируемая процедура обучения, и обратное распространение помогает вычислить градиенты. Таким образом, обратное распространение — это не сам алгоритм обучения, а способ вычисления градиента. Здесь мы предлагаем использовать градиентный спуск, и мы можем сделать это, обновив предыдущие веса в соответствии с градиентом весов. Затем мы можем по существу определить это с помощью частной производной функции потерь, обозначенной здесь как ϵ, и затем это частично выводится по отношению ко всем весам этого конкретного слоя. Вы можете видеть, если вы думаете о слоях, вы обнаружите, что все веса соответствующего слоя получают очень похожие правила обновления. Поэтому их можно обобщить, и мы сделаем это на следующих нескольких слайдах. Обычно вы выбираете функцию ошибки, здесь мы выбираем среднеквадратичную ошибку. Есть много других функций потерь, также доступных, если вы хотите увидеть все подробности о других распространенных функциях потерь, я действительно могу порекомендовать посмотреть лекцию о глубоком обучении. Здесь вы видите, что у нас есть некоторая цель tk, а затем мы сравниваем выходные данные последнего слоя, возводим их в квадрат и суммируем по существу для всех выходных данных. Это дает нам среднеквадратичную ошибку.

Теперь, как мы можем вычислить обновления? Что ж, нам нужно вычислить частные производные относительно весов, которые мы хотим обновить. Мы начнем с выходного слоя, так что здесь у вас есть среднеквадратическая ошибка. Затем мы вычисляем частную производную относительно фактических весов последнего слоя. Если мы хотим сделать это, мы видим, что должны применить цепное правило. Итак, мы вычисляем частную производную ошибки по сети. Затем частная производная сети по весу, который мы хотим обновить. Если мы посмотрим на это в дополнительных данных, мы уже увидим, что частная производная сети по весам — это просто результат предыдущего слоя. Итак, это yj слоя L минус 1, который, по сути, является слоем перед последним слоем. Затем введем это δk(L), которое по существу является так называемой чувствительностью. Теперь чувствительность мы можем рассмотреть немного подробнее. Здесь нам нужно вычислить частную производную ошибки по сети, и снова, если мы хотим посмотреть на это, мы можем применить цепное правило. Таким образом, мы вычисляем частную производную ошибки относительно выходных данных последнего слоя. Затем на выходе последнего слоя мы вычисляем частную производную по отношению к сети в этом слое. Тогда вы можете видеть, что мы можем по существу записать это как целевое значение минус время вывода последнего слоя, и теперь у нас здесь есть простое число f, которое, как вы знаете, является производной функции активации сети на уровне L. Таким образом, это дает нам чувствительность в последнем слое.

Это было довольно легко. Теперь давайте посмотрим, что произойдет, если мы продвинемся на один уровень глубже. Итак, теперь мы хотим перейти к весу l минус один слой, последний скрытый слой. Если мы хотим сделать это, мы, по сути, следуем той же линии, берем среднеквадратичную ошибку и вычисляем частную производную по отношению к весу последнего скрытого слоя. Теперь мы видим, что мы снова применяем цепное правило. Итак, мы вычисляем частную производную среднеквадратичной ошибки относительно выходных данных последнего скрытого слоя. Затем мы видим, что нам нужно вычислить частную производную выходных данных последнего скрытого слоя по сети и снова сеть по весам. Ну, вычисление частной производной сети по весам просто даст нам входные данные из предыдущего слоя. Итак, это просто yi предыдущего уровня. Итак, это L минус 2. Затем снова вычисление частной производной выхода L минус 1 слоя по отношению к сети даст нам производную функции активации сети. Нам все еще нужно вычислить частную производную среднеквадратичной ошибки по выходным данным слоя L-1.

Итак, теперь мы можем видеть, что эта частная производная среднеквадратичной ошибки по отношению к слою L минус 1 немного сложнее. Потому что среднеквадратическая ошибка, по сути, представляет собой разницу между всеми выходными данными и по сравнению с целями степени двойки и суммируется. Итак, чтобы вычислить следующий шаг, мы снова применяем цепное правило. Итак, мы вычисляем частную производную по квадрату и видим, что это дает первый член. Таким образом, это сумма всех активаций в последнем слое по сравнению с целевыми значениями. Затем нам все еще нужно умножить это на частную производную yk слоя L по отношению к yj слоя L минус 1. Теперь снова мы применяем здесь цепное правило, так что это дает нам частную производную yk слоя L по отношению к сети слоя L. Тогда мы по-прежнему получаем частную производную сети на уровне L по отношению к входным данным, созданным в слое L минус 1 в yj. Теперь мы снова видим, что можем определить эти частные производные. Это снова частная производная активации в положении сети на уровне L. Затем она умножается на следующую частную производную, и снова сеть по отношению к предыдущему слою представляет собой просто веса. Итак, если мы снова напишем это как чувствительности, вы увидите, что у нас, по сути, есть сумма по всей чувствительности, умноженная на соответствующие веса, которые мы получаем здесь как среднеквадратическая ошибка, обратно распространенная на слой L минус 1.

Теперь мы можем использовать этот термин снова и вычислить окончательное обновление градиента, и здесь мы видим, что мы получаем для чувствительности в любом слое L. Это просто производная функции активации сети, умноженная на сумму всех весов, умноженных с чувствительностью следующего слоя. Таким образом, мы можем по существу сформулировать это как своего рода правило обновления. Правило обновления, если мы хотим создать градиент весов, задается как чувствительность этого слоя, умноженная на ввод предыдущего слоя. Таким образом, мы получаем рекурсивную формулировку для вычисления этих обновлений. Теперь это просмотр всех весов на уровне узла, и смотреть на это на уровне узла чрезвычайно утомительно. Я думаю, что это немного сложно понять, поэтому я также представил вам концепцию абстракции слоев.

В концепции абстракции слоев теперь мы просто выражаем различные слои как матричные умножения. Здесь, в этом академическом примере, я также пропускаю функцию активации. Итак, если вы хотите включить функции активации, вам также необходимо применять их поэлементно после каждого применения матричного умножения здесь. Тогда это действительно даст вам полную сеть. Здесь у нас, по сути, есть три матрицы, умноженные друг на друга, технически их также можно свернуть в одну матрицу, но чтобы показать вам рабочий процесс вывода, я буду использовать этот пример. Итак, если вы сделаете это и пойдете дальше, нам также понадобится наша среднеквадратическая ошибка, теперь это просто квадрат нормы L2 желаемого вывода и соответствующий ввод, проанализированный сетью. Таким образом, это, по сути, тогда x, умноженное на W1, умноженное на W2, умноженное на W3, минус желаемый результат, который мы обозначаем здесь как y. Итак, это, по сути, именно эта среднеквадратическая ошибка. Обратите внимание, что я немного смешиваю обозначения, но, конечно, это продвинутый класс, и я думаю, что теперь вы можете понять, что y больше не является выходом сети, но здесь это желаемая цель. Итак, если мы сейчас продолжим, нам нужно вычислить градиенты, и я не буду рассматривать этот пример и действительно вычислю все градиенты. Но я хочу показать вам общий набросок того, как на самом деле применяется обратное распространение.

Итак, если вы хотите вычислить градиенты, то первое, что вам нужно сделать, это вычислить прямой проход по всей сети. Затем вам нужно вычислить обновления по отношению к различным слоям. Итак, для этой функции потерь здесь вы вычисляете частную производную функции потерь по отношению к W3, W2 и W1. Теперь W3 — последний слой. Таким образом, то, что вы получаете с точки зрения обновления для W3, является частной производной функции потерь по f3 от x, так что это, по сути, выход сети. Затем вы умножаете это на частную производную от f3 по отношению к W3, и я записываю фактические вычисления здесь, чтобы вы действительно могли следовать этому градиенту. Теперь, если я вернусь на один слой назад, то я, по сути, частично повторно использую результат предыдущего слоя, потому что, если я хочу выполнить обратное распространение для другого шага, мне по существу нужна для каждого из этих слоев частная производная по отношению к входным данным и частная производная по весам. Таким образом, в слое W2 это будет частная производная от f3 по отношению к f2. И это будет просто транспонирование W3, а затем вам также понадобится частная производная f2 по отношению к W2, которая затем будет входом из транспонированного предыдущего слоя. Теперь, если я хочу вычислить полный градиент, я, по сути, умножаю частные производные по этой красной дорожке. Затем я получаю обновление градиента для этого конкретного веса. Таким образом, чем глубже я погружаюсь, тем чаще мне приходится умножать частные производные, необходимые для обратного распространения в эту конкретную позицию. Если я хочу перейти к самому первому слою, вы увидите, что у меня всего четыре мультипликативных шага, чтобы вычислить обновление для первого. У нас есть больше этого примера в лекции по глубокому обучению. Итак, мы более подробно остановимся на обратном распространении и том, как вычислять отдельные шаги. Но я думаю, что этой фигуры и вычислений по узлам на данный момент достаточно.

Теперь вы видите, что у нас есть физиологические предпосылки для нейронных сетей. Мы не говорили о деталях нейронов, синапсов и потенциалов действия. Но я дам вам ссылки, если вас интересует биологическая подоплека. Затем это привело к топологии многослойных персептронов, которые мы располагаем слоями. Конечно, в каждом слое мы применяем нейронные функции активации. Если затем мы хотим вычислить обновления, мы можем использовать алгоритм обратного распространения для вычисления фактических градиентов. Затем мы можем попробовать методы градиентного спуска, чтобы фактически выполнить обучение.

Итак, в следующем видео мы хотим немного подробнее поговорить о стратегиях оптимизации. Мы рассмотрим некоторые идеи о том, как мы можем выполнить оптимизацию, и у меня еще есть для вас дополнительная литература.

В частности, если вы интересуетесь физиологией, я могу порекомендовать эти две ссылки. Все они очень хороши, если вы хотите получить некоторое представление о настоящей биологии, связанной с биологическими нейронными сетями. Так что я надеюсь, что вам понравилось это небольшое видео, и я с нетерпением жду встречи с вами в следующем видео. Большое спасибо за просмотр и до свидания!

Если вам понравился этот пост, вы можете найти больше эссе здесь, больше учебных материалов по машинному обучению здесь или посмотреть нашу Глубокое обучение Лекцию. Я также был бы признателен за подписку на YouTube, Twitter, Facebook или LinkedIn, если вы хотите получать информацию о новых эссе, видео и исследованиях в будущем. Эта статья выпущена на условиях Creative Commons 4.0 Attribution License и может быть перепечатана и изменена при ссылке. Если вы заинтересованы в создании расшифровок видеолекций, попробуйте Автоблог

Ссылки

  1. Роберт Ф. Шмидт (Hrsg.): Neuro- und Sinnesphysiologie, 3., korrigierte Auflage, Springer, Berlin, 1998.
  2. Роберт Ф. Шмидт, Флориан Ланг, Мартин Хекманн (Hrsg.): Physiologie des Menschen mit Pathophysiologie, 31., neu Bearb. ты фактический. Auflage, Springer, Берлин, 2010 г.