Параметры алгоритма обратного распространения ошибки. Обучение нейронной сети. Алгоритм обратного распространения ошибок. Сохранение работы с мемоизацией

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

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

Обучающий алгоритм обратного распространения

Сетевые конфигурации:

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


Рис. 4.1.

Эта сумма, обозначаемая , должна быть вычислена для каждого нейрона сети. После того, как величина вычислена, она модифицируется с помощью активационной функции , и получается сигнал OUT. Для алгоритмов обратного распространения обычно используется функция

(1)

Как показывает уравнение (1), эта

Прудников Иван Алексеевич
МИРЭА(МТУ)

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

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

Теоретическая часть

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

Архитектура

На рисунке 1 показана многослойная нейронная сеть с одним слоем скрытых нейронов (элементы Z).

Нейроны, представляющие собой выходы сети (обозначены Y), и скрытые нейроны могут иметь смещение(как показано на изображении). Смещение, соответствующий выходу Y k обозначен w ok , скрытому элементу Z j - V oj . Эти смещения служат в качестве весов на связях, исходящих от нейронов, на выходе которых всегда появляется 1 (на рисунке 1 они показаны, но обычно явно не отображаются, подразумеваясь). Кроме того, на рисунке 1 стрелками показано перемещение информации в ходе фазы распространения данных от входов к выходам. В процессе обучения сигналы распространяются в обратном направлении.

Описание алгоритма

Алгоритм, представленный далее, применим к нейронной сети с одним скрытым слоем, что является допустимой и адекватной ситуацией для большинства приложений. Как уже было сказано ранее, обучение сети включает в себя три стадии: подача на входы сети обучающих данных, обратное распространение ошибки и корректировка весов. В ходе первого этапа каждый входной нейрон X i получает сигнал и широковещательно транслирует его каждому из скрытых нейронов Z 1 ,Z 2 ...,Z p . Каждый скрытый нейрон затем вычисляет результат его активационной функции (сетевой функции) и рассылает свой сигнал Z j всем выходным нейронам. Каждый выходной нейрон Y k , в свою очередь, вычисляет результат своей активационной функции Y k , который представляет собой ничто иное, как выходной сигнал данного нейрона для соответствующих входных данных. В процессе обучения, каждый нейрон на выходе сети сравнивает вычисленное значение Y k с предоставленным учителем t k (целевым значением), определяя соответствующее значение ошибки для данного входного шаблона. На основании этой ошибки вычисляется σ k (k = 1,2,...m). σ k используется при распространении ошибки от Y k до всех элементов сети предыдущего слоя (скрытых нейронов, связанных с Y k), а также позже при изменении весов связей между выходными нейронами и скрытыми. Аналогичным образом вычисляется σj (j = 1,2,...p) для каждого скрытого нейрона Z j . Несмотря на то, что распространять ошибку до входного слоя необходимости нет, σj используется для изменения весов связей между нейронами скрытого слоя и входными нейронами. После того как все σ были определены, происходит одновременная корректировка весов всех связей.

Обозначения:

В алгоритме обучения сети используются следующие обозначения:

X Входной вектор обучающих данных X = (X 1 , X 2 ,...,X i ,...,X n).
t Вектор целевых выходных значений, предоставляемых учителем t = (t 1 , t 2 ,...,t k ,...,t m)
σ k Составляющая корректировки весов связей w jk , соответствующая ошибке выходного нейрона Y k ; также, информация об ошибке нейрона Y k , которая распространяется тем нейронам скрытого слоя, которые связаны с Y k .
σ j Составляющая корректировки весов связей v ij , соответствующая распространяемой от выходного слоя к скрытому нейрону Z j информации об ошибке.
a Скорость обучения.
X i Нейрон на входе с индексом i. Для входных нейронов входной и выходной сигналы одинаковы - X i .
v oj Смещение скрытого нейрона j.
Z j Скрытый нейрон j; Суммарное значение подаваемое на вход скрытого элемента Z j обозначается Z_in j: Z_in j = v oj +∑x i *v ij
Сигнал на выходе Z j (результат применения к Z_in j активационной функции) обозначается Z j: Z j = f (Z_in j)
w ok Смещение нейрона на выходе.
Y k Нейрон на выходе под индексом k; Суммарное значение подаваемое на вход выходного элемента Y k обозначается Y_in k: Y_in k = w ok + ∑ Z j *w jk . Сигнал на выходе Y k (результат применения к Y_in k активационной функции) обозначается Y k:

