Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Медведев В.С., Потемкин В.Г. Нейронные сети. MATLAB 6.doc
Скачиваний:
857
Добавлен:
07.03.2016
Размер:
15.55 Mб
Скачать

3.3. Алгоритмы обучения

Алгоритмы обучения, как правило, функционируют пошагово; и эти шаги принято называть эпохамиилициклами. На каждом цикле на вход сети последовательно подаются все элементы обучающей последовательности, затем вычисляются выходные значения сети, сравниваются с целевыми и вычисляется функционал ошибки. Значения функционала, а также его градиента используются для корректировки весов и смещений, после чего все действия повторяются. Начальные значения весов и смещений выбираются случайным образом, а процесс обучения прекращается, когда выполнено определенное количество циклов либо когда ошибка достигнет некоторого малого значения или перестанет уменьшаться.

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

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

3.3.1. Градиентные алгоритмы обучения Алгоритм gd

Алгоритм 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.