на главную ] 

Рекуррентная сеть LSTM

Евгений Борисов

вторник, 27 июня 2017 г.


Статья посвящена устройству рекуррентной искусственной нейронной сети LSTM.

1. Введение

Эту статью можно рассматривать как продолжение статьи [1] о рекуррентных нейронных сетях. Здесь мы рассмотрим рекуррентную сеть LSTM (Long short-term memory), которая была предложена [2] в 1997 году немецкими исследователями Хохрайтером и Шмидхубером.

elman neural net
Рис 1: схема нейронной сети Элмана

Как и рекуррентная сеть Элмана [1], сеть LSTM предназначена для обработки не отдельных образов но их последовательностей. LSTM имеет более сложную конструкцию чем сеть Элмана и может показывать лучшие результаты.

Далее мы рассмотрим конструкцию сети LSTM подробней.

2. Устройство сети LSTM

Как можно видеть из схем, представленных на рис.1 и рис.2, в сравнении с сетью Элмана сеть LSTM имеет дополнительные элементы, называемые гейтами (gate), которые должны управлять потоками данных. В зависимости от своего состояния гейт может пропускать сигнал или не пропускать.

lstm neural net
Рис 2: схема нейронной сети LSTM

LSTM состоит из следующих частей(рис.2).

Работает это следующим образом.

  1. Устанавливаем начальное состояние выхода сети $y = 0$, состояние памяти $C = 0$
  2. подать на вход сети очередной сигнал $x$ из последовательности входов $X$
  3. рассчитываем состояние входного гейта (input gate) $g_i$

    $$ g_i = \sigma( W_i\cdot x + R_i\cdot y + P_i \cdot C + b_i) $$ где $x$ - вход сети,
    $W_i$ - веса входа сети для входного гейта,
    $y$ - предыдущий выход сети,
    $R_i$ - веса выхода сети для входного гейта,
    $C$ - состояние памяти сети,
    $P_i$ - веса состояние памяти сети для входного гейта,
    $b_i$ - сдвиг для значения входного гейта,
    $\sigma$ - функция активации значения входного гейта (сигмоид)

  4. рассчитываем состояние гейта памяти (forget gate) $g_f$

    $$ g_f = \sigma( W_f\cdot x + R_f\cdot y + P_f \cdot C + b_f) $$ где $x$ - вход сети,
    $W_f$ - веса входа сети для гейта памяти,
    $y$ - предыдущий выход сети,
    $R_f$ - веса выхода сети для гейта памяти,
    $C$ - состояние памяти сети,
    $P_f$ - веса состояние памяти сети для гейта памяти,
    $b_f$ - сдвиг для значения гейта памяти,
    $\sigma$ - функция активации значения гейта памяти (сигмоид)

  5. рассчитываем изменение памяти $Z$

    $$ Z = \tanh( W_m \cdot x + R_m\cdot y + b_m) $$ где $x$ - вход сети,
    $W_m$ - веса входа сети для изменения памяти,
    $y$ - предыдущий выход сети,
    $R_m$ - веса выхода сети для изменения памяти,
    $b_m$ - сдвиг для значения изменения памяти,
    $\tanh$ - функция активации значения изменения памяти

  6. обновляем состояние памяти сети (memory cell) $С$

    $$ С(t+1) = Z * g_i + C(t) * g_f $$ где $C(t)$ - состояние памяти сети в момент времени $t$,
    $Z$ - обновление памяти,
    $g_i$ - значение входного гейта,
    $g_f$ - значение гейта памяти.
    $*$ - операция поэлементного умножения

  7. рассчитываем состояние выходного гейта (output gate) $g_o$

    $$ g_o = \sigma( W_o\cdot x + R_o\cdot y + P_o \cdot C + b_o) $$ где $x$ - вход сети,
    $W_o$ - веса входа сети для выходного гейта,
    $y$ - предыдущий выход сети,
    $R_o$ - веса выхода сети для выходного гейта,
    $C$ - состояние памяти сети,
    $P_o$ - веса состояние памяти сети для выходного гейта,
    $b_o$ - сдвиг для значения выходного гейта,
    $\sigma$ - функция активации значения выходного гейта (сигмоид)

  8. рассчитываем выход сети $y$

    $$ y = \tanh(C) * g_o $$ где $C$ - состояние памяти сети,
    $g_o$ - значение выходного гейта,
    $*$ - операция поэлементного умножения

  9. если очередь входной последовательности $X$ опустела
    то конец работы
    иначе переход на п.2
Представленную выше схему сети называют LSTM with peephole, в ней гейты имеют связь с памятью сети. Существуют так же упрощённые схемы LSTM [3], в которых некоторые элементы могут отсутствовать.

3. Обучение сети LSTM

Для обучения LSTM можно применять метод BPTT [1] (backpropagation through time, метод обратного распространения с разворачиванием сети во времени), который является одной из модификаций метода градиентного спуска [4].

4. Реализация

В этом разделе приведём две реализации на octave - полной сети LSTM и упрощённой сети (LSTM without peephole).

Код на octave полной LSTM можно скачать [здесь].

Код на octave LSTM without peephole можно скачать [здесь].

Литература

  1. Е.С.Борисов О рекуррентных нейронных сетях -- http://mechanoid.kiev.ua/neural-net-rnn.html
  2. Sepp Hochreiter; Jürgen Schmidhuber (1997). "Long short-term memory". Neural Computation. 9 (8): 1735–1780. PMID 9377276. doi:10.1162/neco.1997.9.8.1735.
  3. Klaus Greff, Rupesh Kumar Srivastava, Jan Koutnı́k, Bas R. Steunebrink, Jürgen Schmidhuber
    LSTM: A Search Space Odyssey
    -- http://arxiv.org/abs/1503.04069
  4. Е.С.Борисов О методах обучения многослойных нейронных сетей прямого распространения. Часть 2: Градиентные методы первого порядка.
    -- http://mechanoid.kiev.ua/neural-net-backprop2.html
При использовании материалов этого сайта, пожалуйста вставляйте в свой текст ссылку на мою статью.