Алгоритм обратного распространения


19

Я получил небольшую путаницу с алгоритмом обратного распространения , используемым в многослойном персептроне (MLP).

Ошибка корректируется функцией стоимости. В обратном распространении мы пытаемся отрегулировать вес скрытых слоев. Я могу понять ошибку вывода, то есть e = d - y[Без подписки].

Вопросы:

  1. Как получить ошибку скрытого слоя? Как рассчитать это?
  2. Если я распространяю его обратно, должен ли я использовать его как функцию стоимости адаптивного фильтра или использовать указатель (в C / C ++) в смысле программирования, чтобы обновить вес?

NN - скорее устаревшая технология, поэтому я боюсь, что вы не получите ответ, потому что никто здесь не использует их ...

@mbq: Я не сомневаюсь в ваших словах, но как вы пришли к выводу, что NN - это «устаревшая технология»?
Штеффен

1
@steffen наблюдением; Я имею в виду, что очевидно, что никто из значимого сообщества NN не выйдет и скажет: «Эй, ребята, давайте бросим нашу жизнь и поиграем с чем-то лучше!», Но у нас есть инструменты, которые достигают такой же или лучшей точности без всей этой двойственности и никогда окончание обучения. И люди отказываются от NN в их пользу.

5
Это было правдой, когда ты это сказал, @mbq, но больше нет.
Джерад

1
@jerad Довольно просто - я просто еще не видел честного сравнения с другими методами (Kaggle - это несправедливое сравнение из-за отсутствия доверительных интервалов для точности - особенно когда результаты всех команд с высокими показателями так близки как и в конкурсе Merck), нет никакого анализа надежности оптимизации параметров - что намного хуже.

Ответы:


27

Я подумал, что отвечу на отдельный пост здесь для всех, кто заинтересован. Это будет использовать обозначения, описанные здесь .

Вступление

Идея обратного распространения заключается в том, чтобы иметь набор «обучающих примеров», которые мы используем для обучения нашей сети. У каждого из них есть известный ответ, поэтому мы можем подключить их к нейронной сети и выяснить, насколько это было неправильно.

Например, при распознавании рукописного ввода у вас будет много рукописных символов наряду с тем, чем они были на самом деле. Затем нейронную сеть можно обучить с помощью обратного распространения, чтобы «научиться» распознавать каждый символ, а затем, когда он будет представлен неизвестным рукописным символом, он сможет определить, что это такое.

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

Есть и другие шаги, которые могут быть включены в учебный процесс (например, отсев), но я сосредоточусь в основном на обратном распространении, поскольку именно об этом и был этот вопрос.

Частные производные

Частная производная является производной от по некоторой переменной . фхfxfx

Например, если , , потому что является просто константой относительно . Аналогично, , потому что является просто константой относительно .ff(x,y)=x2+y2y2xffx=2xy2xй2уfy=2yx2y

Градиент функции, обозначенной , является функцией, содержащей частную производную для каждой переменной в f. В частности:f

f(v1,v2,...,vn)=fv1e1++fvnen
,

где - единичный вектор, указывающий в направлении переменной .eiv1

Теперь, как только мы вычислили для некоторой функции , если мы находимся в позиции , мы можем «скользить вниз» по в направлении .F ( v 1 , v 2 , . . . , V п ) е - F ( V 1 , V 2 , . . . , V п )ff(v1,v2,...,vn)ff(v1,v2,...,vn)

В нашем примере единичными векторами являются и , потому что и , и эти векторы указывают в направлении осей и . Таким образом, .e 1 = ( 1 , 0 ) e 2 = ( 0 , 1 ) v 1 = x v 2 = y x y f ( x , y ) = 2 x ( 1 , 0 ) + 2 у ( 0 , 1 )f(x,y)=x2+y2e1=(1,0)e2=(0,1)v1=xv2=yxyf(x,y)=2x(1,0)+2y(0,1)

