Персептроны и алгоритм обратного распространения ошибки

Алгоритм обратного распространения ошибки является одним из методов обучения многослойных нейронных сетей прямого распространения, называемых также многослойными персептронами. Многослойные персептроны успешно применяются для решения многих сложных задач.

Появление алгоритма обратного распространения ошибки стало знаковым событием в области развития нейронных сетей, так как он реализует вычислительно эффективный метод обучения многослойного персептрона. Будет неправильно утверждать, что алгоритм обратного распространения ошибки предлагает действительно оптимальное решение всех потенциально разрешимым проблем, однако он развеял пессимизм относительно обучения многослойных машин, воцарившийся в результате публикации Минского в 1969 году.

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

Рассмотрим работу алгоритма подробней. Допустим необходимо обучить следующую нейронную сеть, применив алгоритм обратного распространения ошибки:

Персептроны и алгоритм обратного распространения ошибки - student2.ru

На приведенном рисунке использованы следующие условные обозначения: каждому слою нейронной сети соответствует своя буква, например: входному слою соответствует буква А, а выходному – С;

все нейроны каждого слоя пронумерованы арабскими цифрами;

WA1-B1 – синаптический вес между нейронами A1 и B1;

OUTA1 – выход нейрона A1.

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

Персептроны и алгоритм обратного распространения ошибки - student2.ru

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

Персептроны и алгоритм обратного распространения ошибки - student2.ru

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

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

Алгоритм обратного распространения ошибки следующий:

1. Инициализировать синаптические веса маленькими случайными значениями.

2. Выбрать очередную обучающую пару из обучающего множества; подать входной вектор на вход сети.

3. Вычислить выход сети.

4. Вычислить разность между выходом сети и требуемым выходом (целевым вектором обучающей пары).

5. Подкорректировать веса сети для минимизации ошибки (как см. ниже).

6. Повторять шаги с 2 по 5 для каждого вектора обучающего множества до тех пор, пока ошибка на всем множестве не достигнет приемлемого уровня.

Операции, выполняемые шагами 2 и 3, сходны с теми, которые выполняются при функционировании уже обученной сети, т.е. подается входной вектор и вычисляется получающийся выход. Вычисления выполняются послойно. На рис. 1 сначала вычисляются выходы нейронов слоя B (слой A входной, а значит никаких вычислений в нем не происходит), затем они используются в качестве входов слоя C, вычисляются выходы OUTCN нейронов слоя C, которые и образуют выходной вектор сети OUT. Шаги 2 и 3 образуют так называемый «проход вперед», так как сигнал распространяется по сети от входа к выходу.

Шаги 4 и 5 составляют «обратный проход», здесь вычисляемый сигнал ошибки распространяется обратно по сети и используется для подстройки весов.

Рассмотрим подробней 5 шаг – корректировка весов сети. Здесь следует выделить два нижеописанных случая.

Случай 1. Корректировка синаптических весов выходного слоя

Например, для модели нейронной сети на рис. 1, это будут веса имеющие следующие обозначения: WB1-C1 и WB2-C1. Определимся, что индексом p будем обозначать нейрон, из которого выходит синаптический вес, а q – нейрон в который входит:

Персептроны и алгоритм обратного распространения ошибки - student2.ru

Введем величину Персептроны и алгоритм обратного распространения ошибки - student2.ru , которая равна разности между требуемым Tq и реальным OUTq выходами, умноженной на производную логистической функции активации (формулу логистической функции активации см. выше):

Персептроны и алгоритм обратного распространения ошибки - student2.ru

Тогда, веса выходного слоя после коррекции будут равны:

Персептроны и алгоритм обратного распространения ошибки - student2.ru

где:

i – номер текущей итерации обучения;

Wp-q – величина синаптического веса, соединяющего нейрон с нейроном ;

ŋ (греческая буква «эта») – коэффициент «скорости обучения», позволяет управлять средней величиной изменения весов;

OUTp – выход нейрона p.

Приведем пример вычислений для синаптического веса WB1-C1:

Персептроны и алгоритм обратного распространения ошибки - student2.ru

Персептроны и алгоритм обратного распространения ошибки - student2.ru

Случай 2. Корректировка синаптических весов скрытого слоя

Для модели нейронной сети на рис. 1, это будут веса соответствующие слоям A и B. Определимся, что индексом p будем обозначать нейрон из которого выходит синаптический вес, а q – нейрон в который входит (обратите внимание на появление новой переменной k):

Персептроны и алгоритм обратного распространения ошибки - student2.ru

Введем величину Персептроны и алгоритм обратного распространения ошибки - student2.ru , которая равна:

