Лабораторная работа №4, Цель работы, Теоретическое введение - Интеллектуальные информационные системы

Обучение нейронной сети

Цель работы

Изучить принципы проектирования и обучения нейронных сетей с помощью пакета Matlab. Изучить на практике работу алгоритма обратного распространения ошибки.

Теоретическое введение

Способность к обучению является фундаментальным свойством мозга. В контексте искусственных нейронных сетей (ИНС) процесс обучения может рассматриваться как настройка архитектуры сети и весов связей для эффективного выполнения специальной задачи. Обычно нейронная сеть должна настроить веса связей по имеющейся обучающей выборке. Функционирование сети улучшается по мере итеративной настройки весовых коэффициентов. Свойство сети обучаться на примерах делает их более привлекательными по сравнению с системами, которые следуют определенной системе правил функционирования, сформулированной экспертами.

Правило коррекции по ошибке. При обучении с учителем для каждого входного примера задан желаемый выход d. Реальный выход сети y может не совпадать с желаемым. Принцип коррекции по ошибке при обучении состоит в использовании сигнала (d-y) для модификации весов, обеспечивающей постепенное уменьшение ошибки. Обучение имеет место только в случае, когда перцептрон ошибается. Известны различные модификации этого алгоритма обучения.

Свойства алгоритма обратного распространения ошибки (Back Propagation - ВР)

ВР - это итеративный градиентный алгоритм обучения многослойной НС без обратных связей. В такой сети на каждый нейрон первого слоя подаются все компоненты входного вектора. Все выходы скрытого слоя m подаются на слой m+1 и т. д., т. е. сеть является полносвязной.

Согласно методу наименьших квадратов, минимизируемой целевой функцией ошибки нейронной сети является величина:

(13)

Где - реальное выходное состояние нейрона у выходного слоя нейронной сети при подаче на ее входы k-го образа; dJ, k - требуемое выходное состояние этого нейрона.

Суммирование ведется по всем нейронам выходного слоя и по всем обрабатываемым сетью образам. Минимизация методом градиентного спуска обеспечивает подстройку весовых коэффициентов следующим образом:

(14)

Где wIj - весовой коэффициент синаптической связи, соединяющей i-й нейрон слоя (q-1) с j-м нейроном слоя q; з - коэффициент скорости обучения, 0 < з <1.

В соответствии с правилом дифференцирования сложной функции:

, (15)

Где sJ - взвешенная сумма входных сигналов нейрона j, т. е. аргумент активационной функции. Так как производная активационной функции должна быть определена на всей оси абсцисс, то функция единичного скачка и прочие активационные функции с неоднородностями не подходят для рассматриваемых нейронных сетей. В них применяются такие гладкие функции, как гиперболический тангенс или классический сигмоид с экспонентой. Например, в случае гиперболического тангенса:

(16)

Третий множитель ?sJ / ?wIj равен выходу нейрона предыдущего слоя.

Что касается первого множителя в (23), он легко раскладывается следующим образом:

(17)

Здесь суммирование по r выполняется среди нейронов слоя (q+1). Введя новую переменную

(18)

Получим рекурсивную формулу для расчетов величин слоя q из величин более старшего слоя (q+1):

(19)

Для выходного слоя:

(20)

Теперь можно записать (14) в раскрытом виде:

(21)

Иногда для придания процессу коррекции весов некоторой инерционности, сглаживающей резкие скачки при перемещении по поверхности целевой функции, (21) дополняется значением изменения веса на предыдущей итерации:

(22)

Где µ - коэффициент инерционности; t - номер текущей итерации.

Таким образом, полный алгоритм обучения нейронной сети с помощью процедуры обратного распространения строится следующим образом.

ШАГ 1. Подать на входы сети один из возможных образов и в режиме обычного функционирования нейронной сети, когда сигналы распространяются от входов к выходам, рассчитать значения последних. Напомним, что:

(23)

Где L - число нейронов в слое (q-1) с учетом нейрона с постоянным выходным состоянием +1, задающего смещение; - i-й вход нейрона j слоя q.

