Рекуррентные сети на базе персептрона

Содержание

Введение

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

Ниже рассматриваются два вида сетей данного типа.

Сеть RMLP

Данные сети получаются из однонаправленного многослойного персептрона MLP введением обратных связей с задержкой с выхода на вход сети, поэтому они получили название RMLP (Recurrent MultiLayer Perceptron). На рисунке дана структурная схема двухуровневой сети с одним входом, одним выходом и L нейронами в первом слое нейронов ("1-L-1").



Входной вектор сети имеет следующий вид:

[1,xk,xk-1, ...,xk-(N-1),yk-1,yk-2, ...,yk-M]T,
где(N-1) - количество задержек входного сигнала, M - количество задержек выходного сигнала.

Пусть все нейроны имеют сигмоидальную функцию активации. Тогда для каждого нейрона первого слоя

ui=sum[j=0:N+M](w(1)ij*xj), vi=f(ui),

а для единственного выходного нейрона

g=sum[i=0:L](w(2)i*vi)=sum[i=0:L](w(2)i*f(ui)), y=f(g).

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

Ek(W)=(1/2)*(yk-dk)2.

Найдем компоненты градиента целевой функции сначала для выходного слоя

дEk(W)/дw(2)n = (yk-dk)*dyk/dw(2)n
= (yk-dk)*df(gk)/dgk*dgk/dw(2)n
= (yk-dk)*df(gk)/dgk*sum[i=0:L](d(w(2)i*vki)/dw(2)n).

Ясно, что производная dw(2)i/dw(2)n равна 1 при n=i и равна 0 во всех остальных случаях. Поэтому

дEk(W)/дw(2)n = (yk-dk)*df(gk)/dgk*(vkn+sum[i=0:L](w(2)i*dvki/dw(2)n)).

Причем

dvki/dw(2)n = df(uki)/duki*sum[j=0:N+M](w(1)ij*dxj/dw(2)n)
= df(uki)/duki*sum[j=1:M](w(1)i,N+j*dyk-j/dw(2)n)

поскольку первые N компонентов входного вектора от весов сети никак не зависят.

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

dyk/dw(2)n = df(gk)/dgk*(vkn+sum[i=0:L](w(2)i*df(uki)/duki*sum[j=1:M](w(1)i,N+j*dyk-j/dw(2)n))).

Для расчета производной в первые M моментов от начала обучения полагают

dy0/dw(2)n = dy-1/dw(2)n = ... = dy-M+1/dw(2)n = 0.

Аналогичным образом получается выражение для производной выходного сигнала yk по весу нейрона входного слоя w(1)nm

dyk/dw(1)nm = df(gk)/dgk*sum[i=1:L](w(2)i*df(uki)/duki*sum[j=1:L](w(1)i,N+j*dyk-j/dw(2)n)+delthain*x m)),
где delthain - дельта Кронекера. Напомним, delthain=1 тогда и только тогда, когда i=n, для всех остальных сочетаний i и n дельта Кронекера равна 0.

После получения выражений для производных алгоритм обучения сети RMLP можно сформулировать следующим образом.

  1. Инициализировать все весовые коэффициенты сети, положить k=1.
  2. Для текущего момента k рассчитать все сигналы сети.
  3. Рассчитать значения dyk/dw(2)n и dyk/dw(1)nm для всех взвешенных связей сети.
  4. Уточнить все веса, используя формулы
    w(2)n<-w(2)n-nu*(yk-dk)*dyk/dw(2)n
    и
    w(1)nm<-w(1)nm-nu*(yk-dk)*dyk/dw(1)nm,
    где nu - коэффициент обучения.
  5. Увеличить k на 1 и перейти к п. 2.

Представленный алгоритм работает в режиме "оффлайн", принимая обучающие пары <xk, dk> и оперативно корректируя значения весов.

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