Функция активации

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

Другой широко распространенной активационной функцией является биполярный сигмоид с областью значений (-1, 1) и определенный как:


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

Алгоритм обучения выглядит следующим образом:

Инициализация весов (веса всех связей инициализируются случайными небольшими значениями).

До тех пор пока условие прекращения работы алгоритма неверно, выполняются шаги 2 - 9.

Для каждой пары { данные, целевое значение } выполняются шаги 3 - 8.

Распространение данных от входов к выходам:

Шаг 3.
Каждый входной нейрон (X i , i = 1,2,...,n) отправляет полученный сигнал X i всем нейронам в следующем слое (скрытом).

Каждый скрытый нейрон (Z j , j = 1,2,...,p) суммирует взвешенные входящие сигналы: z_in j = v oj + ∑ x i *v ij и применяет активационную функцию: z j = f (z_in j) После чего посылает результат всем элементам следующего слоя (выходного).

Каждый выходной нейрон (Y k , k = 1,2,...m) суммирует взвешенные входящие сигналы: Y_in k = w ok + ∑ Z j *w jk и применяет активационную функцию, вычисляя выходной сигнал: Y k = f (Y_in k).

Обратное распространение ошибки:

Каждый выходной нейрон (Y k , k = 1,2,...m) получает целевое значение - то выходное значение, которое является правильным для данного входного сигнала, и вычисляет ошибку: σ k = (t k - y k)*f " (y_in k), так же вычисляет величину, на которую изменится вес связи w jk: Δw jk = a * σ k * z j . Помимо этого, вычисляет величину корректировки смещения: Δw ok = a*σ k и посылает σ k нейронам в предыдущем слое.

Каждый скрытый нейрон (z j , j = 1,2,...p) суммирует входящие ошибки (от нейронов в последующем слое) σ_in j = ∑ σ k * w jk и вычисляет величину ошибки, умножая полученное значение на производную активационной функции: σ j = σ_in j * f " (z_in j), так же вычисляет величину, на которую изменится вес связи vij: Δv ij = a * σ j * x i . Помимо этого, вычисляет величину корректировки смещения: v oj = a * σ j

Шаг 8. Изменение весов.

Каждый выходной нейрон (y k , k = 1,2,...,m) изменяет веса своих связей с элементом смещения и скрытыми нейронами: w jk (new) = w jk (old) + Δw jk
Каждый скрытый нейрон (z j , j = 1,2,...p) изменяет веса своих связей с элементом смещения и выходными нейронами: v ij (new) = v ij (old) + Δv ij

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

Цели обратного распространения просты: отрегулировать каждый вес пропорционально тому, насколько он способствует общей ошибке. Если мы будем итеративно уменьшать ошибку каждого веса, в конце концов у нас будет ряд весов, которые дают хорошие прогнозы.

Обновление правила цепочки

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

F(x)=A(B(C(x)))

A, B, и C — на различных слоях. Пользуясь правилом цепочки, мы легко вычисляем производную f(x) по x:

F′(x)=f′(A)⋅A′(B)⋅B′(C)⋅C′(x)

Что насчёт производной относительно B ? Чтобы найти производную по B , вы можете сделать вид, что B (C(x)) является константой, заменить ее переменной-заполнителем B , и продолжить поиск производной по B стандартно.

F′(B)=f′(A)⋅A′(B)

Этот простой метод распространяется на любую переменную внутри функции, и позволяет нам в точности определить влияние каждой переменной на общий результат.

Применение правила цепочки

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

Учитывая сеть, состоящую из одного нейрона, общая потеря нейросети может быть рассчитана как:

