Как работают рекуррентные нейросети (RNN, LSTM, GRU)? Почему трансформеры их вытеснили в NLP?
Краткий тезис
Рекуррентные нейросети (RNN) и их модификации (LSTM, GRU) исторически были основным инструментом для обработки последовательностей в NLP. Их фундаментальная идея — передача скрытого состояния между шагами — позволяла моделировать временные зависимости. Однако RNN страдают от последовательной (непараллельной) обработки, проблем затухающих градиентов и слабой способности удерживать контекст на десятках шагов. Трансформеры (Transformer) с механизмом self-attention решили эти проблемы, обеспечив полную параллелизацию, прямые связи между любыми токенами и стабильное обучение. В результате трансформеры стали доминирующей архитектурой в NLP, хотя для задач с жёсткими ограничениями по ресурсам (например, on-device инференс) RNN-подходы могут сохранять актуальность.
---|---------|------------| | Forget gate (f) | ( f_t = \sigma(W_f [h_{t-1}, x_t] + b_f) ) | Определяет, какую часть старой памяти забыть (от 0 до 1). | | Input gate (i) | ( i_t = \sigma(W_i [h_{t-1}, x_t] + b_i) ) | Решает, какую новую информацию записать в память. | | Candidate memory (Ĉ) | ( \tilde{C}t = [tanh](/wiki/tanh)(W_C [h{t-1}, x_t] + b_C) ) | Кандидат на запись. | | Cell update | ( C_t = f_t \odot C_{t-1} + i_t \odot \tilde{C}t ) | Новое состояние ячейки (взвешенная сумма старой памяти и нового кандидата). | | Output gate (o) | ( o_t = \sigma(W_o [h{t-1}, x_t] + b_o) ) | Определяет, какую часть ячейки вывести в скрытое состояние. | | Hidden state | ( h_t = o_t \odot [tanh](/wiki/tanh)(C_t) ) | Итоговое скрытое состояние (только разрешённая выходным гейтом часть). |
Преимущества:
- Линейная траектория градиента через Cₜ (забывающий гейт может быть >0), что ослабляет затухание.
- Возможность хранить информацию на сотни шагов. Недостатки:
- Последовательная рекурсия остаётся.
- Большое количество параметров (4 весовых матрицы на слой) → медленное обучение.
3. GRU: упрощённая версия
GRU (Cho et al., 2014) объединяет входной и забывающий гейты в один update gate и добавляет reset gate:
- Update gate ( z_t = \sigma(W_z [h_{t-1}, x_t]) ) – решает, насколько обновить скрытое состояние (аналог 1 – forget gate LSTM).
- Reset gate ( r_t = \sigma(W_r [h_{t-1}, x_t]) ) – решает, какую часть предыдущего состояния сбросить перед вычислением кандидата.
- Candidate hidden ( \tilde{h}t = [tanh](/wiki/tanh)(W_h [r_t \odot h{t-1}, x_t]) )
- Final hidden ( h_t = (1 - z_t) \odot h_{t-1} + z_t \odot \tilde{h}_t )
GRU имеет меньше параметров (3 матрицы), чем LSTM (4), и часто показывает сравнимую производительность. Однако принципиальный недостаток – последовательная обработка – остаётся.
4. Почему трансформеры лучше: параллелизация, long-term память
Трансформер (Vaswani et al., 2017) полностью отказался от рекурсии в пользу механизма self-attention:
- Параллелизация: каждый токен взаимодействует со всеми токенами последовательности одновременно (нет зависимости hₜ = f(h_{t-1})).
- Long-term память: attention может создавать прямые связи между token₁ и token₁₀₀ за один шаг – градиенты не затухают по пути, так как нет цепочки нелинейных рекуррентных слоёв. Длина контекста ограничена только длиной последовательности и памятью (O(n²) сложность).
- Стабильное обучение: отсутствие взрывных/затухающих градиентов благодаря прямой передаче градиента через Softmax и LayerNorm.
- Мультимодальное расширение: attention легко адаптируется к парам последовательностей (cross-attention в encoder-decoder).
Недостатки трансформеров: квадратичная сложность по длине последовательности и большее число операций (FLOPS) на токен. Для задач с низкими вычислительными ресурсами (например, мобильные устройства) продолжают исследоваться архитектуры, сочетающие рекуррентную эффективность с параллелизмом (Mamba, State Space Models).
5. Пет-проект для закрепления
Задача: Сравнить качество и скорость обучения LSTM и трансформера (BERT) на задаче классификации тональности отзывов IMDb.
Инструменты: Python, PyTorch, Hugging Face transformers, datasets (IMDb), torchmetrics, matplotlib.
Шаги:
- Загрузить датасет IMDb, векторизовать тексты (embedding слой для LSTM, токенизация BERT для трансформера).
- Реализовать LSTM-классификатор: Embedding → LSTM(256, 2 слоя, dropout=0.5) → Linear → Softmax. Обучение на GPU (если доступен) или CPU, batch 64, learning rate 0.001.
- Взять предобученный
bert-base-uncasedс головой классификации (AutoModelForSequenceClassification). Fine-tuning 2 эпохи, batch 16, learning rate 2e-5. - Замерить accuracy, F1, время обучения, время инференса на одном батче.
- Построить графики loss. Сравнить результаты.
Ожидаемый результат: LSTM – accuracy ~0.85, обучение на GPU занимает ~30 минут. BERT – accuracy ~0.95, обучение ~5 минут (на GPU). BERT значительно точнее, но требует больше видеопамяти. LSTM может быть конкурентоспособен на CPU или при сильных ограничениях по памяти.
Связь с другими вопросами
| Вопрос | Тема |
|---|---|
| 713 | Attention в трансформерах |
Навигация
- Предыдущий: 933
- Следующий: 935
- Индекс: 00. Индекс разборов