Рекуррентная сеть LSTM
Евгений Борисов
вторник, 27 июня 2017 г.
Статья посвящена устройству рекуррентной искусственной нейронной сети LSTM.
1. Введение
Эту статью можно рассматривать как продолжение статьи
[
1] о рекуррентных нейронных сетях. Здесь мы рассмотрим
рекуррентную сеть LSTM (Long short-term memory), которая была предложена [
2]
в 1997 году немецкими исследователями Хохрайтером и Шмидхубером.
Рис 1: схема нейронной сети Элмана
Как и рекуррентная сеть Элмана [
1], сеть LSTM предназначена для обработки
не отдельных образов но их последовательностей. LSTM имеет более сложную конструкцию чем сеть Элмана
и может показывать лучшие результаты.
Далее мы рассмотрим конструкцию сети LSTM подробней.
2. Устройство сети LSTM
Как можно видеть из схем, представленных на рис.1 и рис.2, в сравнении с сетью Элмана
сеть LSTM имеет дополнительные элементы, называемые гейтами (gate), которые должны управлять
потоками данных. В зависимости от своего состояния гейт может пропускать сигнал или не пропускать.
Рис 2: схема нейронной сети LSTM
LSTM состоит из следующих частей(рис.2).
- Вход сети (input)
- Выход сети (output)
- Память или состояние сети (memory cell)
- Блок очистки памяти (forget gate).
- Блок обновления памяти (input gate).
- Блок выдачи результата (output gate).
Работает это следующим образом.
- Устанавливаем начальное состояние выхода сети $y = 0$, состояние памяти $C = 0$
- подать на вход сети очередной сигнал $x$ из последовательности входов $X$
- рассчитываем состояние входного гейта (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$ - функция активации значения входного гейта (сигмоид)
- рассчитываем состояние гейта памяти (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$ - функция активации значения гейта памяти (сигмоид)
- рассчитываем изменение памяти $Z$
$$
Z = \tanh( W_m \cdot x + R_m\cdot y + b_m)
$$
где $x$ - вход сети,
$W_m$ - веса входа сети для изменения памяти,
$y$ - предыдущий выход сети,
$R_m$ - веса выхода сети для изменения памяти,
$b_m$ - сдвиг для значения изменения памяти,
$\tanh$ - функция активации значения изменения памяти
- обновляем состояние памяти сети (memory cell) $С$
$$
С(t+1) = Z * g_i + C(t) * g_f
$$
где $C(t)$ - состояние памяти сети в момент времени $t$,
$Z$ - обновление памяти,
$g_i$ - значение входного гейта,
$g_f$ - значение гейта памяти.
$*$ - операция поэлементного умножения
- рассчитываем состояние выходного гейта (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$ - функция активации значения выходного гейта (сигмоид)
- рассчитываем выход сети $y$
$$
y = \tanh(C) * g_o
$$
где $C$ - состояние памяти сети,
$g_o$ - значение выходного гейта,
$*$ - операция поэлементного умножения
-
если очередь входной последовательности $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 можно скачать [
здесь].
Литература
- Е.С.Борисов О рекуррентных нейронных сетях -- http://mechanoid.kiev.ua/neural-net-rnn.html
- 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.
- 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
- Е.С.Борисов О методах обучения многослойных нейронных сетей прямого распространения. Часть 2: Градиентные методы первого порядка.
-- http://mechanoid.kiev.ua/neural-net-backprop2.html
При использовании материалов этого сайта, пожалуйста вставляйте в свой текст ссылку на мою статью.