Перейти к содержанию
Публикация AiManual

LSTM: как работает долгая краткосрочная память и зачем она нужна в 2026 году

LSTM решает проблему долгосрочных зависимостей за счёт состояния ячейки и трёх гейтов. Разбираем, как forget, input и output gate управляют памятью, чем GRU отл

Коротко

Что будет в материале

  1. 01

    Зачем вообще нужны рекуррентные нейронные сети

  2. 02

    Проблема долгосрочных зависимостей: где РНС ломается

  3. 03

    Как устроена LSTM: состояние ячейки и три гейта

  4. 04

    Варианты архитектуры: peephole, связанные гейты и GRU

LSTM (Long Short-Term Memory, долгая краткосрочная память) - разновидность рекуррентных нейронных сетей, где информация хранится в отдельном состоянии ячейки, а доступ к ней регулируют три гейта: утраты, входа и выхода. Гейты решают, что стереть, что записать и что выдать на текущем шаге. За счёт этого сеть удерживает связь между событиями, разнесёнными на сотни шагов, там, где обычная РНС уже теряет контекст.

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

Дальше разберём, почему простые сети не справляются с последовательностями, где именно ломается обычная РНС, как гейты LSTM обходят это ограничение, какие есть модификации архитектуры и что из этого стоит применять в 2026 году.

Зачем вообще нужны рекуррентные нейронные сети

Почему обычная нейросеть «не помнит» предыдущий шаг

Полносвязная или свёрточная сеть обрабатывает вход как самостоятельный объект. Внутри нет ничего, что связало бы текущий вход с предыдущим: каждый пример проходит через одни и те же веса независимо от того, что было раньше.

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

Ограничение не в размере модели. Механизма передачи состояния между шагами просто нет, и увеличение числа параметров его не создаёт.

Как цикл РНС сохраняет информацию между шагами

Рекуррентная сеть добавляет цикл: часть выхода шага возвращается на вход следующего. Развёрнутая во времени структура выглядит как несколько копий одной и той же сети, каждая передаёт сообщение следующей, и именно поэтому рекуррентные сети тесно связаны с последовательностями и списками (обзор по LSTM).

Носитель этой памяти - скрытое состояние, вектор фиксированной длины. На каждом шаге сеть получает новый элемент последовательности и предыдущее скрытое состояние, а выдаёт обновлённое состояние и выход. Вектор работает как сжатое описание всего, что сеть уже видела, и обновляется на каждом шаге.

Формально это выглядит так: h_t = tanh(W_x · x_t + W_h · h_{t-1} + b). Одна и та же матрица весов применяется на всех шагах, поэтому число параметров не растёт с длиной последовательности. В этом и сила, и слабость подхода.

Проблема долгосрочных зависимостей: где РНС ломается

Пока разрыв между нужной информацией и точкой её применения мал, РНС справляется. Предсказать последнее слово в словосочетании «облака в небе» легко: весь нужный контекст рядом. Другое дело - фраза «Я вырос во Франции … Я свободно говорю на французском»: чтобы предсказать слово «французском», сеть должна вспомнить упоминание Франции, отделённое десятками шагов. По мере роста такого разрыва РНС теряет связь между информацией (разбор проблемы долгосрочных зависимостей).

Это фундаментальное ограничение обучения, а не дефект конкретной реализации. Работы Hochreiter (1991) и Bengio et al. (1994) зафиксировали его как свойство рекуррентных сетей: зависимости на большом временном расстоянии выучить экспоненциально труднее, чем короткие.

Затухание градиента простыми словами

При обучении ошибка распространяется назад по развёрнутой во времени сети. Градиент по ранним шагам равен произведению многих матриц (якобианов перехода состояния). Если нормы этих множителей стабильно меньше единицы, произведение убывает экспоненциально с расстоянием: далёкие шаги получают почти нулевой сигнал и практически не обучаются.

Обратная ситуация - взрыв градиента: когда нормы множителей больше единицы, сигнал растёт и обучение разваливается из-за численной нестабильности. Обе проблемы проявляются тем сильнее, чем длиннее последовательность при обучении.

Практический вывод: обычная РНС физически не может «захотеть» помнить далёкое прошлое. Нужен механизм, который проводит сигнал через много шагов почти без изменений, и LSTM этот механизм предлагает.

Как устроена LSTM: состояние ячейки и три гейта

Архитектуру предложили Hochreiter и Schmidhuber в 1997 году. Ключевое отличие от базовой РНС - отдельная линия состояния ячейки c_t, которая идёт через все шаги и меняется только под действием гейтов. Гейт - это слой с сигмоидой, выдающий значения между 0 и 1: 0 означает «закрыть», 1 означает «пропустить».

f_t = σ(W_f · [h_{t-1}, x_t] + b_f)   # гейт утраты
 i_t = σ(W_i · [h_{t-1}, x_t] + b_i)   # гейт входа
o_t = σ(W_o · [h_{t-1}, x_t] + b_o)   # гейт выхода
c_t = f_t ⊙ c_{t-1} + i_t ⊙ tanh(W_c · [h_{t-1}, x_t] + b_c)
h_t = o_t ⊙ tanh(c_t)

