LSTM

Коротко

Definition

LSTM — это рекуррентный архитектурный блок, который помогает нейросети хранить и обновлять информацию на длинных последовательностях через специальное состояние памяти и обучаемые gates.

LSTM расшифровывается как Long Short-Term Memory.

Главная идея:

  • обычная RNN быстро забывает раннюю информацию;
  • градиенты при обучении могут затухать или взрываться;
  • LSTM добавляет отдельное состояние памяти ;
  • gates управляют тем, что забыть, что добавить и что вывести наружу.

LSTM долго был одной из ключевых архитектур для текста, временных рядов и других последовательностей до широкого распространения трансформеров.

Зачем нужен

Обычный рекуррентный слой обрабатывает последовательность шаг за шагом. На каждом шаге он получает текущий вход и скрытое состояние с прошлого шага.

Проблема в том, что при длинных последовательностях ранняя информация часто теряется. Например, в длинном предложении слово в начале может быть важно для слова в конце, но обычной RNN трудно сохранить эту связь.

LSTM решает эту проблему через отдельную долгосрочную память:

Эта память передаётся по времени более напрямую и обновляется аддитивно. Поэтому ей легче сохранять информацию на многих шагах.

LSTM нужен, чтобы:

  • лучше работать с длинными зависимостями;
  • уменьшить проблему затухающих градиентов;
  • управлять памятью последовательности;
  • выбирать, какую информацию забыть, сохранить и вывести.

Как работает

В LSTM есть два основных состояния:

  • — hidden state, или краткосрочное состояние;
  • — cell state, или долгосрочная память.

На каждом шаге времени блок получает:

  • текущий вход ;
  • прошлое скрытое состояние ;
  • прошлое состояние памяти .

Затем LSTM вычисляет несколько gates.

Forget gate

Forget gate решает, какую часть старой памяти сохранить:

Если значение близко к 0, информация забывается. Если близко к 1, информация сохраняется.

Input gate

Input gate решает, какую новую информацию добавить в память:

Кандидат новой памяти:

Обновление cell state

Долгосрочная память обновляется так:

Здесь видно главное отличие LSTM: память обновляется аддитивно, а не только через повторное нелинейное преобразование.

Output gate

Output gate решает, какую часть памяти вывести в hidden state:

Итоговое скрытое состояние:

Где используется

LSTM используют для последовательных данных.

Типичные применения:

ОбластьПримеры
Текстклассификация текста, языковое моделирование, машинный перевод
Временные рядыпрогнозирование, анализ сенсорных данных, финансы
Аудиораспознавание речи, обработка сигналов
Биоданныепоследовательности ДНК, белковые последовательности
Seq2Seqencoder-decoder модели до трансформеров

Сейчас во многих NLP-задачах LSTM заменены трансформерами, но они всё ещё полезны для небольших данных, временных рядов и задач, где рекуррентная обработка естественна.

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

Обычная RNN

Обычная RNN имеет только скрытое состояние . Она проще, но хуже сохраняет дальние зависимости.

GRU

GRU — упрощённая альтернатива LSTM. В ней меньше gates и нет отдельного cell state в таком же виде. GRU часто быстрее, но может быть менее гибкой.

Seq2Seq

В классических Seq2Seq-архитектурах LSTM часто использовалась как encoder и decoder.

Attention

Attention частично решает проблему длинных зависимостей иначе: он позволяет модели обращаться к разным позициям входной последовательности напрямую, а не только через рекуррентную память.

Transformer

Трансформер почти полностью отказался от рекуррентности и заменил её self-attention. Поэтому в современных языковых моделях LSTM используется гораздо реже.

Типичные ошибки понимания

Ошибка 1. Думать, что LSTM полностью решает проблему длинного контекста

LSTM лучше обычной RNN, но не даёт бесконечной памяти. На очень длинных последовательностях информация всё равно может теряться.

Ошибка 2. Путать hidden state и cell state

— это выход блока на текущем шаге. — это внутренняя долгосрочная память. Они связаны, но выполняют разные роли.

Ошибка 3. Считать gates ручными правилами

Forget gate, input gate и output gate не задаются вручную. Их веса обучаются через Обратное распространение ошибки.

Ошибка 4. Думать, что LSTM всегда лучше трансформера

Для многих задач с текстом трансформеры сильнее. Но LSTM может быть проще, дешевле и удобнее на небольших последовательных данных.

Ошибка 5. Игнорировать порядок данных

LSTM обрабатывает последовательность по шагам, поэтому порядок элементов важен. Если перемешать временные шаги или токены, смысл модели нарушится.

Минимальный пример

import torch
from torch import nn
 
batch_size = 4
seq_len = 10
input_size = 8
hidden_size = 16
 
x = torch.randn(batch_size, seq_len, input_size)
 
lstm = nn.LSTM(
    input_size=input_size,
    hidden_size=hidden_size,
    batch_first=True,
)
 
outputs, (h_n, c_n) = lstm(x)
 
print(outputs.shape)
print(h_n.shape)
print(c_n.shape)

В этом примере:

  • outputs содержит hidden states для всех шагов последовательности;
  • h_n содержит последнее hidden state;
  • c_n содержит последнее cell state.

Связанные понятия

Что знать перед этим