Подтвердить что ты не робот

Понимание прокрутки нейронной сети

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

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

4b9b3361

Ответ 1

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

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

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

∂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 (sum (w_kj * o_j, для всех j)) = > ∂o_k/∂o_j = f '(sum (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!)

Ответ 2

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

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

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

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

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

alt text

alt text "

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

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.

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

Удачи.

Ответ 3

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

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

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

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

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