EssayAI
Блог
Блог
Математика и алгоритмы

Сеть долгой краткосрочной памяти LSTM: вентили и состояние

20 июня 2026Время чтения: 7 минут
#LSTM#рекуррентные сети#вентиль забывания#затухающий градиент#состояние ячейки
Сеть долгой краткосрочной памяти LSTM: вентили и состояние

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

Зачем понадобилась долгая краткосрочная память

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

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

Магистраль состояния ячейки LSTM с тремя вентилями, регулирующими поток памяти
Магистраль состояния ячейки LSTM с тремя вентилями, регулирующими поток памяти

Состояние ячейки и три вентиля

Сердце LSTM - это состояние ячейки ctc_t и три вентиля (gates). Вентиль - это вектор чисел от 0 до 1, полученный через сигмоиду σ\sigma; он умножается покомпонентно на другой вектор и работает как набор «кранов»: 0 закрывает поток, 1 пропускает целиком.

Три вентиля решают три разные задачи:

  • Вентиль забывания ftf_t - сколько старой памяти оставить: ft=σ(Wf[ht1,xt]+bf)f_t = \sigma(W_f [h_{t-1}, x_t] + b_f).
  • Входной вентиль iti_t - сколько новой информации записать: it=σ(Wi[ht1,xt]+bi)i_t = \sigma(W_i [h_{t-1}, x_t] + b_i).
  • Выходной вентиль oto_t - сколько из состояния ячейки выпустить наружу как скрытый выход: ot=σ(Wo[ht1,xt]+bo)o_t = \sigma(W_o [h_{t-1}, x_t] + b_o).

Здесь [ht1,xt][h_{t-1}, x_t] - конкатенация предыдущего скрытого состояния и нового входа; у каждого вентиля свои обучаемые веса WW и смещение bb. Калькулятор выше как раз показывает, во что превращаются логиты (значения до сигмоиды) после активации, и как от этого зависит дальнейшее поведение ячейки.

Кандидат состояния и обновление памяти

Кроме вентилей, ячейка вычисляет кандидата состояния c~t\tilde c_t - что в принципе можно было бы записать в память на этом шаге:

c~t=tanh(Wc[ht1,xt]+bc)\tilde c_t = \tanh(W_c [h_{t-1}, x_t] + b_c)

Гиперболический тангенс даёт значения в диапазоне от 1-1 до 11, то есть кандидат может как увеличивать, так и уменьшать компоненты памяти. Само обновление состояния ячейки - ключевая формула LSTM:

ct=ftct1+itc~tc_t = f_t \odot c_{t-1} + i_t \odot \tilde c_t

Символ \odot - покомпонентное (адамарово) умножение. Читается это так: новое состояние = (сколько оставили от старого) + (сколько записали нового). Если ft1f_t \approx 1 и it0i_t \approx 0, ячейка почти буквально копирует прошлую память дальше - сигнал едет по магистрали без изменений. Если ft0f_t \approx 0, прошлое стирается, и память начинается «с чистого листа».

Схема обновления памяти LSTM: старое состояние умножается на вентиль забывания и складывается с записанным кандидатом
Схема обновления памяти LSTM: старое состояние умножается на вентиль забывания и складывается с записанным кандидатом

Скрытый выход и роль выходного вентиля

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

ht=ottanh(ct)h_t = o_t \odot \tanh(c_t)

Сначала состояние ячейки сжимается через tanh\tanh в диапазон [1,1][-1, 1], затем выходной вентиль решает, какие компоненты этой памяти важны прямо сейчас. Так LSTM может хранить в ctc_t много всего, но выдавать на каждом шаге только релевантную часть. Именно hth_t уходит на следующий шаг и в выходной слой сети (например, для предсказания следующего слова).

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

Почему LSTM побеждает затухающий градиент

Главная причина устойчивости - аддитивное обновление по магистрали ctc_t. При обратном распространении ошибки через много шагов градиент по состоянию ячейки умножается в основном на вентиль забывания ftf_t, а не на производную сжимающей нелинейности. Если сеть научилась держать ftf_t около единицы для нужной компоненты, произведение tft\prod_t f_t не схлопывается к нулю - путь для градиента остаётся открытым.

