Навигация по странице:
|
Медведев В.С., Потемкин В.Г. Нейронные сети. MATLAB 6. В. Г. Потемкин
|
Название |
В. Г. Потемкин
|
Анкор |
Медведев В.С., Потемкин В.Г. Нейронные сети. MATLAB 6.doc |
Дата |
26.04.2017 |
Размер |
14.83 Mb. |
Формат файла |
|
Имя файла |
Медведев В.С., Потемкин В.Г. Нейронные сети. MATLAB 6.doc |
Тип |
Книга
#3790
|
страница |
25 из 50 |
|
8. Рекуррентные сети
В этой главе рассматриваются 2 типа рекуррентных нейронных сетей, представляющих наибольший интерес для пользователей, – это класс сетей Элмана (Elman) и класс сетей Хопфилда (Hopfield). Характерной особенностью архитектуры рекуррентной сети является наличие блоков динамической задержки и обратных связей. Это позволяет таким сетям обрабатывать динамические модели. Обратимся к описанию конкретных типов
рекуррентных нейронных сетей.
8.1. Сети Элмана
Сеть Элмана – это сеть, состоящая из двух слоев, в которой скрытый слой охвачен динамической обратной связью. Это позволяет учесть предысторию наблюдаемых процессов и накопить информацию для выработки правильной стратегии управления. Сети Элмана применяются в системах управления движущимися объектами, при построении систем технического зрения и в других приложениях. В качестве первоисточника следует рекомендовать статью Элмана [10].
По команде help elman можно получить следующую информацию об М-функциях, входящих в состав ППП Neural Network Toolbox и относящихся к построению сетей Элмана:
Elman recurrent networks
|
Рекуррентные сети Элмана
|
New networks
|
Формирование сети
|
newelm
|
Создание сети Элмана
|
Using networks
|
Работа с сетью
|
sim
init
adapt
train
|
Моделирование
Инициализация
Адаптация
Обучение
|
Weight functions
|
Функции взвешивания
|
dotprod
ddotprod
|
Скалярное произведение
Производная скалярного произведения
|
Net input functions
|
Функции накопления
|
netsum
dnetsum
|
Сумма взвешенных входов
Производная суммы взвешенных входов
|
Transfer functions
|
Функции активации
|
purelin
tansig
logsig
dpurelin
dtansig
dlogsig
|
Линейная
Гиперболический тангенс
Логистическая
Производная линейной функции
Производная гиперболического тангенса
Производная логистической функции
|
Performance functions
|
Функции оценки качества сети
|
msemsereg
dmse
dmsereg
|
Среднеквадратичная ошибка обученияСреднеквадратичная ошибка обучения
при применении регуляризации
Производная среднеквадратичной ошибки обучения
Производная среднеквадратичной ошибки обучения при применении регуляризации
|
Initialization functions
|
Функции инициализации сети
|
initlay
initnw
|
Послойная инициализация
Функция NW (Nguyen – Widrow)
|
Learning functions
|
Функции настройки параметров
|
learngd
learngdm
|
Функция настройки методом градиентного спуска
Функция настройки методом градиентного спуска
с возмущением
|
Adapt functions
|
Функции адаптации
|
adapt
|
Адаптация весов и смещений
|
Training functions
|
Функции обучения
|
traingd
traingdm
traingda
|
Градиентный спуск по правилу обратного
распространения ошибки
Градиентный спуск с возмущением
Градиентный спуск с адаптацией параметра
скорости настройки
|
Demonstrations
|
Демонстрационные примеры
|
appelm1
|
Пример рекуррентной сети Элмана
|
Архитектура
Сеть Элмана – это, как правило, двухслойная сеть с обратной связью от выхода
ко входу первого слоя (рис. 8.1).
Рис. 8.1
В качестве функций активации в сети Элмана часто используются: в скрытом, рекуррентном слое – функция гиперболического тангенса tansig, в линейном слое – функция purelin. Такое сочетание функций активации позволяет максимально точно аппроксимировать функции с конечным числом точек разрыва. Единственное требование, предъявляемое к сети, состоит в том, чтобы скрытый слой имел достаточно большое число нейронов, что необходимо для успешной аппроксимации сложных функций.
В соответствии со структурной схемой сети Элмана сформируем динамическое описание ее рекуррентного слоя в виде уравнений состояния
(8.1)
Эта рекуррентная матричная форма уравнений состояния лишний раз подчеркивает название изучаемых нейронных сетей.
Второй, линейный слой является безынерционным и описывается соотношениями
(8.2)
Ниже сеть Элмана исследуется на примере такой задачи детектирования амплитуды гармонического сигнала. Пусть известно, что на вход нейронной сети поступают выборки из некоторого набора синусоид. Требуется выделить значения амплитуд этих синусоид.
Далее рассматриваются выборки из набора двух синусоид с амплитудами 1.0 и 2.0:
p1 = sin(1:20);
p2 = sin(1:20)*2;
Целевыми выходами такой сети являются векторы
t1 = ones(1,20);
t2 = ones(1,20)*2;
Сформируем набор векторов входа и целевых выходов:
p = [p1 p2 p1 p2];
t = [t1 t2 t1 t2];
Сформируем обучающую последовательность в виде массивов ячеек:
Pseq = con2seq(p);
Tseq = con2seq(t);
Создание сети
В ППП NNT для создания сети Элмана предусмотрена М-функция newelm. Решаемая задача требует, чтобы сеть Элмана на каждом шаге наблюдения значений выборки могла выявить единственный ее параметр – амплитуду синусоиды. Это означает, что сеть должна иметь 1 вход и 1 выход:
R = 1; % Число элементов входа
S2 = 1;% Число нейронов выходного слоя
Рекуррентный слой может иметь любое число нейронов, и чем сложнее задача, тем большее количество нейронов требуется. Остановимся на 10 нейронах рекуррентного слоя:
S1 = 10; % Число нейронов рекуррентного слоя
Элементы входа для данной задачи изменяются в диапазоне от –2 до 2. Для обучения используется метод градиентного спуска с возмущением и адаптацией параметра скорости настройки, реализованный в виде М-функции traingdx:
net = newelm([–2 2],[S1 S2],{'tansig','purelin'},'traingdx');
Сеть использует следующие функции адаптации, инициализации, обучения и оценки качества:
adaptFcn: 'adaptwb'
initFcn: 'initlay'
performFcn: 'mse'
trainFcn: 'traingdx'
Слои сети Элмана имеют следующие характеристики:
net.layers{1}
ans =
dimensions: 10
distanceFcn: 'dist'
distances: [1010 double]
initFcn: 'initnw'
netInputFcn: 'netsum'
positions: [0 1 2 3 4 5 6 7 8 9]
size: 10
topologyFcn: 'hextop'
transferFcn: 'tansig'
userdata: [11 struct]
|
net.layers{2}
ans =
dimensions: 1
distanceFcn: 'dist'
distances: 0
initFcn: 'initnw'
netInputFcn: 'netsum'
positions: 0
size: 1
topologyFcn: 'hextop'
transferFcn: 'purelin'
userdata: [11 struct]
|
Скрытый слой использует функцию активации tansig, которая для сети Элмана принимается по умолчанию; инициализация весов и смещений реализуется методом NW (Nguen – Widrow) с помощью М-функции initnw. Второй слой использует линейную функцию активации purelin.
По умолчанию для настройки весов и смещений используется функция learngdm,
а для оценки качества обучения – функция mse.
Обучение сети
Для обучения сети Элмана могут быть использованы как процедура адаптации, так
и процедура обучения, реализуемые с помощью функций adapt и train соответственно.
В процессе процедуры адаптации на каждом шаге выполняются следующие действия:
моделирование сети при подаче полного набора векторов входа и вычисление ошибки сети;
вычисление приближенного градиента функционала ошибки относительно весов
и смещений методом обратного распространения ошибки;
настройка весов с использованием функции настройки, выбираемой пользователем; рекомендуется функция learngdm.
В процессе процедуры обучения на каждом цикле выполняются следующие действия:
моделирование сети при подаче последовательности входных сигналов, сравнение
с целевыми выходами и вычисление ошибки;
вычисление приближенного градиента функционала ошибки относительно весов
и смещений методом обратного распространения ошибки;
настройка весов с использованием функции настройки, выбираемой пользователем; рекомендуется функция traingdx.
Сети Элмана не обеспечивают высокой точности решения, поскольку присутствие обратной связи в рекуррентном слое не позволяет вычислить точно градиент функционала.
В дальнейшем для обучения сети Элмана используется М-функция train. Ее входными аргументами являются обучающие последовательности Pseq и Tseq, в качестве метода обучения используется метод обратного распространения ошибки с возмущением и адаптацией параметра скорости настройки. Количество циклов обучения принимается равным 1000, периодичность вывода результатов – 20 циклов, конечная погрешность обучения – 0.01:
net.trainParam.epochs = 1000;
net.trainParam.show = 25;
net.trainParam.goal = 0.01;
[net,tr] = train(net,Pseq,Tseq);
После 500 циклов обучения получим следующий график ошибки (рис. 8.2).
Рис. 8.2
Требуемая точность обучения обеспечивается за 728 циклов. Теперь можно проверить работу сформированной сети.
Проверка сети
Будем использовать для проверки сети входы обучающей последовательности:
figure(2)
a = sim(net,Pseq);
time = 1:length(p);
plot(time, t, '––', time, cat(2,a{:}))
axis([1 80 0.8 2.2]) % Рис.8.3
На рис. 8.3 приведены графики входного и выходного сигналов.
Рис. 8.3
Как следует из анализа рисунка, сеть справляется с решением задачи детектирования амплитуды на наборах обучающего множества. Однако неясно, как она будет вести себя на других наборах входа. Обладает ли построенная сеть Элмана свойством обобщения? Попробуем проверить это, выполнив следующие исследования.
Подадим на сеть набор сигналов, составленный из двух синусоид с амплитудами 1.6
и 1.2 соответственно:
p3 = sin(1:20)*1.6;
t3 = ones(1,20)*1.6;
p4 = sin(1:20)*1.2;
t4 = ones(1,20)*1.2;
pg = [p3 p4 p3 p4];
tg = [t3 t4 t3 t4];
pgseq = con2seq(pg);
figure(3)
a = sim(net,pgseq);
ime = 1:length(pg);
plot(time, tg, '––', time, cat(2,a{:}))
axis([1 80 0.8 2.2])
Результат представлен на рис. 8.4.
Рис. 8.4
На этот раз сеть хуже справляется с задачей. Сеть стремится детектировать значение амплитуды, но делает это не очень точно. Улучшенное обобщение могло быть получено, обучая сеть на большее количество амплитуд, чем только на значения 1.0 и 2.0. Использование трех или четырех гармонических сигналов с различными амплитудами может привести к намного лучшему датчику амплитуд.
Читатель может продолжить изучение сетей Элмана, используя программу appelm1. Сделав копию этой программы, можно продолжить эксперименты, увеличивая количество нейронов в рекуррентном слое или длительность, а также количество входных наборов.
|
|
|