(24)

Где f(*)-сигмоид,

, (25)

Где хR - r-я компонента вектора входного образа.

ШАГ 2. Рассчитать д(Q) для выходного слоя по формуле (20).

Рассчитать по формуле (21) или (22) изменения весов ?w(Q) слоя Q.

ШАГ 3. Рассчитать по формулам (20) и (21) соответственно д(Q) и ?w(Q) для всех остальных слоев, q = (Q - 1)...1.

ШАГ 4. Скорректировать все веса в нейронной сети:

(26)

ШАГ 5. Если ошибка сети существенна, перейти на шаг 1. В противном случае - конец.

Сети на шаге 1 попеременно в случайном порядке предъявляются все тренировочные образы, чтобы сеть, образно говоря, не забывала одни по мере запоминания других.

Некоторые трудности, связанные с применением данного алгоритма в процедуре обучения НС.

Медленная сходимость процесса обучения. Сходимость ВР строго доказана для дифференциальных уравнений, т. е. для бесконечно малых шагов в пространстве весов. Но бесконечно малые шаги означают бесконечно большое время обучения. Следовательно, при конечных шагах сходимость алгоритма обучения не гарантируется.

Переобучение. Высокая точность, получаемая на обучающей выборке, может привести к неустойчивости результатов на тестовой выборке. Чем лучше сеть адаптирована к конкретным условиям (к обучающей выборке), тем меньше она способна к обобщению и экстраполяции. В этом случае сеть моделирует не функцию, а шум, присутствующий в обучающей выборке. Это явление называется переобучением. Кардинальное средство борьбы с этим недостатком - использование подтверждающей выборки примеров, которая используется для выявления переобучения сети. Ухудшение характеристик НС при работе с подтверждающей выборкой указывает на возможное переобучение. Напротив, если ошибка последовательно уменьшается при подаче примеров из подтверждающегося множества, сеть продолжает обучаться. Недостатком этого приема является уменьшение числа примеров, которое можно использовать в обучающем множестве (уменьшение размера обучающей выборки снижает качество работы сети). Кроме того, возникает проблема оптимального разбиения исходных данных на обучающую, тестовую и подтверждающую выборку. Даже при случайной выборке разные разбиения базы данных дают различные оценки.

"Ловушки", создаваемые локальными минимумами. Детерминированный алгоритм обучения типа ВР не всегда может обнаружить глобальный минимум или выйти из него. Одним из способов, позволяющих обходить "ловушки", является расширение размерности пространства весов за счет увеличения скрытых слоев и числа нейронов скрытого слоя. Другой способ - использование эвристических алгоритмов оптимизации, один из которых - генетический алгоритм.

Для создания и обучения нейронных сетей достаточно хорошо себя зарекомендовал пакет Matlab.

Описание функций пакета Matlab

Функция NEWFF - сеть прямой передачи FF

Синтаксис:

Net = newff(PR,[S1 S2...SNI],{TF1 TF2...TFNI},btf, blf, pf)

Описание:

Функция newff предназначена для создания многослойных нейронных сетей прямой передачи сигнала с заданными функциями обучения и настройки, которые используют метод обратного распространения ошибки.

Функция net = newff(PR, [SI S2 ... SN1], (TF1 TF2 ... TFN1}, btf, blf, pf) формирует многослойную нейронную сеть.

Входные аргументы:

PR - массив размера Rx2 минимальных и максимальных значений для R векторов входа;

Si - количество нейронов в слое i;

TFi - функция активации слоя i, по умолчанию tansig;

Btf - обучающая функция, реализующая метод обратного распространения, по умолчанию trainlm;

Blf - функция настройки, реализующая метод обратного распространения, по умолчанию learngdm;

Pf - критерий качества обучения, по умолчанию mse.

Выходные аргументы:

Net - объект класса network object многослойной нейронной сети.

Свойства сети:

Функциями активации могут быть любые дифференцируемые функции, например tansig, logsig или purelin.

