Что такое Recurrent Depth в контексте LLM и зачем это нужно?
Краткий тезис
Recurrent Depth — это архитектурный приём, при котором один и тот же слой или блок трансформера многократно применяется на этапе инференса (теста), эффективно «разворачивая» модель на произвольную глубину. В отличие от обычного увеличения числа слоёв, это не требует дополнительных параметров, но позволяет модели выполнять более глубокие рассуждения, особенно в задачах математики, кода и многошагового планирования. Исследование Geiping et al. (2025) показало, что модель с 3.5B параметров, использующая recurrent depth, достигает результатов, сравнимых с моделями в 10 раз большего размера на сложных задачах.
1. Термин: Recurrent Depth (рекуррентная глубина)
Recurrent Depth — это концепция, заимствованная из рекуррентных нейронных сетей (RNN), но применённая к трансформерам. В стандартном трансформере каждый слой имеет уникальные веса, и глубина фиксирована (например, 32 слоя). В архитектуре с recurrent depth один слой (или блок слоёв) используется повторно — его выход подаётся на вход тому же слою несколько раз. На этапе обучения веса слоя оптимизируются для работы в течение фиксированного числа итераций (например, 4), а на этапе теста число итераций может быть увеличено (например, до 8, 16 или больше), что даёт дополнительную глубину без роста числа параметров.
Зачем это нужно
- Масштабирование рассуждений (reasoning scaling): сложные задачи (математика, генерация кода, многошаговые планы) требуют глубоких цепочек рассуждений. Recurrent depth позволяет динамически увеличивать глубину на этапе теста, не переобучая модель.
- Экономия параметров: вместо того чтобы учить 100 слоёв, можно выучить один мощный слой и применить его 100 раз — это даёт ту же вычислительную глубину при гораздо меньшем числе параметров.
- Совместимость с Agentic RAG: агентные системы часто требуют итеративного уточнения запросов и документов — recurrent depth может служить механизмом для таких многошаговых циклов внутри одной модели.
2. Как работает Recurrent Depth: архитектура и инференс
2.1 Базовый блок
Пусть у нас есть один слой трансформера (self-attention + feed-forward) с весами (W). Обычно выход слоя:
[
h_{t+1} = [text](/wiki/text){TransformerLayer}(h_t; W)
]
При recurrent depth мы применяем один и тот же слой (K) раз:
[
h^{(1)} = [text](/wiki/text){TransformerLayer}(x; W)
h^{(2)} = [text](/wiki/text){TransformerLayer}(h^{(1)}; W)
\ldots
h^{(K)} = [text](/wiki/text){TransformerLayer}(h^{(K-1)}; W)
]
где (x) — входные эмбеддинги токенов, а (K) — число итераций (глубина развёртки).
2.2 Обучение
На этапе обучения (K) фиксировано (например, (K=4)). Модель учится делать полезные преобразования за 4 прохода. Градиенты проходят через все 4 применения одного и того же слоя (backpropagation through time, BPTT). Это стабильно, если использовать residual connections и layer normalization.
2.3 Инференс (тест)
На этапе теста (K) может быть увеличено (например, до 8, 16, 32). Модель продолжает применять тот же слой, углубляя рассуждения. Это похоже на «test-time compute scaling» — мы тратим больше вычислений на сложные запросы, не меняя веса.
Пример из Geiping et al. (2025):
- Модель с 3.5B параметров обучалась с (K=4).
- На тесте (K) увеличивали до 8, 16, 32.
- Результаты на MATH и HumanEval улучшались с ростом (K), достигая уровня моделей с 30B+ параметров.
3. Сравнение с альтернативными подходами
| Подход | Параметры | Глубина на тесте | Вычислительная стоимость | Гибкость |
|---|---|---|---|---|
| Стандартный трансформер (32 слоя) | 32× параметры слоя | Фиксированная 32 | 32 прохода | Низкая |
| Recurrent Depth (1 слой, K=32) | 1× параметры слоя | Динамическая (K) | K проходов | Высокая (можно менять K) |
| Chain-of-Thought (CoT) | Те же, что у LLM | Зависит от длины генерации | Дополнительные токены | Средняя (нужен промпт) |
| Self-Consistency / Majority Voting | Те же | Множественные прогоны | Умножается на число прогонов | Средняя |
Ключевое отличие: recurrent depth увеличивает глубину внутри одного forward pass (через повторное применение слоя), а не через генерацию дополнительных токенов (как CoT). Это позволяет модели «думать» глубже, не увеличивая длину последовательности.
4. Преимущества и ограничения
Преимущества
- Масштабирование без роста параметров: можно увеличивать глубину на тесте, не переобучая модель.
- Улучшение на сложных задачах: математика, код, логические цепочки.
- Эффективность памяти: один слой вместо многих — меньше памяти для хранения весов.
- Совместимость с Agentic RAG: агент может итеративно уточнять запрос, используя recurrent depth как «внутренний цикл размышлений».
Ограничения
- Стабильность обучения: BPTT через много шагов может привести к затуханию/взрыву градиентов. Требуются residual connections, layer norm и возможно gradient clipping.
- Ограниченная глубина обучения: если (K) на обучении мало (например, 4), модель может не научиться эффективно использовать большую глубину на тесте — возникает разрыв (train-test mismatch).
- Вычислительная стоимость на тесте: увеличение (K) линейно увеличивает время инференса.
- Не подходит для всех задач: для простых вопросов глубокая развёртка может быть избыточна и даже вредна (overthinking).
5. Исследование Geiping et al. (2025) — ключевые результаты
- Модель: 3.5B параметров, обучена с recurrent depth (K=4).
- Тесты: MATH (математические задачи), HumanEval (генерация кода), GSM8K (арифметика).
- Результаты:
- При K=8 модель превзошла обычный трансформер с 7B параметров.
- При K=32 результаты были сопоставимы с моделями 30B+ (например, Llama-2 70B).
- Наблюдался чёткий тренд: чем больше K, тем выше точность, особенно на задачах, требующих многошаговых рассуждений.
- Вывод: recurrent depth — эффективный способ получить «глубокие» рассуждения без огромных моделей.
6. Связь с Agentic RAG
В контексте Agentic RAG recurrent depth может быть использован как компонент для:
- Итеративного уточнения запроса: агент повторно применяет один и тот же слой к эмбеддингам запроса, «углубляя» его понимание перед отправкой в retriever.
- Многошагового планирования: агент может разворачивать recurrent depth для генерации последовательности действий (tool calls) без увеличения числа параметров.
- Self-Reflection: модель может использовать recurrent depth для внутренней проверки собственных ответов (как в Self-RAG, но без внешних модулей).
Пример архитектуры Agentic RAG с recurrent depth:
- Запрос → эмбеддинг.
- Recurrent depth блок (K=4) → уточнённый эмбеддинг.
- Retrieval из векторной БД.
- Конкатенация с документами → recurrent depth блок (K=8) → финальный ответ.
7. Пет-проект для закрепления
Задача: Реализовать минимальный трансформер с recurrent depth и сравнить его производительность на задаче математических рассуждений (например, датасет GSM8K) при разной глубине теста.
Инструменты: PyTorch, Hugging Face Transformers (можно взять готовый слой), датасет GSM8K.
Шаги:
- Загрузите предобученный маленький трансформер (например, GPT-2 124M) или создайте свой с одним слоем.
- Заморозьте все слои, кроме одного (или используйте только один слой).
- Реализуйте функцию
forward_recurrent(x, K), которая применяет слой K раз. - Обучите модель на подмножестве GSM8K с K=4 (фиксированная глубина).
- На тесте оцените accuracy при K=1,2,4,8,16.
- Постройте график зависимости accuracy от K.
Ожидаемый результат: accuracy растёт с увеличением K до некоторого плато, демонстрируя эффект recurrent depth. Вы также заметите, что при K=1 модель работает плохо, а при K=16 может начать переобучаться (overthinking).
8. Связь с другими вопросами
| Вопрос | Тема |
|---|---|
| 150 | Что такое Agentic RAG и как он отличается от обычного RAG? |
| 152 | Какие архитектуры агентов существуют (ReAct, Toolformer, etc.)? |
| 153 | Как агент принимает решение о вызове инструмента? |
| 156 | Что такое Test-Time Compute Scaling и как оно связано с Recurrent Depth? |
| 160 | Как вы оцениваете качество работы агента в RAG? |
| 170 | Что такое Self-RAG и как он использует рефлексию? |
Навигация
- Предыдущий: 154
- Следующий: 156
- Индекс: 00. Индекс разборов