Персептроны и алгоритм обратного распространения ошибки - student2.ru

Персептроны и алгоритм обратного распространения ошибки - student2.ru

где: – сумма от 1 по N.

Тогда, веса скрытых слоев после коррекции будут равны:

Персептроны и алгоритм обратного распространения ошибки - student2.ru

Приведем пример вычислений для синаптического веса WA1-B1:

Персептроны и алгоритм обратного распространения ошибки - student2.ru

Персептроны и алгоритм обратного распространения ошибки - student2.ru

Для каждого нейрона в скрытом слое должно быть вычислено Персептроны и алгоритм обратного распространения ошибки - student2.ru и подстроены все веса, ассоциированные с этим слоем. Этот процесс повторяется слой за слоем по направлению к входу, пока все веса не будут подкорректированы.

Задание №1

Текст задания.

Используя предикаты parent(symbol, symbol), man(symbol), woman(symbol), married( symbol, symbol), записать факты, описывающие Вашу семью. Записать 6 правил вывода для любых родственных отношений в Вашей семье( например: мать, отец, сестра, брат, племянница, племянник, тетя, дядя, внучка, внук, бабушка, дедушка, двоюродная сестра, двоюродный брат и т.д.).

Исходный текст программы

domains

person=symbol

predicates

male(person)

female(person)

parents(person,person,person)

married(person,person)

grandparents(person,person,person,person,person)

sister(person,person)

brother(person,person)

ancl(person,person)

who_is_the_parents

who_is_the_married

who_is_the_sister

who_is_the_grandparents

who_is_the_brother

who_is_the_ancl

goal

who_is_the_parents,

who_is_the_married,

who_is_the_sister,

who_is_the_grandparents,

who_is_the_brother,

who_is_the_ancl.

clauses

Male("Sergey").

Male("Vladimir").

Male("Denis").

Male("Dmitriy").

Male("Aleksey").

Male("Oleg").

Female("Olga").

Female("Krestina").

Female("Marina").

Female("Elena").

Parents(dmitriy,sergey,olga).

Parents(elena,sergey,olga).

Parents(aleksey,sergey,olga).

Parents(sergey,vladimir,krestina).

Parents(olga,oleg,marina).

Married(sergey,olga).

Married(oleg,marina).

Married(vladimir,krestina).

Sister(elena,aleksey).

Brother(dmitriy,aleksey).

Grandparents(aleksey,vladimir,krestina,oleg,marina).

Grandparents(dmitriy,vladimir,krestina,oleg,marina).

Grandparents(elena,vladimir,krestina,oleg,marina).

Ancl(denis,aleksey).

who_is_the_sister if

sister(X,Y),

write(X, "is_the_sister_of" ,Y, "." ),

nl.

who_is_the_grandparents if

grandparents(X,Y,Z,V,W),

write(Y, "," ,Z, "and" ,V, "," ,W, "are_grandparents_of" ,X, "." ),

nl.

who_is_the_married if

married(X,Y),

write(X, "married" ,Y, "." ),

nl.

who_is_the_parents if

parents(X,Y,Z),

write(Y, "and" ,Z, "this_is_a_parents_of" ,X, "." ),

nl.

who_is_the_brother if

brother(X,Y),

write(X, "this_is_a_brother_of" ,Y, "." ),

nl.

who_is_the_ancl if

ancl(X,Y),

write(X, "this_is_a_ancl_of" ,Y, "." ),

nl

Скриншот результата выполнения задания

Персептроны и алгоритм обратного распространения ошибки - student2.ru

Задание №2

Текст задания.

Поменять порядок следования букв в слове на противоположный. Для разделения строки на символы использовать стандартный предикат frontchar, позволяющий разделять строку String на первый символ Char и остаток строки StringRest.

Исходный текст программы

Predicates

revStr(string,string,string)

%

CLAUSES

%

revStr(A,B,C):- frontchar (A,D,E), ! , frontchar(F,D,B),revStr(E,F,C).

revStr(_,A,A).

Goal: revStr(“abcdef”, “ “, Out)

Out=fedcba

1 Solution

Goal:revStr(“string”,””, out)

Out=gnirts

1 Solution

Скриншот результата выполнения задания

Персептроны и алгоритм обратного распространения ошибки - student2.ru

Литература

· Попов В.Г. Программирование на языке Турбо Пролог: Руководство по выполнению контрольной работы для студентов III курса специальности 230201 «информационные системы и технологии»/Филиал Урал. гос. ун-та. Челяб. ин-т путей сообщения. - Челябинск, 2008. – 76 с.

· Источник в интернете - http://www.aiportal.ru/articles/neural-networks/back-propagation.html.

Наши рекомендации