RNN и LSTM
Задача
Как работать со структурными последовательными данными — речью, текстом, временными рядами? Полносвязные сети не учитывают порядок элементов. Рекуррентные нейронные сети (RNN) решают эту проблему.
Как работает RNN
Идея: строим следующий элемент последовательности на основании предыдущего скрытого состояния.
В начало и конец последовательности добавляют служебные токены: \(\langle\text{STR}\rangle\), \(\langle\text{END}\rangle\), \(\langle\text{UNKNOWN}\rangle\).
Математически:
\[h_0 = \vec{0}\]
\[h_{i+1} = \sigma(\langle W_\text{hid},\, [h_i, x_i] \rangle + b)\]
\[P(x_{i+1}) = \text{softmax}(\langle W_\text{out}, h_i \rangle + b_\text{out})\]
Веса \(W_\text{hid}\) и \(W_\text{out}\) общие для всех шагов — это и есть рекуррентность.
Проблема 1 — выбор функции активации
При использовании ReLU веса от шага к шагу накапливаются и уходят в большие значения. Используют tanh вместо сигмоиды: tanh симметричен относительно нуля, что предотвращает смещение весов.
Проблема 2 — модель забывает
При обновлении скрытого состояния старая информация вытесняется новой. Модель не может явно управлять тем, что запомнить, а что забыть.
Решение — LSTM (Long Short-Term Memory): механизм ворот (gates) явно управляет потоком информации через сеть.
- Forget gate — что забыть из предыдущего состояния.
- Input gate — что записать из текущего входа.
- Output gate — что передать дальше.
Проблема 3 — затухание градиентов
При обратном распространении через много шагов времени градиент перемножается на одни и те же веса — и экспоненциально затухает.
Решения:
| Метод | Идея | Качество / скорость |
|---|---|---|
| LSTM | Ворота управляют градиентным потоком | База, хорошее качество |
| GRU | Упрощённый LSTM с меньшим числом параметров | Чуть хуже качество, быстрее |
| Bidirectional RNN | Обновление и с начала, и с конца последовательности | Лучше улавливает контекст |
| MultiLayer RNN | Стекирование нескольких RNN друг над другом | Хорошо работает на практике |