LSTM

Автор:

Разновидность рекуррентных нейросетей, предназначенная для работы с последовательными данными

LSTM (Long Short-Term Memory) — это разновидность рекуррентных нейросетей, предназначенная для работы с последовательными данными: временем, текстом, сигналами и любыми данными, где важен порядок.

Проще говоря:
LSTM — это нейросеть, которая умеет помнить важное и забывать ненужное в длинных последовательностях.

Зачем

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

Если последовательность длинная:

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

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

Ключевая идея LSTM

Внутри LSTM есть специальное состояние — память. На каждом шаге модель решает, что сохранить, что забыть, а что передать дальше. Это достигается с помощью внутренних механизмов (часто говорят «вентили»), которые управляют потоком информации.

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

LSTM хорошо подходят для:

  • временных рядов;
  • анализа текста;
  • распознавания речи;
  • обработки логов и сигналов;
  • предсказаний, где важен контекст.

Сегодня их часто заменяют трансформеры, но LSTM всё ещё проще и дешевле.

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

Пример простой модели для последовательных данных.

import torch
import torch.nn as nn

Модель

class SimpleLSTM(nn.Module):
    def __init__(self, input_size, hidden_size, output_size):
        super().__init__()
        self.lstm = nn.LSTM(
            input_size=input_size,
            hidden_size=hidden_size,
            batch_first=True
        )
        self.fc = nn.Linear(hidden_size, output_size)

    def forward(self, x):
        # x: (batch, time, features)
        out, _ = self.lstm(x)
        # берём последний шаг
        out = out[:, -1, :]
        out = self.fc(out)
        return out


# пример данных:
# 32 объекта, 10 временных шагов, 5 признаков
x = torch.randn(32, 10, 5)

model = SimpleLSTM(
    input_size=5,
    hidden_size=16,
    output_size=1
)

y = model(x)
print(y.shape)
# torch.Size([32, 1])

Ограничения LSTM

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