Деление выходного сигнала реального объекта на масштабный коэффициент S необходимо для приведения диапазона изменения этого сигнала к диапазону выходного сигнала сети -1...1 (при использовании биполярной сигмоидальной функции активации).

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

Рекуррентная сеть Эльмана

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



Здесь vl, l=1, 2, ..., L - выходные сигналы первого слоя. Вектор возмущения для момента k имеет следующий вид:

Xk=[1, xk1, xk2, ...,xkN, vk-11, vk-12, ...,vk-1L]T.

Для нейронов первого слоя

ukl=sum[j=0:N+L](w(1)lj*xkj), vkl=f1(ukl).

Для нейронов выходного слоя

gki=sum[l=0:L](w(2)il*vkl), yki=f2(gki).

Целевая функция имеет стандартный вид

Ek(W)=(1/2)*sum[i=1:M]((yki-dki)2)=(1/2)*sum[i=1:M]((eki)2).

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

дEk(W)/дw(2)nm = sum[i=1:M](eki*df2(gki)/dgki*dgki/dw(2)nm)
= sum[i=1:M](eki*df2(gki)/dgki*sum[l=0:L](d(w(2)il*vkl)/dw(2)nm))
= sum[i=1:M](eki*df2(gki)/dgki*sum[l=0:L](dvkl/dw(2)nm*w(2)il+dw(2)il/dw(2)nm*vkl)).

Поскольку в сети Эльмана обратных связей с выходного слоя нет, то dvkl/dw(2)nm=0 и выражение упрощается.

дEk(W)/дw(2)nm = sum[i=1:M](eki*df2(gki)/dgki*sum[l=0:L](dw(2)il/dw(2)nm*vkl)).

С учетом того, производная dw(2)il/dw(2)nm равна 1 при n=i и m=l, и равна 0 при всех остальных сочетаниях значений i и l, в итоге имеем

дEk(W)/дw(2)nm=ekn*df2(gkn)/dgkn*vkm.

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

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

дEk(W)/дw(1)nm = sum[i=1:M](eki*df2(gki)/dgki*sum[l=0:L](d(w(2)il*vkl)/dw(1)nm)) = sum[i=1:M](eki*df2(gki)/dgki*sum[l=0:L](w(2)il*dvkl/dw(1)nm)).

Отдельно определим

dvkl/w(1)nm = df1(ukl)/dukl*sum[j=0:N+L](d(w(1)lj*xkj)/dw(1)nm)
= df1(ukl)/dukl*sum[j=0:N+L](dw(1)lj/dw(1)nm*xkj+dxkj/dw(1)nm*w(1)lj).

Поскольку производная dw(1)lj/dw(1)nm равна 1 при l=n и j=m, а при всех остальных сочетаниях l и j равна 0, то заменим ее дельтой Кронекера delthaln, а произведение delthaln*xkm вынесем из под знака суммирования.

dvkl/dw(1)nm = df1(ukl)/dukl*(delthaln*xkm+sum[j=0:N+L](dxkj/dw(1)nm*w(1)lj)).

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

dvkl/dw(1)nm = df1(ukl)/dukl*(delthaln*xkm+sum[j=1:L](dvk-1j/dw(1)nm*w(1)l,N+j)).

Начальные значения производных для момента k=0 принято выбирать нулевыми.

Алгоритм обучения сети Эльмана можно представить в следующем виде.

  1. Присвоить весам начальные значения, положить k=1.
  2. Для текущего момента k определить все сигналы сети.
  3. Рассчитать значения dvkl/dw(1)nm для всех весов нейронов первого слоя.
  4. Рассчитать все компоненты вектора градиента целевой функции.
  5. Скорректировать веса нейронов обоих слоев по формулам:
  6. w(2)nm<-w(2)nm-nu*дEk(W)/дw(2)nm,
    w(1)nm<-w(1)nm-nu*дEk(W)/дw(1)nm,
    где nu - коэффициент обучения.
  7. Увеличить k на 1 и перейти к п. 2.