Модуль 7: Работа с последовательностями. RNN и LSTM
До сих пор мы рассматривали модели, для которых порядок объектов не важен: каждый пример — набор признаков, и соседние строки в таблице не связаны. Но текст, речь, временные ряды и последовательности событий устроены иначе: важен не только набор элементов, но и их порядок. Слово «не» перед «хорошо» меняет смысл; завтрашняя цена акции зависит от вчерашней. Для таких данных нужны архитектуры, которые явно учитывают последовательность и способны хранить контекст.
Задача модуля: подготовить почву для понимания текста и контекста: ввести идею последовательных данных, рекуррентных сетей (RNN), проблемы долгосрочной памяти и её решение — LSTM. Эти концепции исторически предшествовали трансформерам и до сих пор встречаются в задачах на временные ряды и в старых моделях для NLP.
Что разберём
- Последовательные данные — почему порядок важен и чего не хватает «мешку слов».
- RNN — скрытое состояние, развёртка во времени, общие веса.
- Проблема долгосрочной памяти — затухание градиента по времени.
- LSTM — вентили и ячейка, как сохраняется контекст на длинных последовательностях.
7.1 Природа последовательных данных
Текст — это последовательность слов или символов; временной ряд — последовательность измерений во времени; аудио — последовательность сэмплов. В таких данных смысл или закономерность часто определяются не только набором элементов, но и тем, в каком порядке они идут. «Кот съел мышь» и «Мышь съела кота» — разный смысл при тех же словах. В рядах котировок тренд и волатильность зависят от предыстории.
Обычная полносвязная сеть или «мешок слов» (bag of words) порядок не учитывают: объект представляется как вектор признаков, и перестановка слов или моментов времени не меняет представление. В результате теряется контекст и зависимость от прошлого. Для последовательностей нужна архитектура, которая явно передаёт информацию вдоль оси времени (или позиции в тексте) и позволяет модели «помнить» то, что было раньше.
Рекуррентные сети и их развитие — LSTM — как раз и были призваны дать модели такую память: на каждом шаге выход зависит не только от текущего входа, но и от скрытого состояния, несущего информацию о предыдущих шагах.
7.2 Рекуррентные нейросети (RNN)
Идея RNN — ввести скрытое состояние (hidden state) h, которое передаётся с шага на шаг и играет роль памяти. На каждом временном шаге t сеть получает входной вектор xt и предыдущее скрытое состояние ht−1, по ним вычисляет новое состояние ht и при необходимости выход yt. Одна и та же функция (одни и те же веса) применяется на каждом шаге: сеть как бы «развёрнута» во времени, но веса общие для всех моментов. Так модель может использовать информацию из прошлого — в пределах того, что удаётся пронести через цепочку обновлений.
Математически типичное обновление: ht = σ(Wxh xt + Whh ht−1 + b), где σ — нелинейная активация (например, tanh), а веса Wxh, Whh и смещение b общие для всех t. Выход может быть, например, линейным преобразованием от ht. Обучение выполняется обратным распространением во времени (BPTT): градиент loss распространяется от последнего шага к первому через цепочку скрытых состояний.
RNN позволяют обрабатывать последовательности переменной длины и являются естественным выбором для задач, где контекст важен: предсказание следующего символа, классификация предложения, простые модели временных рядов. Ограничение — на длинных последовательностях «память» о начале цепочки теряется из-за затухания градиента.
7.3 Проблема долгосрочной памяти
В простой RNN при обратном распространении по времени градиент проходит через длинную цепочку умножений на матрицы и производные активаций. Если производные по модулю меньше единицы (как у сигмоиды и tanh), градиент с каждым шагом назад затухает: на ранних временных шагах он становится столь мал, что веса почти не обновляются, и модель «не помнит» далёкое прошлое. В крайних случаях градиент, наоборот, взрывается (экспоненциальный рост), и обучение становится неустойчивым.
Практически это означает: для длинных предложений или длинных временных рядов простая RNN плохо улавливает зависимости между далёкими элементами. Чтобы модель могла опираться на контекст из многих шагов назад, нужен механизм, который проводит информацию через время с минимальным затуханием. Именно это и реализует LSTM за счёт отдельной «ячейки» и вентилей.
7.4 LSTM (Long Short-Term Memory)
LSTM — архитектура рекуррентной ячейки, разработанная специально для сохранения долгосрочных зависимостей. Помимо скрытого состояния h, в LSTM вводится отдельный вектор — состояние ячейки (cell state) C. Его можно представлять как «долгую память»: информация по нему проходит через время с минимальными изменениями, а три вентиля (gates) решают, что забыть, что записать и что выдать наружу.
Вентиль забывания (forget gate) определяет, какую долю текущего состояния ячейки сохранить: смотрит на вход и предыдущее скрытое состояние и выдаёт числа от 0 до 1 для каждого элемента C. Вентиль входа (input gate) решает, какую новую информацию добавить в ячейку. Вентиль выхода (output gate) решает, какую часть состояния ячейки выдать в качестве скрытого состояния h, от которого зависят выходы модели. Все вентили обучаются из данных, так что модель сама учится, когда «забывать», «запоминать» и «отдавать».
Благодаря линейному прохождению информации по ячейке (с минимальным затуханием) и обучению вентилей LSTM способен сохранять контекст на длинных последовательностях и в значительной степени решает проблему затухающего градиента в RNN. LSTM долгое время был основой моделей для машинного перевода, суммаризации и прогноза временных рядов. Сейчас во многих задачах на текст его вытеснили трансформеры с механизмом внимания, но для рядов и в ресурсоограниченных сценариях LSTM по-прежнему широко используется.
Связь с курсом: понимание RNN и LSTM помогает читать старые статьи по NLP и разбираться в архитектурах «encoder–decoder». Трансформеры (модуль 8) отказываются от последовательного прохода по времени и заменяют его вниманием по всем позициям сразу.