Удобная интуиция: записанный сигнал к шагу tt ослабляется примерно как ftf^t. Горизонт памяти - число шагов, за которое сигнал падает в ee раз - равен

τ1lnf\tau \approx -\frac{1}{\ln f}

При f=0.5f = 0.5 горизонт всего около полутора шагов, при f=0.95f = 0.95 - почти 20 шагов, при f=0.99f = 0.99 - около ста. Сдвиньте слайдер вентиля забывания в калькуляторе и посмотрите на кривую затухания: она наглядно показывает, как одно число управляет длиной памяти. На практике, чтобы LSTM «по умолчанию» помнил, смещение bfb_f часто инициализируют положительным - тогда в начале обучения вентиль забывания близок к единице.

Частые ошибки

  • Путать состояние ячейки ctc_t и скрытое состояние hth_t. ctc_t - внутренняя память, течёт по магистрали; hth_t - отфильтрованный выходным вентилем сигнал наружу. На следующий шаг идут оба, но в выходной слой - только hth_t.
  • Считать, что вентиль забывания «забывает». Наоборот: ft=1f_t = 1 означает «помнить полностью», ft=0f_t = 0 - «стереть». Имя про то, сколько оставить, а не сколько выбросить.
  • Применять tanh\tanh к состоянию ячейки при его обновлении. В формуле ct=ftct1+itc~tc_t = f_t \odot c_{t-1} + i_t \odot \tilde c_t нелинейности к самому ctc_t нет - это и есть секрет незатухающего градиента. tanh\tanh применяется к кандидату и к выходу, но не к магистрали.
  • Думать, что вентили - это отдельные слои. Все четыре преобразования (три вентиля и кандидат) считаются параллельно из одного и того же входа [ht1,xt][h_{t-1}, x_t], просто с разными весами.
  • Забывать про инициализацию bfb_f. Нулевое смещение даёт f0.5f \approx 0.5 и короткую память на старте обучения; положительный сдвиг помогает сети сразу удерживать длинные зависимости.

FAQ

Чем LSTM отличается от обычной RNN? В простой RNN скрытое состояние на каждом шаге целиком пропускается через сжимающую нелинейность, из-за чего градиент затухает на длинных последовательностях. LSTM добавляет отдельную магистраль состояния ячейки с аддитивным обновлением и три вентиля, которые управляют потоком памяти. Это позволяет хранить зависимости на десятки и сотни шагов.

Что такое вентиль забывания и зачем он нужен? Это вектор значений от 0 до 1, который покомпонентно умножается на прошлое состояние ячейки. Он решает, какую часть старой памяти сохранить, а какую стереть. Значение около единицы означает «помнить долго», около нуля - «начать заново». Именно произведение вентилей забывания вдоль шагов определяет, насколько далеко назад тянется память.

Чем LSTM отличается от GRU? GRU (Gated Recurrent Unit) - облегчённая версия с двумя вентилями вместо трёх и без отдельного состояния ячейки: память и скрытое состояние объединены. GRU обучается быстрее и имеет меньше параметров, часто показывает сопоставимое качество. LSTM же даёт более гибкое разделение «что хранить» и «что выдавать», что иногда важно на сложных длинных зависимостях.

Коротко

Сеть долгой краткосрочной памяти LSTM хранит информацию в отдельной магистрали - состоянии ячейки ctc_t, которое обновляется аддитивно по формуле ct=ftct1+itc~tc_t = f_t \odot c_{t-1} + i_t \odot \tilde c_t. Три вентиля решают, что забыть (вентиль забывания ftf_t), что записать (входной iti_t) и что выдать наружу (выходной oto_t). Поскольку к магистрали памяти не применяется сжимающая нелинейность, градиент по ней не затухает, и сеть удерживает зависимости на десятки шагов - там, где простая RNN всё забывает. Горизонт памяти задаётся вентилем забывания: чем ближе ftf_t к единице, тем дольше живёт сигнал.

Доверьте текст нейросети EssayAI

Открыть EssayAI

Бесплатно, на русском языке и без VPN

Читайте также