2014-11-20 2 views
1

В настоящее время я пишу сценарий обратного распространения. Я не уверен, как обновлять мои значения веса. Вот образ, чтобы сделать вещи простыми.Обратный алгоритм распространения: вычисление ошибок

enter image description here

Мой вопрос: Как вычисляется ошибка и применяется?

Я знаю, что k1 и k2 создают значения ошибок. Я знаю, что k1 и k2 дают индивидуальные значения ошибок (target-output). Однако я не знаю, будут ли они использоваться.

Должен ли я использовать среднее значение обоих значений ошибок, а затем применять это единственное значение ошибки ко всем весам?

Или я должен:

update weight Wk1j1 and Wk1j2 with the error value of k1 
update weight Wk2j1 and Wk2j2 with the error value of k2 
update weight Wj1i1 and Wj1i2 with the error value of j1 
update weight Wj2i1 and Wj2i2 with the error value of j2 

Перед тем, как приступить к съемкам, я понимаю, что я должен использовать сигмоида функцию и т.д. ЭТО НЕ ВОПРОС. Он всегда утверждает, что я должен вычислить значение ошибки для выходов, вот где я запутался.

, а затем получить чистую величину ошибки по:

((error_k1^2) + (error_k2^2) + (error_j1^2) + (error_j2^2))/2 

От Вики:

enter image description here

Как изображения состояний это верно для каждого из выходных узлов, в моем примере изображения k1 и k2. Вики.

Две строки под изображением - дельта Wh и дельта Wi. Какое значение ошибки я должен использовать (это в основном мой вопрос, какое значение ошибки я должен вычислить новый вес с)

Ответ:

http://www4.rgu.ac.uk/files/chapter3%20-%20bp.pdf Страница 3 (notad как 18) # 4

+0

Вы находитесь далеко от используемого алгоритма backprop. Я начал отвечать, а потом понял, что просто написал учебник по backprop. Я предлагаю вместо этого вы учиться у мастеров и смотрите содержимое недели 3 и 4 https://www.coursera.org/course/ml, которое не только хорошо объясняет алгоритм, но и позволяет вам реализовать его с помощью Matlab –

+0

@ NeilSlater. Я почти закончил свой сценарий обучения Matlab. Я могу загрузить его, если это будет иметь для вас больше смысла, но я сомневаюсь в этом, я решил попытаться сохранить вопрос как можно проще. - Я попробовал ваш совет, курьер не помог. Мой вопрос прост, я боюсь, что люди могут его анализировать. Я обновил другое изображение и дополнительный текст! –

+0

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

ответ

2

Обратное распространение не использует значения ошибок напрямую. То, что вы передаете обратно, является частичной производной ошибки относительно каждого элемента нейронной сети. В конце концов, это дает вам 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) выше, это использует производную от вашей передаточной функции:

enter image description here

(теперь уменьшить K на 1 для согласованности с остальной частью цикла):

3) Backpropagate дЕ/дг от верхнего слоя к DE/да для всех выходов в предыдущем слое. Это в основном предполагает суммирование по всем весам, соединяющим этот выходной нейрон с входами в верхнем слое. Вам не нужно делать это для входного слоя. Обратите внимание, как он использует значение, которое рассчитывается в (2)

enter image description here

4) (независимо друг от друга (3)) Backpropagate дЕ/дг от верхнего слоя к дЕ/Dw для всех весов подключения этот слой с предыдущим слоем (это включает в себя термин смещения):

enter image description here

Просто повторить от 2 до 4, пока вы не ЛЕ/Dw для всех ваших Weig HTS. Для более продвинутых сетей (например, повторяющихся) вы можете добавить в другие источники ошибок повторный шаг 1.

5) Теперь у вас есть весовые производные, вы можете просто их вычесть (умножить на скорость обучения), чтобы взять шаг к тому, что вы надеетесь функция ошибки минимум:

enter image description here


математику обозначение может показаться немного плотно в местах первый раз, когда вы видите это. Но если вы посмотрите несколько раз, вы увидите, что по существу есть только несколько переменных, и они индексируются некоторой комбинацией значений 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, чтобы избежать ответа на этот вопрос навсегда.

+0

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

+0

http://www4.rgu.ac.uk/files/chapter3%20-%20bp.pdf - это pdf, стр. 3 (отмечено как стр. 18), № 4 ТОЧНО, что я хотел знать. –

+0

@KarlMorrison: Вы не можете убежать от математики, если хотите * понять * backprop, а не просто реализовать его из книги рецептов кода. Мне тоже было сложно, но очень легко конвертировать в/из с Matlab. Я редактировал, чтобы включить пример. Самое главное, что каждая из частных производных выглядит страшно, но может быть просто сведена к вектору или матрице с подходящим именем. –

1

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

После того, как вы оцениваете тот факт, что для обучения нейронной сети вам нужно как-то вычислить частные производные ошибки относительно весов, backpropagation можно легко и качественно получить, сводя ее к трем основным понятиям: (1) Бокс (2) Чувствительность и (3) Обновления по весу. У вас уже есть идея, что (3) необходимо.

Я согласен с тем, что раздражающие и плотные математические формулы («Что означает этот символ снова?») Не позволяют большинству студентов наслаждаться этим путешествием. Фактически, Бернард Видро, один из пионеров в этой области, сказал это сам.

В техническом документе, который я написал ранее в этом году (без нумерованных уравнений!), Я изо всех сил старался разработать интуитивно понятную нотацию, которая упрощает подключение к символизируемой концепции. Что-то вдоль линий вызова вход I, выходной O, цель T etc.

Чтение это может помочь вам с вашим вопросом (и более): A Gentle Introduction to Backpropagation. Эта статья содержит псевдокод ("Обучение Колеса для обучения нейронных Сети ") для реализации алгоритма.

псевдокод проведет вас через следующие шаги легко понять:

  1. инициализацию весов и установить скорость обучения и критерии останова.
  2. Случайно выберите вход и соответствующую цель.
  3. Вычислить входные данные для каждого уровня и вывода конечного слоя.
  4. Вычислить компоненты чувствительности.
  5. Вычислите компоненты градиента и обновите весы.
  6. Проверьте критерии остановки. Выйдите и верните весы или петлю обратно к этапу 2.
+0

Исключительно хорошее обновление! –

Смежные вопросы