Теперь, чтобы «сдвинуть» нашу функцию , скажем, мы находимся в точке . Тогда нам нужно двигаться в направлении .( - 2 , 4 ) - f ( - 2 , - 4 ) = - ( 2 - 2 ( 1 , 0 ) + 2 4 ( 0 , 1 ) ) = - ( ( - 4 , 0 ) + ( 0 , 8 ) ) = ( 4 ,f(2,4)f(2,4)=(22(1,0)+24(0,1))=((4,0)+(0,8))=(4,8)

Величина этого вектора даст нам, насколько крутой холм (более высокие значения означают, что холм круче). В этом случае у нас есть .42+(8)28.944

Gradient Descent

Адамар продукт

Произведение Адамара двух матриц , аналогично сложению матриц, за исключением того, что вместо сложения матриц пошагово, мы умножаем их поэлементно.A,BRn×m

Формально при матричном сложении есть , где такой, чтоC R n × mA+B=CCRn×m

Cji=Aji+Bji
,

Произведение Адамара , где такое, чтоC R n × mAB=CCRn×m

Cji=AjiBji

Вычисление градиентов

(Большая часть этого раздела из книги Нильсена ).

У нас есть набор обучающих выборок , где - это одна входная обучающая выборка, а - ожидаемое выходное значение этой обучающей выборки. Мы также имеем нашу нейронную сеть, состоящую из пристрастий и веса . используется для предотвращения путаницы с , и используемыми в определении сети прямой связи.(S,E)SrErWBrijk

Затем мы определяем функцию стоимости, которая берет в нашей нейронной сети и один пример обучения, и выводит, насколько хорошо это было сделано.C(W,B,Sr,Er)

Обычно используется квадратичная стоимость, которая определяется

C(W,B,Sr,Er)=0.5j(ajLEjr)2

где - выход в нашу нейронную сеть, данный входной образецaLSr

Затем мы хотим найти и для каждого узла в нашей нейронной сети с прямой связью.CwjiCbji

Мы можем назвать это градиентом в каждом нейроне, потому что мы рассматриваем и как константы, так как мы не можем изменить их, когда мы пытаемся учиться. И это имеет смысл - мы хотим двигаться в направлении относительно и что минимизирует затраты, и движение в отрицательном направлении градиента относительно и сделает это.CSrErWBWB

Для этого мы определяем как ошибку нейрона в слое .δji=Czjiji

Мы начнем с вычисления , подключив к нашей нейронной сети.aLSr

Затем мы вычисляем ошибку нашего выходного слоя, , черезδL

δjL=CajLσ(zjL)
.

Который также можно записать как

δL=aCσ(zL)
.

Далее мы находим ошибку в терминах ошибки в следующем слое , черезδiδi+1

δi=((Wi+1)Tδi+1)σ(zi)

Теперь, когда у нас есть ошибка каждого узла в нашей нейронной сети, вычислить градиент относительно наших весов и смещений легко:

Cwjki=δjiaki1=δi(ai1)T

Cbji=δji

Обратите внимание, что уравнение для ошибки выходного слоя является единственным уравнением, зависящим от функции стоимости, поэтому, независимо от функции стоимости, последние три уравнения одинаковы.

В качестве примера с квадратичной стоимостью получаем

δL=(aLEr)σ(zL)

для ошибки выходного слоя. и затем это уравнение можно вставить во второе уравнение, чтобы получить ошибку слоя :L1th

δL1=((WL)TδL)σ(zL1)
=((WL)T((aLEr)σ(zL)))σ(zL1)

которые мы можем повторить этот процесс , чтобы найти ошибку любого слоя относительно , который затем позволяет вычислять градиент весов и смещения любого узла по отношению к .CC

Я мог бы написать объяснение и доказательство этих уравнений при желании, хотя можно также найти доказательства их здесь . Тем не менее, я бы посоветовал всем, кто читает это, доказать это сами, начиная с определения и применяя правило цепи свободно.δji=Czji

Для еще несколько примеров, я сделал список некоторых функций затрат наряду с их градиентов здесь .

Градиентный спуск

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

Мы не хотим скользить вниз по склону с очень высокой скоростью, иначе мы рискуем проскользнуть ниже минимума. Чтобы предотвратить это, мы хотим иметь «размер шага» .η

Затем найдите, насколько мы должны изменить каждый вес и смещение, потому что мы уже вычислили градиент по отношению к имеющемуся у нас току.

Δwjki=ηCwjki

Δbji=ηCbji

Таким образом, наши новые веса и уклоны

wjki=wjki+Δwjki
bji=bji+Δbji

Использование этого процесса в нейронной сети только с входным слоем и выходным слоем называется дельта-правилом .

Стохастический градиентный спуск

Теперь, когда мы знаем, как выполнять обратное распространение для одного образца, нам нужен какой-то способ использовать этот процесс, чтобы «изучить» весь наш тренировочный набор.

Один из вариантов - просто выполнить обратное распространение для каждого образца в наших данных обучения, по одному за раз. Это довольно неэффективно, хотя.

Лучший подход - Стохастический градиентный спуск . Вместо того, чтобы выполнять обратное распространение для каждого образца, мы выбираем небольшую случайную выборку (называемую серией ) нашего обучающего набора, а затем выполняем обратное распространение для каждого образца в этой партии. Надежда состоит в том, что, делая это, мы фиксируем «намерение» набора данных без необходимости вычислять градиент каждой выборки.

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

Тем не менее, выполнение обратного распространения для каждого примера обучения в нашей мини-партии не является идеальным, потому что мы можем в конечном итоге «вертеться», когда обучающие образцы изменяют веса и смещения таким образом, что они взаимно компенсируют друг друга и не позволяют им добраться до минимум, к которому мы стремимся.

Чтобы предотвратить это, мы хотим перейти к «среднему минимуму», потому что есть надежда, что в среднем градиенты выборок указывают вниз по склону. Итак, после случайного выбора нашей партии мы создаем мини-партию, которая представляет собой небольшую случайную выборку нашей партии. Затем дается мини-партия с обучающими выборками, и обновляются только веса и смещения после усреднения градиентов каждой выборки в мини-партии.n

Формально мы делаем

Δwjki=1nrΔwjkri

и

Δbji=1nrΔbjri

где - вычисленное изменение веса для образца , а - вычисленное изменение смещения для образца .ΔwjkrirΔbjrir

Затем, как и раньше, мы можем обновить весовые коэффициенты с помощью:

wjki=wjki+Δwjki
bji=bji+Δbji

Это дает нам некоторую гибкость в том, как мы хотим выполнить градиентный спуск. Если у нас есть функция, которую мы пытаемся изучить с большим количеством локальных минимумов, такое поведение «шатания» на самом деле желательно, потому что это означает, что у нас гораздо меньше шансов «застрять» в одном локальном минимуме, и с большей вероятностью «выпрыгнуть» из одного локального минимума и, надеюсь, упасть в другом, который ближе к глобальным минимумам. Таким образом, мы хотим маленькие мини-партии.

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

Один из вариантов - выбрать самую большую мини-партию, учитывая всю партию как одну мини-партию. Это называется « Пакетный градиентный спуск» , поскольку мы просто усредняем градиенты пакета. Это практически никогда не используется на практике, потому что это очень неэффективно.


6

Я не имел дело с нейронными сетями уже несколько лет, но я думаю, вы найдете здесь все, что вам нужно:

Нейронные сети - систематическое введение, глава 7: алгоритм обратного распространения

Я извиняюсь за то, что не написал здесь прямой ответ, но так как я должен искать детали, которые нужно запомнить (как и вы), и учитывая, что ответ без какой-либо резервной копии может быть даже бесполезным, я надеюсь, что это нормально. Однако, если остались какие-либо вопросы, оставьте комментарий, и я посмотрю, что я могу сделать.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.