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

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

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

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

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

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

ct=ft⊙ct−1+it⊙c~tc_t = f_t \odot c_{t-1} + i_t \odot \tilde c_t

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

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

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

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

ht=ot⊙tanh⁡(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 раз - равен

τ≈−1ln⁡f\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=ft⊙ct−1+it⊙c~tc_t = f_t \odot c_{t-1} + i_t \odot \tilde c_t нелинейности к самому ctc_t нет - это и есть секрет незатухающего градиента. tanh⁡\tanh применяется к кандидату и к выходу, но не к магистрали.
  • Думать, что вентили - это отдельные слои. Все четыре преобразования (три вентиля и кандидат) считаются параллельно из одного и того же входа [ht−1,xt][h_{t-1}, x_t], просто с разными весами.
  • Забывать про инициализацию bfb_f. Нулевое смещение даёт f≈0.5f \approx 0.5 и короткую память на старте обучения; положительный сдвиг помогает сети сразу удерживать длинные зависимости.

FAQ

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

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

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

Коротко

Сеть долгой краткосрочной памяти LSTM хранит информацию в отдельной магистрали - состоянии ячейки ctc_t, которое обновляется аддитивно по формуле ct=ft⊙ct−1+it⊙c~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

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

Агрегатные функции SQL: COUNT, SUM, AVG и GROUP BY

Агрегатные функции SQL: COUNT, SUM, AVG и GROUP BY

Как работают агрегатные функции SQL: COUNT, SUM, AVG, MIN и MAX, группировка GROUP BY, порядок выполнения запроса, разница HAVING и WHERE и поведение NULL внутри агрегата.

24 сентября 20269 минут
Интегральный синус Si(x): ряд Тейлора и максимум

Интегральный синус Si(x): ряд Тейлора и максимум

Интегральный синус Si(x): почему интеграл sin t / t не берётся в элементарных функциях, разложение в ряд, предел π/2, максимум Si(π) и выброс Гиббса. С калькулятором.

24 сентября 202610 минут
Куча как структура данных: массив и просеивание

Куча как структура данных: массив и просеивание

Куча как структура данных: свойство кучи, хранение в обычном массиве и индексы 2i+1 и 2i+2, просеивание sift-up и sift-down, построение за O(n) и приоритетная очередь.

24 сентября 202610 минут
Линейная зависимость векторов: критерии и примеры

Линейная зависимость векторов: критерии и примеры

Что такое линейная зависимость векторов, как проверить её определителем и рангом матрицы, чем коллинеарность отличается от компланарности и как всё это связано с базисом.

24 сентября 202610 минут
Линейное уравнение второго порядка: общее решение

Линейное уравнение второго порядка: общее решение

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

24 сентября 202612 минут
Метод вариации постоянных: формулы и разбор примера

Метод вариации постоянных: формулы и разбор примера

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

24 сентября 202611 минут