Глубокое обучение
RNN, LSTM, GRU
2014 год. Seq2seq на LSTM - и Google Translate прыгает на 20 пунктов за год. 2017 - Transformer появляется и «убивает» RNN. Но в 2024 LSTM всё ещё работает в Apple Siri, на каждом аудиочипе iPhone и в Tesla climate control. Скорость и компактность - это не компромисс, это другой дизайн-выбор. LSTM с 2.5М параметров обрабатывает текст в 15 раз быстрее GPT-2 (117М) на CPU.
- LSTM в Apple Siri - голосовое распознавание в реальном времени, <20ms, работает offline
- GRU в музыкальной генерации Magenta (Google) - мелодии и аккорды как последовательности
- Bidirectional LSTM в SpaCy NER - 97% точность на CoNLL-2003, модель 12MB
- Tesla climate control - time-series prediction без Transformer-оверхеда на встроенном чипе
Предварительные знания
- Backpropagation и chain rule (BPTT расширяет их во времени)
- Что такое vanishing gradient и почему глубина его усугубляет
- Parameter sharing на примере CNN
Три идеи, научившие сети помнить
Рекуррентные сети оформились в 1990 году, когда Джеффри Элман предложил сеть Элмана: контекстный слой возвращал предыдущее скрытое состояние на вход, и модель могла нести память сквозь последовательность. Беда была в том, что обычная RNN быстро забывала - градиенты затухали уже через несколько шагов. В 1997 году Зепп Хохрайтер и Юрген Шмидхубер ответили на это архитектурой LSTM, где cell state с воротами работает как защищённая магистраль для градиентов через сотни шагов. В 2014 году Кёнхён Чо с коллегами предложили GRU - более компактный вариант с двумя воротами вместо трёх, который часто не уступает LSTM при меньших затратах.
Последовательности и память: почему фиксированное окно не работает
**2014. Sutskever, Vinyals, Le публикуют seq2seq на LSTM. Google Translate улучшает качество на 20 пунктов BLEU за один год.** До этого машинный перевод строился на n-gram статистике с фиксированным окном. Модель видела 5-7 слов и делала решение. LSTM впервые позволила модели «помнить» начало предложения, когда обрабатывает его конец. Это изменило NLP навсегда.
Фиксированное окно (sliding window) - интуитивный подход: взять последние N токенов и предсказать следующий. **Проблема**: зависимости в языке не ограничены окном. «Кот, который жил у соседа напротив, **был** рыжим» - глагол «был» согласуется с «кот» через 8 слов. Рекуррентная сеть решает это иначе: вместо фиксированного окна - скрытое состояние h_t, которое передаётся на каждом шаге. Время складывается в веса.
**Char-RNN (Karpathy, 2015)**: LSTM обучили предсказывать следующий символ текста. После 100 000 шагов обучения на Shakespeare - модель начала генерировать правдоподобные диалоги, соблюдать структуру сцен и имена персонажей. Это было первое публичное доказательство, что LSTM реально «запоминает» структуру длиной в сотни символов.
**Intuition для скрытого состояния**: h_t - это сжатая «память» о всём, что модель видела до момента t. При длинных последовательностях plain RNN вынуждена упаковать всю историю в вектор фиксированного размера. LSTM решает это структурно - разделяет «что запомнить» и «что передать дальше».
В чём принципиальное ограничение sliding window подхода для language modeling по сравнению с RNN?
Ворота LSTM: selective memory через sigmoid
**Apple Siri распознаёт речь в реальном времени на iPhone с 2016 года. Под капотом - LSTM.** Не GPT, не Transformer - именно LSTM, потому что умещается в 2MB, работает на нейрочипе с задержкой <20ms и не требует интернета. Качество уступает облачным моделям, но скорость и приватность важнее. Это иллюстрирует ключевое свойство LSTM: компактность при хорошем качестве на последовательных данных.
Главное нововведение LSTM (Hochreiter & Schmidhuber, 1997) - **cell state** c_t: отдельный вектор-конвейер, который проходит через всю последовательность почти без изменений, если ворота так решили. Три ворота управляют информацией: **forget gate** (что забыть из прошлого), **input gate** (что добавить из текущего входа), **output gate** (что передать наружу). Каждый gate - это sigmoid (выход 0-1), умноженный поэлементно на соответствующий вектор. Sigmoid как мягкий переключатель: 0 - полностью блокировать, 1 - полностью пропустить.
**GRU vs LSTM**: GRU обучается быстрее (меньше параметров), показывает сопоставимое качество на задачах до 100 токенов. LSTM чуть лучше на длинных зависимостях (500+ токенов). На практике: начинать с GRU, если качество недостаточно - пробовать LSTM. В production speech recognition (Siri, Google Voice) обычно LSTM из-за чуть лучшей точности.
**Sentiment analysis в production**: модели на базе LSTM с 2.5М параметров обрабатывают текст в 15 раз быстрее GPT-2 (117М параметров) на CPU. Для задач где нужна пакетная обработка миллионов отзывов - LSTM часто выигрывает у Transformer экономически, несмотря на чуть меньшую точность.
Какую функцию выполняет forget gate в LSTM?
Двунаправленность: читать дважды
**«The bank can guarantee deposits will cover future tuition costs.»** Слово «bank» - банк или берег реки? Однонаправленный RNN прочитал «The bank» и принял решение о значении, не видя «deposits» и «tuition» дальше. SpaCy small (en_core_web_sm) использует Bi-LSTM для NER: 97% точность на CoNLL-2003. Секрет - модель читает предложение дважды: слева направо и справа налево, затем объединяет оба контекста.
Bi-LSTM - не одна сеть, а две независимые LSTM, обученные на одних данных. Прямая (forward) обрабатывает последовательность с начала, обратная (backward) - с конца. На каждой позиции t их hidden states конкатенируются: h_t = [h_t_forward; h_t_backward]. Итоговый вектор содержит контекст с обеих сторон. **Именно это наблюдение привело к BERT**: если Bi-LSTM читает в обе стороны последовательно, то почему бы не обучить Transformer читать всё сразу через self-attention?
**Bi-LSTM нельзя использовать для генерации текста (autoregressive)**. При генерации следующего токена будущие токены ещё неизвестны - backward pass невозможен. Bi-LSTM подходит только для задач, где вся последовательность доступна сразу: классификация, NER, машинный перевод (на стороне encoder). Для decoder в seq2seq - только однонаправленный LSTM.
Почему Bi-LSTM нельзя использовать для авторегрессионной генерации текста токен за токеном?
Затухающий градиент: почему LSTM - это решение, а не проблема
**Bengio, Simard, Frasconi, 1994. Статья «Learning Long-Term Dependencies with Gradient Descent is Difficult».** Авторы доказали математически: при backpropagation через время в plain RNN градиент перемножается на матрицу W_h на каждом шаге. Если наибольшее собственное число W_h < 1 - градиент экспоненциально затухает. Если > 1 - экспоненциально взрывается. На последовательности в 100 шагов градиент либо 10^-30, либо 10^30. Обучение становится невозможным.
**Как LSTM решает проблему**: cell state c_t обновляется аддитивно: c_t = f_t * c_{t-1} + i_t * g_t. При backpropagation градиент от c_t к c_{t-1} проходит через поэлементное умножение на f_t - не матричное умножение. Это прямой путь для градиентов через время без экспоненциального затухания. Cell state - это буквально highway для градиентов, как ResNet connections для изображений.
**Практический лимит LSTM**: несмотря на cell state highway, LSTM на практике теряет информацию на последовательностях длиннее 300-500 токенов. Это не баг реализации - это фундаментальное ограничение sequential computation. Каждый шаг немного модифицирует cell state через forget gate. После 500 шагов информация о начале всё равно размывается. Поэтому Transformer (2017) с global self-attention вытеснил LSTM в NLP.
Vanishing gradient - это баг LSTM, который не удалось полностью исправить
LSTM был специально спроектирован для решения vanishing gradient. Cell state - это архитектурное решение: highway для градиентов через время. Plain RNN страдает от vanishing gradient, LSTM - нет по конструкции
Путаница возникает потому, что LSTM всё же имеет практический лимит (~500 токенов). Но это не vanishing gradient - это информационное размывание через forget gate при очень длинных последовательностях. Принципиально разные явления с разными решениями
Почему cell state в LSTM эффективно решает проблему затухающего градиента?
Ключевые идеи
- **RNN складывает время в веса**: скрытое состояние h_t передаётся через шаги, BPTT обучает через время - но plain RNN страдает от экспоненциального затухания/взрыва градиентов
- **Cell state как highway**: LSTM решает vanishing gradient архитектурно - аддитивное обновление c_t вместо матричного умножения создаёт прямой путь для градиентов через сотни шагов
- **GRU - компактная альтернатива**: 2 ворота вместо 3, нет отдельного cell state, обучается быстрее, качество сопоставимо на задачах до 100 токенов
- **Bi-LSTM читает дважды**: forward + backward hidden states конкатенируются, давая контекст с обеих сторон - основа NER и encoder в seq2seq
Связанные темы
RNN/LSTM - мост между полносвязными сетями и современными sequence models:
- CNN: свёрточные сети — Аналогичный принцип parameter sharing, но по пространству, а не по времени
- Трансформеры — Transformer заменил LSTM в NLP - понять почему возможно только зная ограничения LSTM
- NLP и обработка текста — Bi-LSTM - исторический стандарт для NER, seq-labeling, машинного перевода
- Метрики и оценка моделей — Perplexity и BLEU - стандартные метрики для language model и seq2seq на базе LSTM
Вопросы для размышления
- LSTM с 2.5М параметров vs GPT-2 с 117М: в каких production-сценариях выбор в пользу LSTM оправдан экономически и технически?
- Cell state в LSTM и residual connections в ResNet решают похожую проблему. В чём принципиальное сходство и где аналогия ломается?
- Transformer вытеснил LSTM в NLP. Но в задачах с потоковыми данными реального времени (аудио, IoT) LSTM по-прежнему доминирует. Почему sequential computation - это преимущество, а не ограничение в таких сценариях?