Здесь x_t - вход текущего шага, h_{t-1} - предыдущее скрытое состояние, ⊙ - поэлементное умножение. Состояние ячейки обновляется сложением, а не умножением, и это принципиально: градиент идёт по линии состояния почти без затухания. В литературе этот путь называют constant error carousel.

Гейт утраты: что стереть из памяти

Представьте блокнот, куда пишутся факты по ходу чтения текста. Если ничего не вычёркивать, через пару абзацев там не останется места и нужную мысль будет не найти. Гейт утраты решает, какая доля предыдущего состояния ячейки сохраняется: f_t около 0 стирает, около 1 оставляет без изменений.

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

Гейт входа: что записать нового

Гейт входа определяет, какие элементы новой информации попадут в состояние. Кандидат на запись считается через tanh, а i_t фильтрует его: часть значений проходит, часть отбрасывается.

Во фразе «Я вырос во Франции …» при слове «Франции» полезно записать сам факт в долгую память, чтобы через десятки токенов использовать его для предсказания слова «французском». Гейт входа делает такую запись управляемой, а не автоматической.

Гейт выхода: что выдать на текущем шаге

Гейт выхода фильтрует tanh(c_t) и формирует скрытое состояние h_t. Здесь важно не путать две сущности: состояние ячейки - внутренняя долгая память, которая может хранить информацию много шагов, а скрытое состояние - то, что видит следующий шаг и следующий слой. Одно и то же состояние ячейки на разных шагах даёт разные выходы, потому что гейт выхода каждый раз решает заново, что показать наружу.

Варианты архитектуры: peephole, связанные гейты и GRU

За почти тридцать лет базовую схему неоднократно правили. LSTM с «глазком» (Gers & Schmidhuber, 2000) добавляет гейтам доступ к самому состоянию ячейки c_{t-1}, а не только к скрытому состоянию. Это помогает в задачах, где важны точные интервалы и подсчёт шагов: гейт видит, сколько уже накоплено.

Связанные гейты (coupled gates) объединяют решения об утрате и записи в один сигнал: f_t = 1 - i_t. Сеть не может одновременно много стереть и много записать, зато параметров меньше, а поведение стабильнее.

GRU (Cho et al., 2014) пошёл дальше: два гейта вместо трёх (обновления и сброса) и никакого отдельного состояния ячейки. Скрытое состояние несёт обе функции сразу.

Масштабные сравнения показали, что выбор версии влияет меньше, чем принято думать. Greff et al. (2015) прогнали популярные модификации LSTM на едином протоколе и не нашли варианта, который стабильно превосходит стандартный. Jozefowicz et al. (2015) перебрали тысячи конфигураций рекуррентных архитектур и тоже не обнаружили решающего преимущества одной схемы, зато отметили влияние простых деталей вроде инициализации смещения гейта утраты положительным значением: так сеть с первых шагов чаще сохраняет, а не стирает.

Похожая логика работает и в обратную сторону: если заменить математику гейтов на что-то своё, результат может измениться непредсказуемо. В разборе альтернативной Gated RNN вместо LSTM и GRU автор заменил tanh и сигмоиду на softsign и убрал constant error carousel: на его замерах модель обошла LSTM и GRU в одной синтетической задаче, но училась вдвое дольше и осталась чувствительной к seed.

LSTM vs GRU: что выбрать на практике

КритерийLSTMGRU
ГейтыТри: утраты, входа, выходаДва: обновления, сброса
Состояние ячейкиОтдельное, независимое от скрытогоНет, всё в скрытом состоянии
Число параметровБольше при том же размере hiddenМеньше, примерно на четверть
Скорость обученияНижеОбычно выше
Контроль памятиТоньше: удержание и выдача разделеныГрубее

Рабочее правило без догм: на малых данных и жёстких лимитах по времени начинайте с GRU, она быстрее выходит на приемлемое качество. Переходите к LSTM, если нужен отдельный долгий канал памяти, тонкая настройка удержания или если архитектура уже задана требованиями проекта. Разница между ними на практике чаще объясняется подбором гиперпараметров, чем самой схемой гейтов.

Какие задачи LSTM решает на практике

Классический набор применений описан в обзорах по теме: распознавание речи, языковое моделирование, машинный перевод и описание изображений. С использованием LSTM связаны основные результаты, полученные на рекуррентных сетях (источник по применению LSTM).

  • Распознавание речи. Звук приходит кадрами, и смысл фонемы зависит от соседних: память нужна, чтобы различать похожие звуки по контексту.
  • Языковое моделирование. Вероятность следующего токена зависит от всей предыдущей истории, включая давно упомянутые сущности.
  • Машинный перевод. Порядок слов и согласование могут разъезжаться на всю длину предложения, особенно при разной структуре языков.
  • Описание изображений. Модель генерирует подпись слово за словом, помня и содержимое картинки, и то, что уже сказала.

LSTM для временных рядов

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

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

Как обучить LSTM: PyTorch, TensorFlow и типичные грабли

