13 / 37 · Нейросетевые модели последовательностей
LSTM и GRU
Ячейки с гейтами дают рекуррентному состоянию аддитивную линию памяти, множитель градиента на которой — значение гейта, а не матрица весов, поэтому информация может пережить много шагов; заметка выписывает обе ячейки, численно проходит один шаг LSTM и считает, во что обходятся гейты.
На этой странице 10
Обычная рекуррентная ячейка из предыдущей заметки на каждом шаге переписывает всё своё состояние через умножение на , и градиент через шагов — произведение таких множителей. Исправление, предложенное Хохрайтером и Шмидхубером (1997) и упрощённое Чо и соавторами (2014), архитектурное: дать ячейке путь, вдоль которого к состоянию прибавляют, а не преобразуют его, и позволить сети выучить — для каждой координаты и на каждом шаге, — сколько сохранить, записать и прочитать.
Обозначения. Как и раньше, — вход, — скрытое состояние. LSTM добавляет состояние ячейки (cell state) . — логистическая функция с областью значений ; у область значений ; — поэлементное умножение. У каждого гейта (gate) свои веса (при ), (при ) и смещение .
Отправная точка: одно состояние, переписываемое на каждом шаге#
. Состояние вычисляется заново на каждом шаге; ничто в ячейке не может сказать «не трогай координату 7». Переживёт ли старая информация шаг, зависит от , общей для всех шагов и всех координат, а множитель градиента на шаг равен .
LSTM#
По вычисляются четыре величины: три гейта в и одно значение-кандидат в :
Затем обновляется память, и из неё читается рабочее состояние:
Каждая операция покоординатная. Координата с и копируется без изменений столько шагов, сколько гейты остаются такими; координата с и переписывается. Область значений сигмоиды делает гейты долями, а область значений ограничивает кандидата и показываемое значение, поэтому может расти только повторным сложением ограниченных величин, а не геометрически.
Разобранный пример#
Одна координата, один шаг. Предыдущая память , предыдущее состояние , вход . Возьмём скалярные веса (условные значения), так что каждая предактивация — небольшая сумма:
| Гейт | Предактивация | Значение |
|---|---|---|
| забывания | ||
| входной | ||
| кандидат | ||
| выходной |
Обновление памяти: . Показываемое состояние: .
Старая память почти полностью сохранилась (гейт забывания около 1), и к ней прибавилось новое значение около . Если бы гейт забывания оказался равен , память упала бы до : тот же вход, другое решение, которое принимают веса, видящие и .
Шаг за шагом#
Шаг LSTM: что куда идёт
По номерам на рисунке:
- Гейт забывания. : какую долю старой памяти сохранить, покоординатно.
- Входной гейт и кандидат. говорит, сколько записать, — что записать. Кандидат — это обновление обычной RNN из предыдущей заметки со своими весами.
- Сохранить. Старая память умножается на гейт забывания: .
- Записать. Прибавляется кандидат, умноженный на гейт: , и . Шаги 3 и 4 — единственные операции на линии памяти: умножение на число из и сложение.
- Выходной гейт. : какую долю памяти показать наружу.
- Прочитать. . И , и уходят на шаг : гейты следующего шага читают , а линия памяти несёт .
По сравнению с рисунком RNN из предыдущей заметки входы и рабочее состояние нарисованы так же; новое — линия памяти сверху в янтарной рамке и три гейта, которые на неё действуют.
Почему градиент выживает#
Продифференцируем обновление памяти по предыдущей памяти:
Первое слагаемое — сам гейт забывания. Вдоль линии памяти градиент через шагов содержит произведение , и сеть может держать его около 1, держа гейты забывания около 1 там, где нужна память, тогда как множитель обычной RNN — степень фиксированной матрицы. Это не доказывает, что LSTM выучивает сколь угодно длинные зависимости (остальные слагаемые по-прежнему затухают или взрываются, а гейты насыщаются), но убирает геометрическое затухание, из-за которого обычная ячейка проваливалась на десятках шагов; на практике LSTM выучивает зависимости на сотни токенов. Смещение часто инициализируют единицей, чтобы гейты забывания начинали открытыми (Jozefowicz, Zaremba and Sutskever, 2015).
Цена#
У каждого из четырёх блоков есть матрица , матрица и смещение, поэтому у ячейки LSTM параметров — вчетверо больше, чем у обычной ячейки (PyTorch хранит по два вектора смещений на блок, что даёт ). Модель перевода из заметки о seq2seq использует : параметров на направление. Вычисление на шаге — тоже четыре матричных произведения вместо одного, и оно по-прежнему строго последовательно.
GRU#
Рекуррентная ячейка с гейтами GRU (gated recurrent unit; Cho et al., 2014) объединяет память и рабочее состояние и использует два гейта:
Гейт обновления (update gate) играет роли и , и , связанные как : что не сохранено, то переписано. Гейт сброса (reset gate) управляет тем, сколько предыдущего состояния может прочитать кандидат. Выходного гейта нет; и есть память. Число параметров — , три четверти LSTM того же размера, и на шаге на одно матричное произведение меньше. Классификатор AG News из предыдущей заметки — это GRU с и .
Соглашения. В уравнениях выше — доля состояния, которая переписывается. Исходная статья (Cho et al., 2014, уравнения 5–8) и nn.GRU в PyTorch интерполируют в обратную сторону, , так что их — это наше . Кроме того, PyTorch применяет сброс после рекуррентного линейного отображения, , тогда как уравнения выше, как и у Cho et al., сбрасывают до умножения на ; в общем случае кандидаты получаются разными. Со вторым вектором смещений на каждый гейт число параметров в PyTorch — . Оба варианта — стандартные GRU, но формула и реализация должны использовать один и тот же.
| Обычная RNN | LSTM | GRU | |
|---|---|---|---|
| Состояния | |||
| Гейты | 0 | 3 () | 2 () |
| Обновление памяти | переписывание | ||
| Параметры | |||
| Множитель градиента вдоль памяти |
Какая ячейка лучше — вопрос эмпирический и зависит от задачи. Прямые сравнения находят их близкими (Chung et al., 2014; Jozefowicz, Zaremba and Sutskever, 2015), а большое исследование вариантов LSTM показало, что связывание входного гейта и гейта забывания, как в GRU, почти ничего не стоит (Greff et al., 2017).
Чтение в обе стороны#
Рекуррентное состояние в позиции подытоживает и ничего не знает о . Для классификатора или энкодера, который видит весь вход сразу, можно запустить вторую ячейку справа налево и конкатенировать два состояния в каждой позиции: двунаправленная RNN даёт — представление каждого токена с учётом всего контекста — ценой удвоенных вычислений. Энкодер из следующей заметки — двунаправленная LSTM. Языковая модель не может быть двунаправленной, потому что не должна видеть токен, который предсказывает; заметка о BERT находит другой способ использовать оба направления.
Что изменилось#
| Обычная RNN | RNN с гейтами | |
|---|---|---|
| Может оставить координату без изменений | Только если так вышло у | Да, гейтами |
| Длинные зависимости | Десятки токенов | Сотни, на практике |
| Параметров на ячейку | (GRU), (LSTM) | |
| Последовательная | Да | Да |
| Состояние фиксированного размера | Да | Да |
Ограничения#
- По-прежнему последовательна. Шаг зависит от шага . Время обучения и инференса растёт с , и измерение последовательности нельзя распараллелить.
- По-прежнему один вектор. Как бы хорошо оно ни помнило, состояние в конце — это (или ) чисел, которые должны вместить всё, что нужно следующему этапу. Заметка о seq2seq делает этот провал видимым на переводе.
- Гейты насыщаются. У сигмоид около 0 или 1 малые производные; гейт, который научился закрываться, медленно открывается снова.
- Ёмкость стоит денег. Четыре матрицы на шаг; у двухслойной двунаправленной LSTM с над 512-мерными входами 10.5 млн параметров ещё до всяких эмбеддингов.
Что нужно запомнить#
- LSTM: , ; гейты в от , кандидат в от .
- Аддитивное обновление памяти делает множитель градиента вдоль примерно равным гейту забывания, который сеть может держать около 1.
- GRU: два гейта, одно состояние, ; три четверти параметров LSTM.
- Двунаправленные ячейки дают каждой позиции полный контекст; для предсказания следующего токена их использовать нельзя.
- Гейты исправляют градиент, но не последовательность вычислений и не сводку в один вектор.
Ноутбук#
week04_lstm_attention_transformer.ipynb. Номера ячеек считают все ячейки, включая текстовые, начиная с 1. Приведённые числа взяты из прогона, сохранённого в курсе; у ячеек, изменённых с тех пор под текущие версии библиотек, сохранённого выхода нет.
- Ячейка 39 определяет
Seq2SeqLSTMсnn.LSTM(128, 128, bidirectional=True)в роли энкодера и однонаправленнойnn.LSTM(128, 128)в роли декодера; два последних скрытых состояния и два состояния ячейки энкодера (h_enc,c_encформы[2, B, 128]) конкатенируются в[1, B, 256]и проецируются обратно в 128 слоямиh_projиc_proj, чтобы инициализировать декодер. - Ячейка 44 печатает всего 8 380 474 параметра и 492 602 вне матриц эмбеддингов и выхода; последнее — это (двунаправленный энкодер) (декодер) (две проекции) (смещение выходного слоя, которое вычитание в ноутбуке оставляет).
week02_NN_text_classification.ipynb, ячейка 40, — упомянутый выше классификатор на GRU. Он использует nn.GRU, так что его гейты следуют соглашению PyTorch из раздела о GRU: гейт обновления — доля сохраняемого, а сброс действует после рекуррентной матрицы.
Дальше#
С ячейкой, которая умеет помнить, курс берётся за первую задачу порождения с двумя последовательностями: перевести немецкое предложение на английский. Одна рекуррентная сеть читает источник, другая пишет перевод. Следующая заметка строит этот энкодер–декодер, измеряет его метрикой BLEU и обнаруживает, что единственный вектор, передаваемый от энкодера декодеру, теперь и есть ограничивающий фактор.
Литература#
- S. Hochreiter, J. Schmidhuber. Long Short-Term Memory. Neural Computation, 9(8), 1997.
- K. Cho, B. van Merriënboer, C. Gulcehre, D. Bahdanau, F. Bougares, H. Schwenk, Y. Bengio. Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation. EMNLP, 2014. GRU.
- J. Chung, C. Gulcehre, K. Cho, Y. Bengio. Empirical Evaluation of Gated Recurrent Neural Networks on Sequence Modeling. NIPS Deep Learning Workshop, 2014. Сравнение LSTM и GRU на моделировании музыки и речи.
- R. Jozefowicz, W. Zaremba, I. Sutskever. An Empirical Exploration of Recurrent Network Architectures. ICML, 2015. Инициализация смещения гейта забывания; сравнение LSTM и GRU.
- K. Greff, R. K. Srivastava, J. Koutník, B. R. Steunebrink, J. Schmidhuber. LSTM: A Search Space Odyssey. IEEE TNNLS, 28(10), 2017.
- C. Olah. Understanding LSTM Networks. 2015. Разбор по гейтам, которому следует разобранный пример.
- M. Schuster, K. K. Paliwal. Bidirectional recurrent neural networks. IEEE Transactions on Signal Processing, 45(11), 1997.