Рекуррентные сети почти ушли из NLP, но вопросы о них остались: они объясняют, зачем появились гейты, attention и трансформеры. Плюс RNN живут в потоковых задачах и на устройствах.
Простая RNN
hₜ = tanh(W_x·xₜ + W_h·hₜ₋₁ + b)
Одни и те же веса на всех шагах, поэтому сеть обрабатывает последовательности любой длины. Выход можно брать на каждом шаге (разметка токенов) или только в конце (классификация).
Обучение и затухание
Обратное распространение во времени (BPTT) разворачивает сеть по шагам. Градиент от шага t к шагу t - k содержит произведение k якобианов: при множителях меньше 1 он затухает, больше 1 взрывается. Поэтому простая RNN плохо помнит дальше нескольких десятков шагов.
- Взрыв лечат gradient clipping.
- Затухание лечат архитектурой: LSTM и GRU.
- На длинных последовательностях используют truncated BPTT.
LSTM
fₜ, iₜ, oₜ = σ(...) гейты забывания, входа, выхода
c̃ₜ = tanh(...) кандидат
cₜ = fₜ⊙cₜ₋₁ + iₜ⊙c̃ₜ ячейка памяти
hₜ = oₜ⊙tanh(cₜ)
Ключ в аддитивном обновлении ячейки: ∂cₜ/∂cₜ₋₁ = fₜ, и при forget gate около 1 информация и градиент проходят почти без потерь. Смещение forget gate часто инициализируют положительным.
Параметры слоя LSTM: 4·(H·D + H·H + H) с одним смещением на гейт. Для D = 10, H = 20 это 2 480 (в PyTorch два смещения, 2 560).
GRU
Два гейта (update и reset) и одно состояние. Меньше параметров, качество часто сопоставимо с LSTM.
Варианты
- Двунаправленная RNN видит левый и правый контекст. Нельзя использовать для генерации и онлайн-прогноза: правый контекст это будущее.
- Seq2seq: кодировщик читает вход, декодер генерирует выход. Attention появился здесь: декодер на каждом шаге смотрит на все состояния кодировщика, а не на один сжатый вектор.
- Teacher forcing: на обучении декодеру подают истинный предыдущий токен. На генерации он видит свои ошибки (exposure bias).
Почему трансформеры победили
- RNN последовательна: на обучении нельзя распараллелить по времени.
- Вся история сжимается в вектор фиксированного размера.
- Attention связывает любые позиции за один слой и обучается параллельно.
Цена трансформера: квадратичная сложность по длине. Поэтому идеи рекуррентности вернулись в моделях пространства состояний (Mamba) и линейном attention.
Временные ряды
Перед LSTM постройте бейзлайны: сезонную наивную модель и бустинг на лагах. Нейросети оправданы при множестве связанных рядов и больших данных. Валидация строго по времени.
Частые ошибки
- Двунаправленная RNN в задаче прогноза.
- Нет клиппинга в RNN.
- Говорить, что LSTM решает затухание полностью: она смягчает его, но очень длинные зависимости всё равно трудны.
Что спросят на собесе
- Как устроена RNN и почему градиенты затухают.
- Как LSTM решает проблему, какие у неё гейты.
- GRU против LSTM, число параметров.
- Почему трансформеры вытеснили RNN.
- Что такое teacher forcing.