Глубокое обучение

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
  • CNN: свёрточные сети
  • Фреймворки: PyTorch vs TensorFlow

Три идеи, научившие сети помнить

Рекуррентные сети оформились в 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 - это преимущество, а не ограничение в таких сценариях?

Связанные уроки

  • dl-03
  • dl-04
  • dl-06
  • nlp-05
  • ml-05-evaluation
  • la-04-matrix-ops
RNN, LSTM, GRU

0

1

Войти