Понимание нейронной сети обратного распространения - PullRequest
44 голосов
/ 03 февраля 2010

Обновление: лучшая формулировка вопроса.

Я пытаюсь понять алгоритм обратного распространения с нейронной сетью XOR в качестве примера. Для этого случая есть 2 входных нейрона + 1 смещение, 2 нейрона в скрытом слое + 1 смещение и 1 выходной нейрон.

 A   B  A XOR B
 1    1   -1
 1   -1    1
-1    1    1
-1   -1   -1

A sample XOR neural network
(источник: wikimedia.org )

Я использую стохастическое обратное распространение .

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

Шаг 1 рассчитать выход для каждого экземпляра ввода.
Шаг 2 вычислить погрешность между выходными нейронами (в нашем случае только один) и целевым значением (ями):
Step 2
Шаг 3 Мы используем ошибку из шага 2 для вычисления ошибки для каждой скрытой единицы h:
Step 3

«Вес kh» - это вес между скрытым блоком h и выходным блоком k, и это сбивает с толку, поскольку у входного блока нет прямого веса, связанного с выходным блоком. Посмотрев на формулу в течение нескольких часов, я начал думать о том, что означает суммирование, и я начинаю приходить к выводу, что вес каждого входного нейрона, который соединяется с нейронами скрытого слоя, умножается на ошибку вывода и суммируется , Это логичный вывод, но формула выглядит немного запутанной, поскольку в ней четко указано «вес kh» (между выходным слоем k и скрытым слоем h).

Я правильно все здесь понимаю? Кто-нибудь может это подтвердить?

Что такое O (h) входного слоя? Насколько я понимаю, каждый входной узел имеет два выхода: один, который входит в первый узел скрытого слоя, а другой - во второй узел скрытого слоя. Какой из двух выходов должен быть подключен к O(h)*(1 - O(h)) части формулы?
Step 3

Ответы [ 3 ]

30 голосов
/ 04 февраля 2010

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

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

Если вы хотите понять обратное распространение, вы должны понять правило цепочки. Это все о цепном правиле здесь. Если вы не знаете, как это работает, проверьте в Википедии - это не так сложно. Но как только вы понимаете выводы, все становится на свои места. Обещай! :)

∂E / ∂W можно составить из ∂E / ∂o ∂o / ∂W через правило цепочки. ∂o / ∂W легко вычисляется, так как это всего лишь производная активации / вывода единицы по весам. ∂E / ∂o - это то, что мы называем дельтами. (Я предполагаю, что E, o и W здесь векторы / матрицы)

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

Вопрос теперь в том, как получить производные для внутренних единиц? Что ж, мы знаем, что выходная единица представляет собой сумму всех входящих единиц, взвешенных по их весам, и последующего применения передаточной функции. Итак, o_k = f (сумма (w_kj * o_j, для всех j)).

Итак, что мы делаем, получаем o_k относительно o_j. Поскольку delta_j = ∂E / ∂o_j = ∂E / ∂o_k ∂o_k / ∂o_j = delta_k ∂o_k / o_j. Итак, учитывая delta_k, мы можем вычислить delta_j!

Давайте сделаем это. o_k = f (сумма (w_kj * o_j, для всех j)) => ∂o_k / ∂o_j = f '(сумма (w_kj * o_j, для всех j)) * w_kj = f' (z_k) * w_kj.

В случае сигмоидальной передаточной функции это становится z_k (1 - z_k) * w_kj. ( Вот ошибка в учебнике, автор говорит o_k (1 - o_k) * w_kj! )

8 голосов
/ 22 июня 2010

Я не уверен, в чем ваш вопрос, но я сам прошел этот урок и могу заверить вас, кроме одной очевидной опечатки, в этом нет ничего неправильного.

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

alt text
(источник: pandamatak.com )

Вы, вероятно, не понимаете, как автор вывел это уравнение. На самом деле это прямое применение правила многомерной цепочки. А именно, (то, что следует из wikipedia )

"Предположим, что каждый аргумент z = f (u, v) является функцией с двумя переменными, такой что u = h (x, y) и v = g (x, y), и что все эти функции дифференцируемы Тогда правило цепочки будет выглядеть так:

alt text

alt text «

Теперь представьте, что расширение цепного правила с помощью аргумента индукции до

Е (г '* +1031 * 1 * 1 032 *, г' 2 , .., г ' N ) где z ' k - выход предварительной активации k-го слоя, и z ' k (w ji ), то есть E является функцией от z', а сам z 'является функцией от w ji ( если это поначалу не имеет смысла , то очень тщательно подумайте о том, как настраивается NN.) Применение правила цепочки, непосредственно расширенного до n переменных:

* +1049 * & Delta; Е (г ' 1 * 1 051 *, г' * +1052 * 2 , .., г ' N ) * +1056 * / & delta; w ji = & Sigma; k & delta; E / & delta; z ' k & delta; z ' k / & delta; w ji

, что является наиболее важным шагом, автор затем снова применяет правило цепочки, на этот раз в пределах суммы, чтобы расширить & delta; z ' k / & delta; w ji срок, то есть

& delta; z ' k / & delta; w ji = & delta; z' k * 1 099 * / * * & 1 101 дельты; о J & Delta; O J / & Delta; г J * +1113 * & Delta; г J / & Delta;. Ш джи * * +1121

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

Удачи.

3 голосов
/ 04 февраля 2010

Что я прочитал из уравнения шага 3:

  1. O_h = последний вывод этой скрытой единицы (O_h на входном слое - это фактическое входное значение)
  2. w_kh = вессоединения между этой скрытой единицей и единицей следующего слоя (к выходу)
  3. delta_k = ошибка единицы следующего слоя (к выводу, такая же единица, как предыдущая пуля)

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

Ошибка должна рассчитываться слой за слоем, начиная со стороны вывода, поскольку нам нужна ошибкаЗначения слоя N + 1 для расчета слоя N. Вы правы, прямой связи между входом и выходом в обратном распространении нет.

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

...