Модуль III·Статья I·~3 мин чтения
RNN, LSTM и GRU: архитектуры для последовательностей
Рекуррентные нейронные сети
Превратить статью в подкаст
Выберите голоса, формат и длину — AI запишет аудио
RNN, LSTM и GRU: архитектуры для последовательностей
Рекуррентные нейронные сети предназначены для обработки последовательностей — текста, временных рядов, аудио. Они поддерживают «память» через скрытое состояние, передаваемое во времени. LSTM — ключевое изобретение 1997 года, открывшее обучение на длинных зависимостях.
Базовая RNN
Уравнения RNN:
hₜ = tanh(Wₕₕ hₜ₋₁ + Wₓₕ xₜ + b), ŷₜ = Wₕᵧ hₜ + c
Расшифровка: hₜ — скрытое состояние (память о прошлом), xₜ — вход в момент t, Wₕₕ — матрица «памяти» (связывает hₜ и hₜ₋₁), Wₓₕ — матрица входа, Wₕᵧ — матрица выхода. Одни и те же веса W на каждом шаге (weight sharing во времени).
Backpropagation Through Time (BPTT): Для обучения RNN разворачиваем во времени и применяем chain rule: ∂L/∂Wₕₕ = Σₜ ∂L/∂hₜ · ∂hₜ/∂Wₕₕ. Градиент: ∂hₜ/∂hₛ = Π_{k=s}^{t-1} ∂hₖ₊₁/∂hₖ = Π_{k=s}^{t-1} Wₕₕᵀ diag(tanh'(zₖ)).
Произведение из (t−s) матриц → при ||Wₕₕᵀ diag(tanh'(zₖ))|| < 1: исчезание. При > 1: взрывание. Проблема для длинных последовательностей (T > 20–30).
Режимы RNN: one-to-many (генерация текста), many-to-one (классификация тональности), many-to-many (машинный перевод через seq2seq, Named Entity Recognition).
LSTM (Long Short-Term Memory, Hochreiter-Schmidhuber, 1997)
LSTM решает проблему исчезающего градиента через «ячейку памяти» Cₜ и три вентиля (gates). Ключевая идея: аддитивное обновление ячейки создаёт прямой путь для градиента.
Forget gate: fₜ = σ(Wf · [hₜ₋₁, xₜ] + bf)
Расшифровка: σ ∈ (0,1) — какую долю предыдущей памяти Cₜ₋₁ «забыть». fₜ ≈ 0: стереть память. fₜ ≈ 1: сохранить.
Input gate: iₜ = σ(Wᵢ · [hₜ₋₁, xₜ] + bᵢ) — «насколько добавить» C̃ₜ = tanh(Wc · [hₜ₋₁, xₜ] + bc) — «что добавить»
Обновление памяти: Cₜ = fₜ ⊙ Cₜ₋₁ + iₜ ⊙ C̃ₜ
Расшифровка: комбинируем «отфильтрованную» старую память (fₜ ⊙ Cₜ₋₁) и новую информацию (iₜ ⊙ C̃ₜ). Ключевое: операция сложения (не умножения!) → градиент может течь без затухания.
Output gate: oₜ = σ(Wo · [hₜ₋₁, xₜ] + bo) hₜ = oₜ ⊙ tanh(Cₜ)
Прямой путь градиента: ∂Cₜ/∂Cₜ₋₁ = fₜ (поэлементное умножение). Если fₜ ≈ 1 (gate запомнить) → градиент проходит с коэффициентом 1. Это решает исчезание для длинных зависимостей.
GRU (Gated Recurrent Unit, Cho et al., 2014)
Упрощение LSTM: два вентиля вместо трёх, нет отдельной ячейки памяти Cₜ.
Update gate: zₜ = σ(Wz · [hₜ₋₁, xₜ]) — насколько обновить hₜ. Reset gate: rₜ = σ(Wr · [hₜ₋₁, xₜ]) — насколько «забыть» hₜ₋₁. Новое состояние: h̃ₜ = tanh(W · [rₜ ⊙ hₜ₋₁, xₜ]) Итог: hₜ = (1−zₜ) ⊙ hₜ₋₁ + zₜ ⊙ h̃ₜ
GRU проще (меньше параметров), сопоставимо качество на большинстве задач.
Bidirectional RNN и глубокие RNN
BiLSTM: Прямой LSTM (t = 1,...,T) + обратный LSTM (t = T,...,1). Конкатенируем hₜ_fwd и hₜ_bwd → каждый токен «видит» оба направления. Стандарт для NER, POS-tagging, машинного перевода (BERT по сути = глубокий BiLSTM с вниманием).
Stacked RNN: Вход для l-го уровня = hₜ^{(l-1)} (выход предыдущего уровня в момент t). 2–4 уровня дают значительный прирост на сложных задачах.
Численный пример: Language Model
Языковая модель на LSTM для предсказания следующего символа. Словарь: 100 символов. Архитектура: Embedding(100→32) → LSTM(32→128) → FC(128→100) → Softmax.
При обучении на «Войне и мире» (3M символов), 50 эпох: Perplexity = 45. Сгенерированный текст (temperature=0.7): «Князь Андрей почувствовал, как его сердце...» — осмысленно. При temperature=1.5: «Жевать этому должен светлый...» — инкогерентно. Temperature контролирует разнообразие: T<1 консервативен, T>1 — разнообразен, но менее точен.
Задание: Обучите LSTM для предсказания следующего слова на корпусе Толстого (1 млн токенов). Размер словаря: 10000 токенов. LSTM: 2 слоя, hidden=512. (1) Оцените perplexity на тестовой выборке. (2) Сгенерируйте 200 слов с temperature=0.7 и 1.2. Как температура влияет на coherence и diversity? (3) Реализуйте beam search (beam=5) — как улучшается качество генерации?
§ Акт · что дальше