Cost=C(R(Z(XW)))

Используя правило цепочки, мы легко можем найти производную потери относительно веса W.

C′(W)=C′(R)⋅R′(Z)⋅Z′(W)=(y^−y)⋅R′(Z)⋅X

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

Какова производная от потери по Wo ?

C′(WO)=C′(y^)⋅y^′(ZO)⋅Z′O(WO)=(y^−y)⋅R′(ZO)⋅H

А что насчет Wh ? Чтобы узнать это, мы просто продолжаем возвращаться в нашу функцию, рекурсивно применяя правило цепочки, пока не доберемся до функции, которая имеет элемент Wh .

C′(Wh)=C′(y^)⋅O′(Zo)⋅Z′o(H)⋅H′(Zh)⋅Z′h(Wh)=(y^−y)⋅R′(Zo)⋅Wo⋅R′(Zh)⋅X

И просто забавы ради, что, если в нашей сети было бы 10 скрытых слоев. Что такое производная потери для первого веса w1?

C(w1)=(dC/dy^)⋅(dy^/dZ11)⋅(dZ11/dH10)⋅(dH10/dZ10)⋅(dZ10/dH9)⋅(dH9/dZ9)⋅(dZ9/dH8)⋅(dH8/dZ8)⋅(dZ8/dH7)⋅(dH7/dZ7)⋅(dZ7/dH6)⋅(dH6/dZ6)⋅(dZ6/dH5)⋅(dH5/dZ5)⋅(dZ5/dH4)⋅(dH4/dZ4)⋅(dZ4/dH3)⋅(dH3/dZ3)⋅(dZ3/dH2)⋅(dH2/dZ2)⋅(dZ2/dH1)⋅(dH1/dZ1)⋅(dZ1/dW1)

Заметили закономерность? Количество вычислений, необходимых для расчёта производных потерь, увеличивается по мере углубления нашей сети. Также обратите внимание на избыточность в наших расчетах производных . Производная потерь каждого слоя добавляет два новых элемента к элементам, которые уже были вычислены слоями над ним. Что, если бы был какой-то способ сохранить нашу работу и избежать этих повторяющихся вычислений?

Сохранение работы с мемоизацией

Мемоизация — это термин в информатике, имеющий простое значение: не пересчитывать одно и то же снова и снова . В мемоизации мы сохраняем ранее вычисленные результаты, чтобы избежать пересчета одной и той же функции. Это удобно для ускорения рекурсивных функций, одной из которых является обратное распространение. Обратите внимание на закономерность в уравнениях производных приведённых ниже.

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

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

Примечание: термин ошибка слоя относится к производной потерь по входу в слой. Он отвечает на вопрос: как изменяется выход функции потерь при изменении входа в этот слой?

Ошибка выходного слоя

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

C′(Zo)=(y^−y)⋅R′(Zo)

Чтобы упростить запись, практикующие МО обычно заменяют последовательность (y^−y)∗R"(Zo) термином Eo . Итак, наша формула для ошибки выходного слоя равна:

Eo=(y^−y)⋅R′(Zo)

Ошибка скрытого слоя

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

Eh=Eo⋅Wo⋅R′(Zh)

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

Производная потерь по любому весу

Вернемся к нашей формуле для производной потерь по весу выходного слоя Wo .

C′(WO)=(y^−y)⋅R′(ZO)⋅H

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

C′(Wo)=Eo⋅H

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

C′(w)=CurrentLayerError⋅CurrentLayerInput

Примечание: вход относится к активации с предыдущего слоя, а не к взвешенному входу, Z.

Подводя итог

Вот последние 3 уравнения, которые вместе образуют основу обратного распространения.

Вот процесс, визуализированный с использованием нашего примера нейронной сети выше:

Обратное распространение: пример кода

def relu_prime(z): if z > 0: return 1 return 0 def cost(yHat, y): return 0.5 * (yHat - y)**2 def cost_prime(yHat, y): return yHat - y def backprop(x, y, Wh, Wo, lr): yHat = feed_forward(x, Wh, Wo) # Layer Error Eo = (yHat - y) * relu_prime(Zo) Eh = Eo * Wo * relu_prime(Zh) # Cost derivative for weights dWo = Eo * H dWh = Eh * x # Update weights Wh -= lr * dWh Wo -= lr * dWo

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

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