Обучающими функциями могут быть любые функции, реализующие метод обратного распространения: trainlm, trainbfg, trainrp, traingd и др.

Функция trainlm является обучающей функцией по умолчанию, поскольку обеспечивает максимальное быстродействие, но требует значительных ресурсов памяти. Если ресурсы памяти недостаточны, воспользуйтесь следующими рекомендациями:

    * установите значение свойства net. trainParam. mеm_reduc равным 2 или более, что снизит требования к памяти, но замедлит обучение; * воспользуйтесь обучающей функцией trainbfg, которая работает медленнее, но требует меньшей памяти, чем М-функция trainlm; * перейдите к обучающей функции trainrp, которая работает медленнее, но требует меньшей памяти, чем М-функция trainbifg.

Функциями настройки могут быть функции, реализующие метод обратного распространения: learngd, learngdm.

Критерием качества обучения может быть любая дифференцируемая функция: mse, msereg.

TRAIN - обучение нейронной сети

Синтаксис:

[net, TR] = train(net, P, T, Pi, Ai)

[net, TR] = train(net, P, T, Pi, Ai, VV, TV)

Описание:

Функция [net, TR] = train(net, P, T, Pi, Ai) является методом для объектов класса network object, который реализует режим обучения нейронной сети. Эта функция характеризуется следующими входными и выходными аргументами.

Входные аргументы:

Net - имя нейронной сети;

Р - массив входов;

Т - вектор целей, по умолчанию нулевой вектор;

Pi - начальные условия на линиях задержки входов, по умолчанию нулевой вектор;

Ai - начальные условия на линиях задержки слоев, по умолчанию нулевой вектор.

Выходные аргументы:

Net - структура объекта network object после обучения;

TR - характеристики процедуры обучения:

TR. timesteps - длина последней выборки;

TR. perf - значения функции качества на последнем цикле обучения.

Заметим, что входной аргумент Т используется только при наличии целевых выходов. Аргументы Pi и Pf используются только в случае динамических сетей, имеющих линии задержки на входах или в слоях.

Примеры функций активации:

Logsig - сигмоидальная;

Purelin - линейная;

Tansig - гиперболический тангенс;

Пример 1:

Создать нейронную сеть, чтобы обеспечить следующее отображение последовательности входа Р в последовательность целей Т:

Р= [0 1 2 3 4 5 6 7 8 9 10];

Т= [0 1 2 3 4 3 2 1 2 3 4];

Архитектура нейронной сети: двухслойная сеть с прямой передачей сигнала; скрытый слой - 5 нейронов с функцией активации tansig; выходной слой - 1 нейрон с функцией активации purelin; диапазон изменения входа [0 10].

Net = newff([0 10],[5 1],{'tansig' 'purelin'});

Обучим сеть в течение 50 циклов:

Net. trainParam. epochs = 50;

Net = train(net, P, T);

Выполним моделирование сети и построим графики сигналов выхода и цели.

Y = sim(net, P);

Plot(P, Т, P, Y)

Пример 2:

Построить нейронную сеть для распознавания индексов на почтовых конвертах.

Для этих целей будет использована двухслойная структура нейронной сети. На вход будут подаваться цвета пикселей, из которых состоит изображение цифры. Количество входных нейронов - это произведение ширины изображения цифры на высоту. Выходных нейронов будет столько, сколько предполагается распознавать образов: 10 цифр - 10 образов.

1) Предположим, что распознаваться будут цифры, применяемые на конвертах.

распознаваемые символы

Рис. 17 Распознаваемые символы

В данном случае их размеры: 11 на 21 пикселей.

2) Загружаем эти символы в Matlab.

File=>Import data

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

A0=A0.cdata; % запишем этот массив в переменную. И так для каждой цифры. Необходимо привести массив к нужному виду.

A0=double(a0); %привести к нужному типу

A0=a0'; %транспонировать

A0=reshape(a0,231,1); % перевести в вектор-столбец. 231 = 11*21 пикселей.

Таким образом создан вектор-столбец цифры ноль. Указанные набор действий повторяется для каждой цифры.

