Обратное распространение не использует значения ошибок напрямую. То, что вы передаете обратно, является частичной производной ошибки относительно каждого элемента нейронной сети. В конце концов, это дает вам dE/dW для каждого веса, и вы делаете небольшой шаг в направлении этого градиента.
Чтобы сделать это, вы должны знать:
Значение активации каждого нейрона (удерживаются от при выполнении подачи вперед расчета)
Математической формы функции ошибки (например, это может быть сумма квадратов разницы). Ваш первый набор производных будет dE/da для выходного слоя (где E - ваша ошибка, а a - выход нейрона).
Математическая форма функции активации или переноса нейронов.Здесь вы узнаете, почему мы используем сигмовидной потому ду/дх функции сигмовидной может быть удобно выражено в терминах значения активации, ду/дх = у * (1 - у) - это быстро и также означает, что вам не нужно хранить или пересчитывать взвешенную сумму.
Пожалуйста, обратите внимание, что я собираюсь использовать различные обозначения из вас, потому что ваши этикетки сделать это трудно выразить общую форму обратного распространения.
В моей записи:
надиндексов в скобках (к) или (к + 1) идентифицировать слой в сети.
Есть N нейронов в слое (к), индексированные с индексом я
Есть М нейроны в слое (K + 1), индексированные с индексом j
Сумма входов в нейрон - z
Выход нейрона
Вес составляет Вт IJ и соединяет я в слое (к) к г J в слое (k + 1). Примечание W 0j - это вес для сроков смещения, и иногда вам нужно включить это, хотя ваша диаграмма не показывает входы или веса смещения.
В приведенных выше обозначениях, общий вид алгоритма обратного распространения представляет собой процесс из пяти этапов:
1) Вычислить начальную DE/да для каждого нейрона в выходном слое. Где E - ваше значение ошибки, а a - это активация нейрона. Это полностью зависит от вашей функции ошибки.
Затем для каждого слоя (начать с к = максимум, ваш выходной слой)
2) Backpropagate DE/да к дЕ/дг для каждого нейрона (где это ваше нейрон и z - сумма всех входов к нему, включая смещение) внутри слоя. В дополнение к необходимости знать значение из (1) выше, это использует производную от вашей передаточной функции:
(теперь уменьшить K на 1 для согласованности с остальной частью цикла):
3) Backpropagate дЕ/дг от верхнего слоя к DE/да для всех выходов в предыдущем слое. Это в основном предполагает суммирование по всем весам, соединяющим этот выходной нейрон с входами в верхнем слое. Вам не нужно делать это для входного слоя. Обратите внимание, как он использует значение, которое рассчитывается в (2)
4) (независимо друг от друга (3)) Backpropagate дЕ/дг от верхнего слоя к дЕ/Dw для всех весов подключения этот слой с предыдущим слоем (это включает в себя термин смещения):
Просто повторить от 2 до 4, пока вы не ЛЕ/Dw для всех ваших Weig HTS. Для более продвинутых сетей (например, повторяющихся) вы можете добавить в другие источники ошибок повторный шаг 1.
5) Теперь у вас есть весовые производные, вы можете просто их вычесть (умножить на скорость обучения), чтобы взять шаг к тому, что вы надеетесь функция ошибки минимум:
математику обозначение может показаться немного плотно в местах первый раз, когда вы видите это. Но если вы посмотрите несколько раз, вы увидите, что по существу есть только несколько переменных, и они индексируются некоторой комбинацией значений i, j, k. Кроме того, с Matlab вы можете легко выразить векторы и матрицы. Так, например, это то, что весь процесс может выглядеть для изучения одного примера обучения:
clear ; close all; clc; more off
InputVector = [ 0.5, 0.2 ];
TrainingOutputVector = [ 0.1, 0.9 ];
learn_rate = 1.0;
W_InputToHidden = randn(3, 2) * 0.6;
W_HiddenToOutput = randn(3, 2) * 0.6;
for i=1:20,
% Feed-forward input to hidden layer
InputsPlusBias = [1, InputVector];
HiddenActivations = 1.0 ./ (1.0 + exp(-InputsPlusBias * W_InputToHidden));
% Feed-forward hidden layer to output layer
HiddenPlusBias = [ 1, HiddenActivations ];
OutputActivations = 1.0 ./ (1.0 + exp(-HiddenPlusBias * W_HiddenToOutput));
% Backprop step 1: dE/da for output layer (assumes mean square error)
OutputActivationDeltas = OutputActivations - TrainingOutputVector;
nn_error = sum(OutputActivationDeltas .* OutputActivationDeltas)/2;
fprintf('Epoch %d, error %f\n', i, nn_error);
% Steps 2 & 3 combined:
% Back propagate dE/da on output layer to dE/da on hidden layer
% (uses sigmoid derivative)
HiddenActivationDeltas = (OutputActivationDeltas * W_HiddenToOutput(2:end,:)'
.* (HiddenActivations .* (1 - HiddenActivations)));
% Steps 2 & 4 combined (twice):
% Back propagate dE/da to dE/dW
W_InputToHidden_Deltas = InputsPlusBias' * HiddenActivationDeltas;
W_HiddenToOutput_Deltas = HiddenPlusBias' * OutputActivationDeltas;
% Step 5: Alter the weights
W_InputToHidden -= learn_rate * W_InputToHidden_Deltas;
W_HiddenToOutput -= learn_rate * W_HiddenToOutput_Deltas;
end;
Как написано это стохастический градиентный спуск (вес изменяющие один раз в примере обучения), и, очевидно, только учится один пример обучения ,
Извинения за обозначение псевдо-математики в местах. В отличие от Math Overflow, Stack Overflow не имеет простой встроенной математики LaTex. Я пропустил некоторые из выводов/объяснений для шагов 3 и 4, чтобы избежать ответа на этот вопрос навсегда.
Вы находитесь далеко от используемого алгоритма backprop. Я начал отвечать, а потом понял, что просто написал учебник по backprop. Я предлагаю вместо этого вы учиться у мастеров и смотрите содержимое недели 3 и 4 https://www.coursera.org/course/ml, которое не только хорошо объясняет алгоритм, но и позволяет вам реализовать его с помощью Matlab –
@ NeilSlater. Я почти закончил свой сценарий обучения Matlab. Я могу загрузить его, если это будет иметь для вас больше смысла, но я сомневаюсь в этом, я решил попытаться сохранить вопрос как можно проще. - Я попробовал ваш совет, курьер не помог. Мой вопрос прост, я боюсь, что люди могут его анализировать. Я обновил другое изображение и дополнительный текст! –
Ваш вопрос, к сожалению, не прост, у вас, кажется, есть некоторые неправильные идеи о распространении назад, и их исправление означает возврат к основам. Поскольку я почти написал ответ в любом случае, я решил загрузить его. –