Обучение сети обратного распространения требует

выполнения следующих операций:

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

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

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

4. Подкорректировать веса сети так, чтобы минимизировать ошибку.

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

Операции, выполняемые шагами 1 и 2, сходны с теми, которые выполняются при функционировании уже обученной сети, т.е. подается входной вектор и вычисляется получающийся выход. Вычисления выполняются послойно. На рис.3 сначала вычисляются выходы нейронов слоя j затем они используются в качестве входов слоя k , вычисляются выходы нейронов слоя k, которые и образуют выходной вектор сети.

На шаге 3 каждый из выходов сети, которые на рис.3 обозначены OUT, вычитается из соответствующей компоненты целевого вектора, чтобы получить ошибку. Эта ошибка используется на шаге 4 для коррекции весов сети, причем знак и величина изменений весов определяются алгоритмом обучения (см. ниже).

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

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

Проход вперед. Шаги 1 и 2 могут быть выражены в векторной форме следующим образом: подается входной вектор X и на выходе получается вектор Y . Векторная пара вход-цель X и T берется из обучающего множества. Вычисления проводятся над вектором X , чтобы получить выходной векторY .

Как мы видели, вычисления в многослойных сетях выполняются слой за слоем, начиная с ближайшего к входу слоя. Величина NET каждого нейрона первого слоя вычисляется как взвешенная сумма входов нейрона. Затем активационная функция F «сжимает» NET и дает величину OUT для каждого нейрона в этом слое. Когда множество выходов слоя получено, оно является входным множеством для следующего слоя. Процесс повторяется слой за слоем, пока не будет получено заключительное множество выходов сети.

Этот процесс может быть выражен в сжатой форме с помощью векторной нотации. Веса между нейронами могут рассматриваться как матрица W . Например, вес от нейрона 8 в слое 2 к нейрону 5 слоя 3 обозначается w 8,5 . Тогда NET-вектор слоя N может быть выражен не как сумма произведений, а как произведение X и W . В векторном обозначении N = XW . Покомпонентным применением функции F к NET-вектору N получается выходной вектор О . Таким образом, для данного слоя вычислительный процесс описывается следующим выражением:

O =F(XW ) (3)

Выходной вектор одного слоя является входным вектором для следующего.

Обратный проход . Подстройка весов выходного слоя. Так как для каждого нейрона выходного слоя задано целевое значение, то подстройка весов легко осуществляется с использованием модифицированного дельта-правила. Внутренние слои называют «скрытыми слоями», для их выходов не имеется целевых значений для сравнения. Поэтому обучение усложняется.

Обучение последнего слоя Рис. 2.4

На рис. 2.4 показан процесс обучения для одного веса от нейрона р. в скрытом слое j к нейрону q в выходном слое k. Выход нейрона слоя k, вычитаясь из целевого значения (Target), дает сигнал ошибки. Он умножается на производную сжимающей функции , вычисленную для этого нейрона слоя 6, давая, таким образом, величину d.

d = OUT(1 - OUT)(Target - OUT). (2.4)

Затем d умножается на величину OUT нейрона j, из которого выходит рассматриваемый вес. Это произведение в свою очередь умножается на коэффициент скорости обучения h (обычно от 0,01 до 1,0), и результат прибавляется к весу. Такая же процедура выполняется каждого веса от нейрона скрытого слоя к нейрону в выходном слое.

Следующие уравнения иллюстрируют это вычисление:

Dw pq, k = hd q, k OUT p, j (2.5)

w pq,k (n+1) = w pq, k (n) + Dw pq, k (2.6)

