В современной индустрии искусственного интеллекта доминируют трансформеры, однако основы работы с последовательностями были заложены гораздо раньше. В рамках курса Stanford CS231N (весна 2025) прошла лекция, посвященная рекуррентным нейронным сетям (RNN) — архитектурам, которые, несмотря на возраст, переживают своеобразный ренессанс в виде современных моделей вроде Mamba.
🔄 Основы рекуррентных нейронных сетей 7:22
В отличие от стандартных нейронных сетей с фиксированным размером входа и выхода, рекуррентные нейронные сети (RNN) предназначены для обработки последовательностей переменной длины . Ключевая особенность RNN — наличие внутреннего (скрытого) состояния ($h$), которое обновляется на каждом временном шаге по мере обработки данных.
Спикер выделяет несколько типов задач моделирования последовательностей:
- Один ко многим: Вход фиксированного размера (например, изображение), выход — последовательность (описание изображения словами) .
- Многие к одному: Вход — последовательность (кадры видео), выход — фиксированный вектор (класс действия в видео) .
- Многие ко многим: Последовательность на входе и на выходе (задачи машинного перевода или пофреймовая классификация видео) .
Математически простейшая (Vanilla) RNN описывается формулой, где новое скрытое состояние $h_t$ зависит от предыдущего состояния $h_{t-1}$ и текущего входа $x_t$, пропущенных через функцию активации (обычно $tanh$) . Принципиально важно, что на каждом шаге используются одни и те же веса ($W$), что обеспечивает симметрию и позволяет модели обрабатывать последовательности любой длины .
🏗️ Анатомия forward-прохода: ручная сборка RNN 14:00
Для демонстрации работы алгоритма лектор приводит пример «игрушечной» задачи: детектирование двух идущих подряд единиц в потоке битов. Если на вход поступает последовательность 0, 1, 1, 0, модель должна вывести 1 на третьем шаге .
В этом примере скрытое состояние должно хранить информацию о предыдущем и текущем битах. Спикер показывает, как сконструировать весовые матрицы вручную, не прибегая к обучению :
- Матрица $W_{xh}$ преобразует вход и записывает его в скрытое состояние.
- Матрица $W_{hh}$ переносит значение текущего входа в ячейку «предыдущего» для следующего шага .
- Выход вычисляется как линейная комбинация значений скрытого состояния с последующей активацией ReLU .
Хотя в реальности веса ищутся градиентным спуском, этот пример наглядно иллюстрирует, как RNN «запоминает» контекст через передачу вектора состояния от шага к шагу .
📉 Обучение и проблема обратного распространения во времени 24:11
Обучение RNN осложняется тем, что один и тот же набор весов используется многократно. Ведущий объясняет механизм Backpropagation Through Time (BPTT): градиенты вычисляются для каждого временного шага, а затем суммируются для обновления общей матрицы весов .
Основная практическая проблема — нехватка памяти GPU при работе с очень длинными последовательностями. Для решения этой задачи используется «усеченное» обратное распространение (Truncated BPTT) :
- Вся последовательность разбивается на блоки (например, по 100 шагов).
- Для текущего блока вычисляется forward-проход, начиная со скрытого состояния, оставшегося от предыдущего блока .
- Градиенты вычисляются и применяются только внутри этого окна, не распространяясь до самого начала всей цепочки .
🔠 Символьные языковые модели и их «необъяснимая эффективность» 36:39
В 2015 году Андрей Карпати (Andrej Karpathy), бывший инструктор этого курса, опубликовал статью о «необъяснимой эффективности» RNN. Он показал, что простая рекуррентная сеть, предсказывающая следующий символ в тексте, может научиться писать стихи «под Шекспира» или генерировать синтетический код на C .
В ходе обучения такая модель проходит несколько стадий:
- Начальная: полная бессмыслица, случайный набор букв .
- Средняя: появление пробелов, слов, похожих на английские, пунктуации.
- Продвинутая: соблюдение структуры (имена персонажей в пьесах, открывающиеся и закрывающиеся скобки в коде) .
Анализ активаций нейронов в таких сетях выявил удивительную интерпретируемость. Спикер демонстрирует «нейроны-детекторы», которые активируются только внутри кавычек, при увеличении глубины вложенности кода (отступы) или при приближении конца строки . Это доказывает, что RNN внутренне формируют сложные абстракции для отслеживания контекста .
🧱 От Vanilla RNN к LSTM и современным State Space Models 58:27
Классические RNN страдают от проблемы затухающих градиентов (vanishing gradients). При перемножении малых значений в длинной цепочке $tanh$-активаций сигнал о классификации на конце последовательности просто не доходит до первых слоев .
Для борьбы с этим в 1990-х была создана архитектура LSTM (Long Short-Term Memory). Вместо одного скрытого состояния она использует сложную систему «ворот» (gates) :
- Forget gate: решает, какую часть информации из прошлого стоит забыть.
- Input gate: определяет, что из текущего входа записать в память.
- Output gate: контролирует, что выдать наружу.
В LSTM создается своеобразная «информационная магистраль», по которой данные могут течь через сотни шагов без применения нелинейных функций активации, что резко снижает риск затухания градиента . Спикер проводит параллель между этой структурой и skip-connections в архитектуре ResNet .
В завершение лекции ведущий отмечает, что идеи RNN возвращаются в виде State Space Models (SSM) и моделей вроде Mamba . Они решают главную проблему трансформеров — квадратичную сложность вычислений при росте длины контекста. RNN и SSM имеют линейную сложность и теоретически неограниченное окно контекста, что делает их крайне перспективными для задач будущего, требующих обработки гигантских объемов данных .