АЛГОРИТМ ВРМ
Самое лучшее, что можно придумать для того, чтобы понять, как
он
работает - это взять калькулятор и ВРУЧНУЮ просчитать
пару шагов этого
алгоритма, задавшись простейшей конфигурацией
сети. Вот это мы с вами сейчас
и проделаем.
Вначале кратенько и вразумительно дадим само описание
алгоритма обратного распространения:
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
Внимание! При перепечатке ссылка на источник обязательна!
|