где w pq, k (n) - величина веса от нейрона h в скрытом слое к нейрону q в выходном слое на шаге n (до коррекции), отметим, что индекс k относится к слою, в котором заканчивается данный вес, т.е., согласно принятому в этой книге соглашению, с которым он объединен; w pq, k (n+1) - величина веса на шаге n+1 (после коррекции), d q, k - величина d для нейрона в выходном слое k, OUT p, j - величина OUT для нейрона р в скрытом слое j.

Подстройка весов скрытого слоя . Рассмотрим один нейрон в скрытом слое, предшествующем выходному слою. При проходе вперед этот нейрон передает свой выходной сигнал нейронам в выходном слое через соединяющие их веса. Во время обучения эти веса функционируют в обратном порядке, пропуская величину d от выходного слоя назад к скрытому слою. Каждый из этих весов умножается на величину d нейрона, к которому он присоединен в выходном слое. Величина d, необходимая для нейрона скрытого слоя, получается суммированием всех таких произведений и умножением на производную сжимающей функции:

(см. рис.5)Когда значение d получено, веса, питающие первый скрытый уровень, могут быть подкорректированы с помощью уравнений (5) и (6), где индексы модифицируются в соответствии со слоем.

Обучение внутреннего слоя Рис. 2.5

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

С помощью векторных обозначений операция обратного распространения ошибки может быть, записана значительно компактнее. Обозначим множество величин d выходного слоя через D k и множество весов выходного слоя как массив W k . Чтобы получить D j , d-вектор выходного слоя, достаточно следующих двух операций:

1. Умножить d-вектор выходного слоя D k на транспонированную матрицу весов W k , соединяющую скрытый уровень с выходным уровнем.

2. Умножить каждую компоненту полученного произведения на производную сжимающей функции соответствующего нейрона в скрытом слое.

В символьной записи:

,

где оператор $ обозначает покомпонентное произведение векторов. О j - выходной вектор слоя j и I - вектор, все компоненты которого равны 1.

Паралич сети. В процессе обучения сети значения весов могут в результате коррекции стать очень большими величинами. Это может привести к тому, что все или большинство нейронов будут функционировать при очень больших значениях OUT, в области, где производная сжимающей функции очень мала. Так как посылаемая обратно в процессе обучения ошибка пропорциональна этой производной, то процесс обучения может практически замереть. В теоретическом отношении эта проблема плохо изучена. Обычно этого избегают уменьшением размера шага n, но это увеличивает время обучения. Различные эвристики использовались для предохранения от паралича или для восстановления после него, но пока что они могут рассматриваться лишь как экспериментальные.

Локальные минимумы. Обратное распространение использует разновидность градиентного спуска, т.е. осуществляет спуск вниз по поверхности ошибки, непрерывно подстраивая веса в направлении к минимуму. Поверхность ошибки сложной сети сильно изрезана и состоит из холмов, долин, складок и оврагов в пространстве высокой размерности. Сеть может попасть в локальный минимум (неглубокую долину), когда рядом имеется гораздо более глубокий минимум. В точке локального минимума все направления ведут вверх, и сеть неспособна из него выбраться. Статистические методы обучения могут помочь избежать этой ловушки, но они медленны. В предложен метод, объединяющий статистические методы машины Каши с градиентным спуском обратного распространения и приводящий к системе, которая находит глобальный минимум, сохраняя высокую скорость обратного распространения. Это обсуждается в гл. 5.

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

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

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

Описание алгоритма

Обратное распространение ошибки применяется к многослойным сетям, нейроны которых имеют нелинейность с непрерывной производной, например такую:

Нелинейность такого вида удобна простотой расчета производной:

Для обучения сети используется P пар векторов сигналов: входной вектор I и вектор, который должен быть получен на выходе сети D. Сеть, в простом случае, состоит из N слоев, причем каждый нейрон последующего слоя связан со всеми нейронами предыдущего слоя связями, с весами w [n].

При прямом распространении, для каждого слоя рассчитывается (и запоминается) суммарный сигнал на выходе слоя (S [n]) и сигнал на выходе нейрона. Так, сигнал на входе i-го нейрона n-го слоя:

Здесь w (i,j) - веса связей n-го слоя. Сигнал на выходе нейрона рассчитывается применением к суммарному сигналу нелинейности нейрона.