Стандартные реализации есть в обоих основных фреймворках: torch.nn.LSTM и tf.keras.layers.LSTM. В PyTorch блок принимает тензор формы (batch, seq_len, input_size) при batch_first=True и возвращает выходы по всем шагам плюс кортеж из финального скрытого состояния и состояния ячейки.

import torch
from torch import nn

lstm = nn.LSTM(input_size=128, hidden_size=256, num_layers=2,
               batch_first=True, dropout=0.1)
x = torch.randn(32, 50, 128)      # batch, seq_len, features
out, (h_n, c_n) = lstm(x)
print(out.shape)   # 32, 50, 256
print(h_n.shape)   # 2, 32, 256

В TensorFlow аналог выглядит короче: tf.keras.layers.LSTM(256, return_sequences=True). Атрибут return_sequences решает, отдавать ли выходы всех шагов или только последний.

Типичные проблемы обучения известны: переобучение на малых данных (лечится dropout, weight decay, ранней остановкой), слишком длинные последовательности в одном батче (память и время растут линейно), нестабильные градиенты. Отдельно стоит усечение последовательностей: truncated BPTT режет ряд на куски по 50-200 шагов, а скрытое состояние переносится между кусками через detach(), чтобы не тянуть граф вычислений на всю длину.

Затухание и взрыв градиента при обучении LSTM

LSTM смягчает затухание, но не отменяет его полностью: гейт утраты может почти закрыться, и тогда длинная память тоже перестаёт проводить сигнал. Взрыв градиента остаётся вполне реальным сценарием при высоком learning rate или неудачной инициализации.

  • Клиппинг градиента: torch.nn.utils.clip_grad_norm_(model.parameters(), 1.0) перед шагом оптимизатора.
  • Аккуратный learning rate с разогревом на первых эпохах.
  • Нормализация входных признаков: ряд с разбросом в тысячи единиц плохо сочетается с сигмоидами.
  • Инициализация смещения гейта утраты положительным значением, чтобы сеть на старте сохраняла, а не стирала.

Нужна ли LSTM в 2026 году: место на фоне трансформеров

Прямой ответ: LSTM не умерла, но перестала быть выбором по умолчанию для текста и речи. Там доминируют трансформеры и механизм внимания. При этом в задачах с малыми данными, жёсткими лимитами по ресурсам и потоковой обработкой LSTM по-прежнему отрабатывает свою цену.

Где LSTM проигрывает трансформерам

Внимание связывает любые две позиции последовательности напрямую, независимо от расстояния между ними. LSTM передаёт информацию только через цепочку шагов: чтобы связать первое и последнее слово, сигналу нужно пройти всю цепочку. На длинном контексте это заметно.

Второе отличие - параллелизм. Трансформер при обучении обрабатывает всю последовательность одновременно, LSTM считает шаги последовательно, и GPU простаивает на каждой зависимости. На больших корпусах это даёт разницу в скорости обучения и, как следствие, в итоговом качестве. История перехода от рекуррентных схем к вниманию разобрана в материале о том, как AI-чаты научились понимать контекст: Seq2Seq с вниманием, затем Transformer, затем LLM.

Где LSTM всё ещё уместна

  • Малые данные. Когда примеров тысячи, а не миллиарды, меньшая модель с индуктивным смещением на порядок последовательности часто устойчивее.
  • Ограниченные вычисления и память. Скрытое состояние фиксированного размера даёт предсказуемое потребление памяти на шаг.
  • Потоковая обработка с низкой задержкой. Обработка по одному элементу без пересчёта всей истории подходит для онлайн-сигналов и встраиваемых устройств.
  • Классические задачи временных рядов. Прогноз и детекция аномалий в телеметрии, где данных немного и важна интерпретируемость.

Идея сжатого состояния никуда не делась: линейные и гибридные архитектуры (RWKV, Mamba и подобные) решают ту же задачу - длинный контекст при линейной сложности, но другими средствами. Чистая LSTM там не используется, зато её логика «состояние плюс управляемая запись» лежит в основе многих решений.

Итог: что запомнить про LSTM

  • LSTM решает проблему долгосрочных зависимостей через состояние ячейки и три гейта: утраты, входа и выхода.
  • Линия состояния обновляется сложением, поэтому градиент идёт по ней без экспоненциального затухания.
  • Peephole, связанные гейты и GRU дают сопоставимое качество: по данным Greff et al. (2015) и Jozefowicz et al. (2015) ни одна схема не побеждает стабильно.
  • Затухание и взрыв градиента остаются: клиппинг, усечение последовательностей и нормализация входа нужны и здесь.
  • В 2026 году LSTM - не дефолт для текста и речи, но рабочий инструмент для малых данных, edge-устройств, потоковой обработки и временных рядов.

Практический шаг: сформулируйте ограничения задачи до выбора архитектуры. Если данных мало, а железо скромное, начните с GRU и измерьте качество на валидации. Если нужен контроль над долгой памятью и модель уже рекуррентная, берите LSTM. Если работаете с длинными текстами и большими корпусами, сравните с трансформером: на таком масштабе он обычно выигрывает, и проверять это стоит на своём наборе данных, а не на общих обещаниях.

Подписаться на канал