АЛГОРИТМ ВРМ
 
Самое лучшее, что можно придумать для того, чтобы понять, как
он работает - это взять калькулятор и ВРУЧНУЮ просчитать
пару шагов этого алгоритма, задавшись простейшей конфигурацией
сети. Вот это мы с вами сейчас и проделаем.
Вначале кратенько и вразумительно дадим само описание
алгоритма обратного распространения:
 
1) прочитать входной образец и соответствующий ему выходной образец;
2) для входного слоя установить совокупный ввод каждого элемента
равным соответствующему элементу входного вектора.
Значение вывода каждого элемента ВХОДНОГО слоя установить равным вводу;
3) для элементов первого скрытого слоя вычислить совокупный ввод и вывод;
 
 
4) повторить шаг 3 для всех последующих слоев;
5) попадает ли разность между целевым выходным образцом и
реальным выводом сети в допустимые рамки? Нет - продолжить,
Да - перейти к шагу (10);
6) для каждого ВЫХОДНОГО элемента вычислить его ошибку;
 
 
7) для последнего скрытого слоя вычислить ошибку каждого элемента;
 
 
8) повторить шаг 7 для всех остальных скрытых слоев.
9) для всех слоев обновить значения весов каждого элемента;
 
 
10) прочитать следующий входной образец, и перейти к шагу 1;
 
ТЕПЕРЬ НАШ ПРИМЕР РАССЧЕТА:
 
Зададимся простейшей сетью со случайно выбранными коэффициентами,
и такими же случайными входными и выходными значениями.
 
 
То есть таблица весов для этой сети будет выглядеть так:
 
W[1,1,1] = 0;  W[1,1,2] = 0.6;  W[1,1,3] = 0.7; 
W[2,1,1] = 0.3; W[2,2,1] = 0.4; W[2,3,1] = 0.5;
W[1,2,2] = 0.1; W[1,2,3] = 0.2;
Здесь первый индекс обозначает номер слоя. Второй индекс - номер нейрона
в этом слое, а третий - номер нейрона в следующем слое, к которому идет связь.
 
1) для первого слоя вывод устанавливаем равным вводу
 
net[1,1] = 1;  net [1,2] = 0.73; 
oj[1,1] = 1;   oj[1,2] = 0.73;
 
Здесь net[ ] - обозначаем совокупный ввод для данного нейрона
То есть берем выход каждого нейрона предидущего слоя, перемножаем
на коэффициент его связи и плюсуем с такими же выходами, помноженными на
коэффициенты связей от других нейронов. Всё это вместе обозначаем net[ ].
oj[ ] - совокупный вывод, уже после прохождения через внутреннюю функцию
активации. Например oj[2,1] - обозначает выход нейрона номер 1 во 2-м слое.
 
2) для последующих слоев
 
net[2,1] = 1;
net [2,2] = (net[1,1] · 0.6) + (net [1,2] ·0.1) = 0.6·0.073 = 0.673;
net [2,3] = (net [ 1,1]· 0.7) + (net [1,2] · 0.2) = 0.7 + 0.146 = 0.846;
oj [2,1] = 1;
oj [2,2] = 1/(1+exp(-net [2,2] )) = 0.662;
oj[2,3] = 1/(1+exp(-net [ 2,3] )) = 0.6997 ~ 0.7;
net [ 3,1] = (1·0.3) + (oj[ 2,2 ] · 0.4) + (oj[ 2,3] ·0,5) = 0.915;
oj [ 3,1] = 1/(1+exp( -0.915)) = 0.714;
 
3) считаем ошибки ( обратная волна)
 
Здесь sigm[ слой, нейрон] - обозначает ошибку соответствующего нейрона в
соответствующем слое.
 
sigm[3,1] = (0.75 - 0.714) · 0.714· (1-0.714) = 0.007;
sigm[2,2] = oj [2,2] · (1-oj[2,2]) · (0.007·0.4) = 0.0006;
sigm[2,3] = oj [2,3] · (1-oj [2,3]) · (0.007·0.5) = 0.0007;
sigm[1,2] = oj [1,2] · (1-oj [1,2]) · ((sigm [2,2]·W[1,2,2] ) + ( sigm [2,3] · W [1,2,3] ))
= 0.73 · (1-0.73) · (0.006 · 0.1) + (0.0007 · 0.2)) = 0.0012;
 
4) корректируем веса
 
DW[2,2,1] = 0.25 · 0.007 · oj [2,2] = 0.0012;              (здесь DW - изменение веса)
DW[2,3,1] = 0.25 · 0.007 · oj [ 2,3] = 0.0012;
DW [1,2,2] = 0.25 · sigm[2,2]  · oj[1,2] = 0.25 · 0.0006 · 0.73 = 0.00012;
DW [1,2,3] = 0.25 · sigm[2,3] · oj [1,2] = 0.00013;

и итоговая таблица скорректированных весов:
 
W [2,2,1] = W [2,2,1] + DW[2,2,1]  = 0.4 + 0.001 = 0.4011;
W [2,3,1] = W [2,3,1] + DW[2,3,1]  = 0.5 + 0.0012 = 0.5012;
W [1,2,2] = 0.1 + DW [1,2,2] = 0.10012;
W [1,2,3] = 0.2 + 0.00012 = 0.20013;
Обратите внимание на следующие :
 
1) Черненькие нейроны смещения нужны обязательно - без этого
ничего работать не будет. Их вход и выход всегда равны 1.
Но в последнем слое нейрона смещения нет, так как нет последующего слоя.
Смещать нечего. Это вообще как бы псевдонейроны, так как к ним
нет входящих связей. Они вообще изображаются только для удобства
восприятия.
2) Перед тем, как запихивать данные в сеть, их нужно нормализовать, то есть
привести к промежутку между 0 и 1.
3) В качестве функции активации здесь используется сигмоида, но в общем
случае она может быть какой угодно - например гиперболический тангенс, или
логическая, и т. д.
4) Параметр альфа (вместе с дельта W ) в пункте 9 алгоритма не очень то и нужен - сеть прекрасно работает и без него. Он называется инерционный член, и выполняет
функцию гироскопа. То есть помогает быстрее выбираться из мелких колдобин
на поверхности ошибок и глубже застревать в крупных. То есть в конечном итоге
помогает быстрее найти глобальный минимум. 


Kennobi   22.06.05
 
 
Внимание! При перепечатке ссылка на источник обязательна!