Сигнал выходного слоя x [N] считается выходным сигналом сети O.

По выходному сигналу сети O и сигналу D, который должен получится на выходе сети для данного входа, рассчитываться ошибка сети. Обычно используется средний квадрат отклонения по всем векторам обучающей выборки:

Для обучения сети используется градиент функции ошибки по весам сети. Алгоритм обратного распространения предполагает расчет градиента функции ошибки "обратным распространением сигнала" ошибки. Тогда частная производная ошибки по весам связей рассчитывается по формуле:

Здесь д - невязка сети, которая для выходного слоя рассчитывается по функции ошибки:

А для скрытых слоев - по невязке предыдущего слоя:

Для случая сигмоидной нелинейности и среднего квадрата отклонения как функции ошибки:

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

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

Реализация алгоритма обратного распространения ошибки на примере аппроксимации функции

Задание: Пусть имеется таблица значений аргумента (x i ) и соответствующих значений функции (f (x i )) (эта таблица могла возникнуть при вычислениях некоторой аналитически заданной функции при проведении эксперимента по выявлению зависимости силы тока от сопротивления в электрической сети, при выявлении связи между солнечной активностью и количеством обращений в кардиологический центр, между размером дотаций фермерам и объемом производства сельхозпродукции и т.п.).

В среде Matlab необходимо построить и обучить нейронную сеть для аппроксимации таблично заданной функции, i=1, 20. Разработать программу, которая реализует нейросетевой алгоритм аппроксимации и выводит результаты аппроксимации в виде графиков.

Аппроксимация заключается в том, что, используя имеющуюся информацию по f (x), можно рассмотреть аппроксимирующую функцию z (x) близкую в некотором смысле к f (x), позволяющую выполнить над ней соответствующие операции и получить оценку погрешности такой замены.

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

Задача. В среде Matlab необходимо построить и обучить нейронную сеть для аппроксимации таблично заданной функции (см. рисунок 5).

Рисунок 5. Таблица значений функции В математической среде Matlab в командном окне записываем код программы создания и обучения нейронной сети.

Для решения воспользуемся функцией newff (.) - создание "классической" многослойной НС с обучением по методу обратного распространения ошибки, т.е. изменение весов синапсов происходит с учетом функции ошибки, разница между реальными и правильными ответами нейронной сети, определяемыми на выходном слое, распространяется в обратном направлении - навстречу потоку сигналов. Сеть будет иметь два скрытых слоя. В первом слое 5 нейронов, во втором - 1. Функция активации первого слоя - "tansig" (сигмоидная функция, возвращает выходные векторы со значениями в диапазоне от - 1 до 1), второго - "purelin" (линейная функция активации, возвращает выходные векторы без изменений). Будет проведено 100 эпох обучения. Обучающая функция "trainlm" - функция, тренирующая сеть (используется по умолчанию, поскольку она обеспечивает наиболее быстрое обучение, но требует много памяти) .

Код программы:

P = zeros (1, 20);

for i = 1: 20 %создание массива P (i) = i*0.1; %входные данные (аргумент) end T= ; %входные данные (значение функции) net = newff ([-1 2.09], ,{"tansig" "purelin"}); %создание нейронной сети net. trainParam. epochs = 100; %задание числа эпох обучения net=train (net,P,T); %обучение сети y = sim (net,P); %опрос обученной сети figure (1);

plot (P,T,P,y,"o"),grid; %прорисовка графика исходных данных и функции, сформированной нейронной сетью.

Результат работы нейронной сети.

Результат обучения (см. рис.2): график показывает время обучения нейронной сети и ошибку обучения. В этом примере нейронная сеть прошла все 100 эпох постепенно обучаясь и уменьшая ошибки, дошла до 10 -2,35 (0,00455531).

Рисунок 2. Результат обучения нейронной сети

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

y=0.049x 3 +0.88x 2 -0.006x+2.1.

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

Рисунок 3. График исходных данных и функции, сформированной нейронной сетью


Рисунок 4. График функции аппроксимации