Алгоритм GD, или алгоритм градиентного спуска, используется для такой корректировки весов и смещений, чтобы минимизировать функционал ошибки, т. е. обеспечить движение по поверхности функционала в направлении, противоположном градиенту функционала по настраиваемым параметрам.
Рассмотрим двухслойную нейронную сеть прямой передачи сигнала с сигмоидальным и линейным слоями для обучения ее на основе метода обратного распространения ошибки (рис. 3.7):
net = newff([–1 2; 0 5],[3,1],{'tansig','purelin'},'traingd');
Рис. 3.7
Последовательная адаптация. Чтобы подготовить модель сети к процедуре последовательной адаптации на основе алгоритма GD, необходимо указать ряд параметров. В первую очередь это имя функции настройки learnFcn, соответствующее алгоритму градиентного спуска, в данном случае это М-функция learngd:
net.biases{1,1}.learnFcn = 'learngd';
net.biases{2,1}.learnFcn = 'learngd';
net.layerWeights{2,1}.learnFcn = 'learngd';
net.inputWeights{1,1}.learnFcn = 'learngd';
С функцией learngd связан лишь один параметр скорости настройки lr. Текущие приращения весов и смещений сети определяются умножением этого параметра на вектор градиента. Чем больше значение параметра, тем больше приращение на текущей итерации. Если параметр скорости настройки выбран слишком большим, алгоритм может стать неустойчивым; если параметр слишком мал, то алгоритм может потребовать длительного счета.
|
|
При выборе функции learngd по умолчанию устанавливается следующее значение
параметра скорости настройки:
net.layerWeights{2,1}.learnParam
ans =
lr: 0.01
Увеличим значение этого параметра до 0.2:
net.layerWeights{2,1}.learnParam.lr = 0.2;
Мы теперь почти готовы к обучению сети. Осталось задать обучающее множество. Это простое множество входов и целей определим следующим образом:
p = [–1 –1 2 2;0 5 0 5];
t = [–1 –1 1 1];
Поскольку используется последовательный способ обучения, необходимо преобразовать массивы входов и целей в массивы ячеек:
p = num2cell(p,1);
t = num2cell(t,1);
Последний параметр, который требуется установить при последовательном обучении, – это число проходов net.adaptParam.passes:
net.adaptParam.passes = 50;
Теперь можно выполнить настройку параметров, используя процедуру адаптации:
[net,a,e] = adapt(net,p,t);
Чтобы проверить качество обучения, после окончания обучения смоделируем сеть:
a = sim(net,p)
a = [–1.02] [–0.99624] [1.0279] [1.0021]
mse(e)
ans = 5.5909e–004
Групповое обучение. Для обучения сети на основе алгоритма GD необходимо использовать М-функцию traingd взамен функции настройки learngd. В этом случае нет необходимости задавать индивидуальные функции обучения для весов и смещений, а достаточно указать одну обучающую функцию для всей сети.
Вновь создадим ту же двухслойную нейронную сеть прямой передачи сигнала с сигмоидальным и линейным слоями для обучения по методу обратного распространения ошибки:
|
|
net = newff([–1 2; 0 5],[3,1],{'tansig','purelin'},'traingd');
Функция traingd характеризуется следующими параметрами, заданными по умолчанию:
net.trainParam
ans =
epochs: 100
goal: 0
lr: 1.0000e–002
max_fail: 5
min_grad: 1.0000e–010
show: 25
time: Inf
Здесь epochs – максимальное количество циклов (эпох) обучения; goal – предельное
значение критерия обучения; lr – параметр скорости настройки; max_fail – максимально допустимый уровень превышения ошибки контрольного подмножества по сравнению
с обучающим; min_grad – минимальное значение градиента; show – интервал вывода информации, измеренный в циклах; time – предельное время обучения.
Установим новые значения параметров обучения, зададим обучающую последовательность в виде массива double и выполним процедуру обучения:
net.trainParam.show = 50;
net.trainParam.lr = 0.05;
net.trainParam.epochs = 300;
net.trainParam.goal = 1e–5;
p = [–1 –1 2 2;0 5 0 5];
t = [–1 –1 1 1];
net = train(net,p,t); % Рис.3.8
На рис. 3.8 приведен график изменения ошибки в зависимости от числа выполненных циклов обучения. Этот график строится автоматически при исполнении функции train.
Рис. 3.8
Для проверки качества обучения промоделируем спроектированную сеть:
a = sim(net,p)
a = –1.0042 –0.9958 0.9987 0.9984
Более тщательно ознакомиться с методом градиентного спуска можно с помощью
демонстрационной программы nnd12sd1, которая иллюстрирует работу алгоритма GD.