Обновление: лучшая формулировка проблемы.
Я пытаюсь понять алгоритм обратного распространения с нейронной сетью XOR как пример. Для этого случая существует 2 входных нейрона + 1 предвзятость, 2 нейрона в скрытом слое + 1 предвзятость и 1 выходной нейрон.
A B A XOR B
1 1 -1
1 -1 1
-1 1 1
-1 -1 -1
(источник: wikimedia.org)
Я использую стохастическую обратную связь.
После чтения немного больше я узнал, что ошибка устройства вывода распространена к скрытым слоям... первоначально это сбивало с толку, потому что, когда Вы добираетесь до входного слоя нейронной сети, затем каждый нейрон получает ошибочную корректировку от обоих из нейронов в скрытом слое. В частности, способ, которым распределяется ошибка, трудно схватить сначала.
Шаг 1 вычисляет вывод для каждого экземпляра входа.
Шаг 2 вычисляет ошибку между выходным нейроном (нейронами) (в нашем случае существует только один), и целевое значение (значения):
Шаг 3 мы используем ошибку от Шага 2 для вычисления ошибки для каждой скрытой единицы h:
'Вес kh' является весом между скрытой единицей h и устройством вывода k, хорошо это сбивает с толку, потому что входной единице не связали прямой вес с устройством вывода. После того, чтобы уставиться на формулу в течение нескольких часов я начал думать о том, что означает суммирование, и я начинаю приходить к выводу, что каждый входной вес нейрона, который соединяется с нейронами скрытого слоя, умножает на ошибка на выходе и подводят итог. Это - логический вывод, но формула кажется немногим путающим, так как она ясно говорит что 'вес kh' (между выходным уровнем k и скрытым слоем h).
Я понимаю все правильно здесь? Кто-либо может подтвердить это?
Что такое O (h) входного слоя? Мое понимание - то, что каждый входной узел имеет два вывода: тот, который входит в первый узел скрытого слоя и того, который входит во второй скрытый слой узла. Какой из этих двух выводов должен быть включен O(h)*(1 - O(h))
часть формулы?
В руководстве, которое вы разместили здесь, на самом деле все сделано неправильно. Я дважды проверил его по двум стандартным книгам Бишопа и двум моим рабочим реализациям. Ниже я укажу, где именно.
Важно помнить, что вы всегда ищете производные функции ошибок по единице или весу. Первые - это дельты, вторые - то, что вы используете для обновления веса.
Если вы хотите понять обратное распространение, вы должны понять правило цепочки. Все дело в цепном правиле. Если вы не знаете, как именно это работает, поищите в Википедии - это не так уж и сложно. Но как только вы разберетесь в выводах, все встанет на свои места. Обещать! :)
∂E / ∂W можно составить в ∂E / ∂o ∂o / ∂W с помощью цепного правила. ∂o / ∂W легко вычисляется, поскольку это просто производная активации / выхода устройства по весам. ∂E / ∂o - это то, что мы называем дельтами. (Я предполагаю, что E, o и W здесь являются векторами / матрицами)
У нас есть их для модулей вывода, так как именно там мы можем вычислить ошибку.(В основном у нас есть функция ошибок, которая сводится к дельте (t_k - o_k), например, для квадратичной функции ошибок в случае линейных выходов и кросс-энтропии в случае логистических выходов.)
Теперь вопрос в том, как это сделать. получаем производные по внутренним блокам? Что ж, мы знаем, что выход единицы - это сумма всех входящих единиц, взвешенных по их весу, с последующим применением передаточной функции. Итак, o_k = f (sum (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! )
Я прочитал из уравнения шага 3:
Каждый модуль имеет только один выход, но каждая связь между выходом и следующим уровнем взвешен. Таким образом, выходные данные такие же, но на принимающей стороне каждый блок получит другое значение, если вес ссылок разный. O_h всегда относится к значению этого нейрона для последней итерации. Ошибка не применяется к входному слою, поскольку по определению вход не имеет «ошибки» как таковой.
Ошибка должна вычисляться послойно, начиная со стороны вывода, поскольку нам нужны значения ошибок слоя N + 1 для вычисления слоя N. Вы правы, прямой связи между вводом и выводом при обратном распространении нет. .
Я считаю, что уравнение правильное, хотя и противоречит здравому смыслу. Что, вероятно, сбивает с толку, так это то, что при прямом распространении для каждого блока мы должны учитывать все блоки и связи слева от блока (входные значения), но для распространения ошибок (обратное распространение) нужно было учитывать блоки справа (выходные данные значение) обрабатываемой единицы.
Я не уверен, в чем ваш вопрос, но я сам прошел через это руководство и могу вас заверить, кроме одной очевидной опечатки, в этом нет ничего неправильного.
Я предполагаю, что ваш вопрос вызван тем, что вы не понимаете, как выводится дельта скрытого обратного распространения. Если это действительно ваш вопрос, рассмотрите
(источник: pandamatak.com )
Вы, вероятно, не понимаете, как автор вывел это уравнение. На самом деле это прямое применение правила многомерной цепочки. А именно (нижеследующее взято из википедии )
«Предположим, что каждый аргумент z = f (u, v) является функцией двух переменных, такой что u = h (x, y) и v = g (x, y), и что все эти функции дифференцируемы. Тогда цепное правило будет выглядеть так:
"
А теперь представьте, что расширение цепного правила индукционным аргументом до
E (z ' 1 , z ' 2 , .., z' n ) где z ' k - результат предварительной активации k-го выходного слоя, и z ' k (w ji ), то есть E является функцией z', а сам z 'является функцией w ji ( если это не имеет для вас смысла, сначала подумайте очень внимательно о том, как настраивается NN.) Применение цепного правила, непосредственно расширенного до n переменных:
δE (z ' 1 , z ' 2 , .., z ' n ) / δw ji = Σ k δE / δz' k δz ' k / δw ji
, что является наиболее важным шагом, затем автор снова применяет цепное правило, на этот раз в пределах суммы, чтобы расширить δz ' k / δw ji член, то есть
δz' k / δw ji = δz ' k / δo j δo j / δz j δz j / δw ji .
Если у вас есть трудности с пониманием правила цепочки, вам может потребоваться пройти курс многомерного исчисления или прочитать такой раздел в учебнике.
Удачи.