Адаптация нейронных сетей
Статические сети. Воспользуемся следующей моделью однослойной линейной сети с двухэлементным вектором входа, значения которого находятся в интервале [–1 1], и нулевым параметром скорости настройки:
% Формирование однослойной статической линейной сети с двумя входами
% и нулевым параметром скорости настройки
net = newlin([–1 1;–1 1],1, 0, 0);
Требуется адаптировать параметры сети так, чтобы она формировала линейную зависимость вида
Последовательный способ. Рассмотрим случай последовательного представления обучающей последовательности. В этом случае входы и целевой вектор формируются в виде массива формата cell:
% Массив ячеек векторов входа
P = {[–1; 1] [–1/3; 1/4] [1/2; 0] [1/6; 2/3]};
T = {–1 –5/12 1 1}; % Массив ячеек векторов цели
P1 = [P{:}], T1=[T{:}] % Переход от массива ячеек к массиву double
P1 =
–1 –0.33333 0.5 0.16667
1 0.25 0 0.66667
T1 = –1 –0.41667 1 1
Сначала зададим сеть с нулевыми значениями начальных весов и смещений:
net.IW{1} = [0 0]; % Присваивание начальных весов
net.b{1} = 0; % Присваивание начального смещения
В ППП NNT процедуры адаптации реализуются на основе метода adapt. Для управления процедурой адаптации используется свойство net.adaptFcn, которое задает метод адаптации; для статических сетей по умолчанию применяется метод adaptwb, который позволяет выбирать произвольные функции для настройки весов и смещений. Функции настройки весов и смещений задаются свойствами net.inputWeights{i, j}.learnFcn, net.layerWeights{i, j}.learnFcn и net.biases{i, j}.learnFcn.
Выполним 1 цикл адаптации сети с нулевым параметром скорости настройки:
% Последовательная адаптация сети с входами P и целями T
[net1,a,e] = adapt(net,P,T);
% net1-новая сеть, a-выход, e-ошибка обучения
В этом случае веса не модифицируются, выходы сети остаются нулевыми, поскольку параметр скорости настройки равен нулю и адаптации сети не происходит. Погрешности совпадают со значениями целевой последовательности
net1.IW{1, 1}, a, e
ans = 0 0
a = [0] [0] [0] [0]
e = [–1] [–0.41667] [1] [1]
Зададим значения параметров скорости настройки и весов входа и смещения:
net.IW{1} = [0 0]; % Присваивание начальных весов
net.b{1} = 0; % Присваивание начального смещения
net.inputWeights{1,1}.learnParam.lr = 0.2;
net.biases{1,1}.learnParam.lr = 0;
Нулевое значение параметра скорости настройки для смещения обусловлено тем, что выявляемая зависимость не имеет постоянной составляющей.
Выполним 1 цикл настройки:
[net1,a,e] = adapt(net,P,T);
net1.IW{1, 1}, a, e
ans = 0.34539 –0.069422
a = [0] [–0.11667] [0.11] [–0.091833]
e = [–1] [–0.3] [0.89] [1.0918]
Теперь выполним последовательную адаптацию сети в течение 30 циклов:
% Последовательная адаптация сети с входами P и целями T за 30 циклов
net = newlin([–1 1;–1 1],1, 0, 0);
net.IW{1} = [0 0]; % Присваивание начальных весов
net.b{1} = 0; % Присваивание начального смещения
Зададим значения параметров скорости настройки для весов входа и смещения:
net.inputWeights{1,1}.learnParam.lr = 0.2;
net.biases{1,1}.learnParam.lr = 0;
P = {[–1; 1] [–1/3; 1/4] [1/2; 0] [1/6; 2/3]}; % Массив векторов входа
T = {–1 –5/12 1 1}; % Массив векторов цели
for i=1:30,
[net,a{i},e{i}] = adapt(net,P,T);
W(i,:)=net.IW{1,1};
end
mse(cell2mat(e{30})) % Среднеквадратичная ошибка адаптации
ans = 0.0017176
W(30,:) % Веса после 30 циклов
ans = 1.9199 0.925
cell2mat(a{30})
ans = –0.9944 –0.40855 0.95663 0.93005
cell2mat(e{30})
ans = –0.0055975 –0.0081125 0.043367 0.069947
Построим графики зависимости значений выходов сети и весовых коэффициентов в зависимости от числа итераций (рис. 3.1):
subplot(3,1,1)
plot(0:30,[[0 0 0 0];cell2mat(cell2mat(a'))],'k') % Рис 3.1,a
xlabel(''), ylabel('Выходы a(i)'),grid
subplot(3,1,2)
plot(0:30,[[0 0]; W],'k') % Рис 3.1,б
xlabel(''), ylabel('Веса входов w(i)'),grid
subplot(3,1,3)
for i=1:30, E(i) = mse(e{i}); end
semilogy(1:30, E,'+k') % Рис. 3.1,в
xlabel(' Циклы'), ylabel('Ошибка'),grid
Рис. 3.1
Первый выход тот же, что и при нулевом значении параметра скорости настройки, так как до предъявления сети первого входа никаких модификаций не происходит. Второй выход отличается, так как параметры сети были модифицированы. Веса продолжают изменяться при подаче нового входа. Если сеть соответствует задаче, корректно заданы обучающие последовательности, начальные условия и параметр скорости настройки, то в конечном счете погрешность может быть сведена к нулю.
В этом можно убедиться, изучая процесс адаптации, показанный на рис. 3.1. Условие окончания адаптации определяется погрешностью приближения к целевому вектору; в данном случае мерой такой погрешности является среднеквадратичная ошибка mse(e{i}), которая должна быть меньше 0.015.
На рис. 3.1, а показаны выходы нейронов в процессе адаптации сети, на рис. 3.1, б – коэффициенты восстанавливаемой зависимости, которые соответствуют элементам вектора весов входа, а на рис. 3.1, в – ошибка обучения. Как следует из анализа графиков, за 12 шагов получена ошибка обучения 1.489e–3.
Предлагаем читателю самостоятельно убедиться, что для исследуемой зависимости обучающие последовательности вида
P = {[–1; 1] [–1/2; 1/2] [1/2; –1/2] [1; –1]}; % Массив векторов входа
T = {–1 –1/2 1/2 1}; % Массив векторов цели
не являются представительными.
Групповой способ. Рассмотрим случай группового представления обучающей последовательности. В этом случае входы и целевой вектор формируются в виде массива формата double.
P = [–1 –1/3 1/2 1/6; 1 1/4 0 2/3];
T = [–1 –5/12 1 1];
Используется та же модель статической сети с теми же требованиями к погрешности адаптации. При обращении к М-функции adapt по умолчанию вызываются функции adaptwb и learnwh; последняя выполняет настройку параметров сети на основе алгоритма WH, реализующего правило Уидроу – Хоффа (Widrow – Hoff).
Основной цикл адаптации сети с заданной погрешностью выглядит следующим образом:
% Групповой способ адаптации сети с входами P и целями T
net3 = newlin([–1 1;–1 1],1, 0, 0.2);
net3.IW{1} = [0 0]; % Присваивание начальных весов
net3.b{1} = 0; % Присваивание начального смещения
net3.inputWeights{1,1}.learnParam.lr = 0.2;
P = [–1 –1/3 1/2 1/6; 1 1/4 0 2/3];
T = [–1 –5/12 1 1];
EE = 10; i=1;
while EE > 0.0017176
[net3,a{i},e{i},pf] = adapt(net3,P,T);
W(i,:) = net3.IW{1,1};
EE = mse(e{i});
ee(i)= EE;
i = i+1;
end
Результатом адаптации при заданной погрешности являются следующие значения коэффициентов линейной зависимости, значений выходов нейронной сети, приближающихся к значениям желаемого выхода, а также среднеквадратичная погрешность адаптации:
W(63,:)
ans = 1.9114 0.84766
cell2mat(a(63))
ans = –1.003 –0.36242 1.0172 0.94256
EE = mse(e{63})
EE = 0.0016368
mse(e{1})
ans = 0.7934
Процедура адаптации выходов и параметров нейронной сети иллюстрируется рис. 3.2.
subplot(3,1,1)
plot(0:63,[zeros(1,4); cell2mat(a')],'k') % Рис.3.2,a
xlabel(''), ylabel('Выходы a(i)'),grid
subplot(3,1,2)
plot(0:63,[[0 0]; W],'k') % Рис.3.2,б
xlabel(''), ylabel('Веса входов w(i)'),grid
subplot(3,1,3)
semilogy(1:63, ee,'+k') % Рис.3.2,в
xlabel('Циклы'), ylabel('Ошибка'),grid
Рис. 3.2
Как следует из анализа графиков, для достижения требуемой точности адаптации требуется 12 шагов. Сравнивая рис. 3.2 и 3.1, можно убедиться, что существует различие в динамике процедур адаптации при последовательном и групповом представлении данных.
Динамические сети. Эти сети характеризуются наличием линий задержки, и для них последовательное представление входов является наиболее естественным.
Последовательный способ. Обратимся к линейной модели нейронной сети с одним входом и одним элементом запаздывания. Установим начальные условия на линии задержки, а также для весов и смещения равными 0, а параметр скорости настройки равным 0.5:
net = newlin([–1 1],1,[0 1],0.5);
Pi = {0}; % Начальное условие для элемента запаздывания
net.IW{1} = [0 0]; % Значения весов
net.biasConnect = 0; % Значение смещения
Чтобы применить последовательный способ адаптации, представим входы и цели как массивы ячеек:
P = {–1/2 1/3 1/5 1/4}; % Вектор входа
T = { –1 1/6 11/15 7/10}; % Вектор цели
Попытаемся приспособить сеть для формирования нужного выхода на основе следующего соотношения:
y(t) = 2p(t) + p(t–1).
Используем для этой цели М-функцию adapt и основной цикл адаптации сети с заданной погрешностью, как это уже было описано выше:
EE = 10; i = 1;
while EE > 0.0001
[net,a{i},e{i},pf] = adapt(net,P,T);
W(i,:)=net.IW{1,1};
EE = mse(e{i});
ee(i) = EE;
i = i+1;
end
Сеть адаптировалась за 22 цикла. Результатом адаптации при заданной погрешности являются следующие значения коэффициентов линейной зависимости, значений выходов нейронной сети, приближающихся к значениям желаемого выхода, а также среднеквадратичная погрешность адаптации:
W(22,:)
ans = 1.983 0.98219
a{22}
ans = [–0.98955] [0.17136] [0.72272] [0.69177]
EE
EE = 7.7874e–005
Построим графики зависимости выходов системы и весовых коэффициентов от числа циклов обучения (рис. 3.3):
subplot(3,1,1)
plot(0:22,[zeros(1,4); cell2mat(cell2mat(a'))],'k') % Рис.3.3,a
xlabel(''), ylabel('Выходы a(i)'),grid
subplot(3,1,2)
plot(0:22,[[0 0]; W],'k') % Рис.3.3,б
xlabel(''), ylabel('Веса входов w(i)'),grid
subplot(3,1,3)
semilogy(1:22,ee,'+k') % Рис.3.3,в
xlabel('Циклы'), ylabel('Ошибка'),grid
Рис. 3.3
На рис. 3.3, а показаны выходы нейронов в процессе адаптации сети, а на рис. 3.3, б – коэффициенты восстанавливаемой зависимости, которые соответствуют элементам вектора весов входа.
Групповой способ представления обучающего множества для адаптации динамических систем не применяется.
Обучение нейронных сетей
Статические сети. Воспользуемся рассмотренной выше моделью однослойной линейной сети с двухэлементным вектором входа, значения которого находятся в интервале [–1 1], и нулевым параметром скорости настройки, как это было для случая адаптации:
% Формирование однослойной статической линейной сети с двумя входами
% и нулевым параметром скорости настройки
net = newlin([–1 1;–1 1],1, 0, 0);
net.IW{1} = [0 0]; % Значения весов
net.b{1} = 0; % Значения смещений
Требуется обучить параметры сети так, чтобы она формировала линейную зависимость вида
Последовательный способ. Для этого представим обучающую последовательность в виде массивов ячеек
P = {[–1; 1] [–1/3; 1/4] [1/2; 0] [1/6; 2/3]}; % Массив векторов входа
T = {–1 –5/12 1 1}; % Массив векторов цели
Теперь все готово к обучению сети. Будем обучать ее с помощью функции train в течение 30 циклов.
В этом случае для обучения и настройки параметров сети используются функции trainwb и learnwh соответственно.
% Параметр скорости настройки весов
net.inputWeights{1,1}.learnParam.lr = 0.2;
net.biases{1}.learnParam.lr = 0; % Параметр скорости настройки смещений
net.trainParam.epochs = 30; % Число циклов обучения
net1 = train(net,P,T);
Параметры сети после обучения равны следующим значениям:
W = net1.IW{1}
W = 1.9214 0.92599
y = sim(net1, P)
y = [–0.99537] [–0.40896] [0.96068] [0.93755]
EE = mse([y{:}]–[T{:}])
EE = 1.3817e–003
Зависимость величины ошибки обучения от числа циклов обучения приведена на рис. 3.4.
Рис. 3.4
Это тот же самый результат, который был получен для группового способа адаптации с использованием функции adapt.
Групповой способ. Для этого представим обучающую последовательность в виде массивов формата double array:
P = [–1 –1/3 1/2 1/6; 1 1/4 0 2/3];
T = [–1 –5/12 1 1];
net1 = train(net,P,T);
TRAINWB, Epoch 0/10, MSE 0.793403/0.
TRAINWB, Epoch 10/10, MSE 0.00243342/0.
TRAINWB, Maximum epoch reached.
Параметры сети после обучения равны следующим значениям:
W = net1.IW{1}
W = 1.9214 0.92599
y = sim(net1, P)
y = –0.99537 –0.40896 0.96068 0.93755
EE = mse(y–T)
EE = 1.3817e–003
Этот результат полностью совпадает с результатом последовательного обучения этой же сети.
Динамические сети. Обучение динамических сетей выполняется аналогичным образом с использованием метода train.
Последовательный способ. Обратимся к линейной модели нейронной сети с одним входом и одним элементом запаздывания.
Установим начальные условия для элемента запаздывания, весов и смещения равными 0, а параметр скорости настройки равным 0.5:
net = newlin([–1 1],1,[0 1],0.5);
Pi = {0}; % Начальное условие для элемента запаздывания
net.IW{1} = [0 0]; % Значения весов
net.biasConnect = 0; % Значение смещения
net.trainParam.epochs = 22;
Чтобы применить последовательный способ обучения, представим входы и цели как массивы ячеек:
P = {–1/2 1/3 1/5 1/4}; % Вектор входа
Обучим сеть формировать нужный выход на основе соотношения y(t) = 2p(t) + p(t–1), тогда
T = { –1 1/6 11/15 7/10}; % Вектор цели
Используем для этой цели М-функцию train:
net1 = train(net, P, T, Pi);
Параметры сети после обучения равны следующим значениям:
W = net1.IW{1}
W = 1.9883 0.98414
y = sim(net1, P)
y = [–0.99414] [0.17069] [0.7257] [0.6939]
EE = mse([y{:}]–[T{:}])
EE = 3.6514e–005
График зависимости ошибки обучения от числа циклов приведен на рис. 3.5.
Рис. 3.5
Предлагаем читателю самостоятельно выполнить сравнение результатов обучения с результатами адаптации этой же сети.
Групповой способ представления обучающей последовательности для обучения динамических систем не применяется.
Методы обучения
Как только начальные веса и смещения нейронов установлены пользователем или с помощью датчика случайных чисел, сеть готова для того, чтобы начать процедуру ее обучения. Сеть может быть обучена решению различных прикладных задач – аппроксимации функций, идентификации и управления объектами, распознавания образов, классификации объектов и т. п. Процесс обучения требует набора примеров ее желаемого поведения – входов p и желаемых (целевых) выходов t; во время этого процесса веса и смещения настраиваются так, чтобы минимизировать некоторый функционал ошибки. По умолчанию в качестве такого функционала для сетей с прямой передачей сигналов принимается среднеквадратичная ошибка между векторами выхода a и t. Ниже обсуждается несколько методов обучения для сетей с прямой передачей сигналов.
При обучении сети рассчитывается некоторый функционал, характеризующий качество обучения:
, (3.1)
где J – функционал; Q – объем выборки; M – число слоев сети; q – номер выборки; SM – число нейронов выходного слоя; – вектор сигнала на выходе сети; – вектор желаемых (целевых) значений сигнала на выходе сети для выборки с номером q.
Затем с помощью того или иного метода обучения определяются значения настраиваемых параметров (весов и смещений) сети, которые обеспечивают минимальное значение функционала ошибки. Большинство методов обучения основано на вычислении градиента функционала ошибки по настраиваемым параметрам.
Не нашли, что искали? Воспользуйтесь поиском по сайту:
©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.
|