интерфейс загрузки изображений в matlab

Рис. 18 Интерфейс загрузки изображений в Matlab

Далее создадим общий массив цифр: это основная часть обучающей выборки.

Chisla=[a0 a1 a2 a3 a4 a5 a6 a7 a8 a9];

Далее создается массив ожидаемых результатов - "целей" target. В нем по главной диагонали будут 1, все остальные - нули. Размер: 10*10 (так как мы распознаем 10 цифр).

Target=eye(10);

3) Затем создается программа просмотра полученных цифр. File=>New=>M-file.

Ниже приведено содержимое созданного файла-функции myplotchar. m:

Function myplotchar(c)

X1 = [-0.5 -0.5 +0.5 +0.5 -0.5];

Y1 = [-0.5 +0.5 +0.5 -0.5 -0.5];

X2 = [x1 +0.5 +0.5 -0.5];

Y2 = [y1 +0.5 -0.5 +0.5];

Newplot;

Plot(x1*11.6+2.5,y1*21.6+10.5,'m');

Axis([-1.5 11.5 -0.5 21.5]);

Axis('equal')

Axis off

Hold on

For i=1:length(c)

X = rem(i-1,11)-2.5;

Y = 6-floor((i-1)/11)+14.5;

Plot(x2*(1-c(i))+x, y2*(1-c(i))+y);

End

Hold off

%--------------------------------------------------

Результат вызова команды myplotchar(a1):

результат вызова команды myplotchar(a1)

Рис.19 Результат вызова команды myplotchar(a1)

4) Создается программа, генерирующая описанную выше нейронную сеть и обучающая ее.

Содержимое m-файла letter. m:

[R, Q]=size(chisla); % берем размерности массива чисел R=231, Q=10

[S2,Q]=size(target); %S2- количество вариантов: 10 распознаваемых чисел

S1=231; % в первом слое должно быть столько нейронов, сколько пикселей в подаваемом изображении

Net=newff(minmax(chisla),[S1 S2],{'logsig' 'purelin'},'traingdx'); % %minmax(chisla) определит минимальное и максимальное число в %каждой строке. Поскольку у нас только черный и белый цвет в %изображениях цифр, минимальное число подаваемое на вход сети - 0, %максимальное - 1.

Net. LW{2,1}=net. LW{2,1}*0.01;

Net. b{2}=net. b{2}*0.01;

Gensim(net) %генерируем сеть

P=chisla; % входные сигналы обучающей выборки

T=target; % ожидаемые выходные сигналы

Net. performFcn='sse';

Net. trainParam. goal=0.01; % требуемая ошибка обучения

Net. trainParam. show=20;

Net. trainParam. epochx=5000; % количество тактов обучения

Net. trainParam. mc=0.95;

[net, tr]=train(net, P, T); % запуск процесса обучения

Далее следует набрать в командной строке matlab команду letter.

>>letter

модель полученной сети

Рис. 20 Модель полученной сети

график процесса обучения нейронной сети

Рис. 21 График процесса обучения нейронной сети

5) Следует проверить насколько уверенно построенная нейронная сеть распознает примеры из обучающей выборки (команда sim (<имя сети>,<имя примера>)):

результаты работы сети по распознаванию примеров из обучающей выборки

Рис. 22 Результаты работы сети по распознаванию примеров из обучающей выборки

Сеть уверенно распознает символы.

6) Следует проверить способность распознавания сетью зашумленных символов.

>> simvol=chisla(:,1)+randn(231,1)*0.2; % создаем символ, %зашумленный на 20%

>> myplotchar(simvol) % нарисуем его

вид зашумленного символа

Рис. 23 Вид зашумленного символа "0"

>> rez=sim(net, noisyJ)

Rez =

    0.9161 -0.0745 0.0615 0.0218 0.0713 0.0061 -0.0039 0.0102 0.0453 0.0233

Сеть распознала символ "0".

Похожие статьи




Лабораторная работа №4, Цель работы, Теоретическое введение - Интеллектуальные информационные системы

Предыдущая | Следующая