中文翻译暂不可用,显示俄语原文。

Что такое Test-Time Training (TTT) слои и как они работают?

Краткий тезис

Training|Test-Time Training (TTT) — это новый тип нейросетевых слоёв, предложенный в 2025 году, который адаптируется к входным данным непосредственно во время инференса. В отличие от обычных слоёв с фиксированными весами, TTT-слой выполняет внутренний градиентный спуск на текущей последовательности токенов, обновляя своё state|скрытое состояние. Это позволяет модели динамически подстраиваться под стиль, структуру и паттерны данных, но пока остаётся экспериментальной техникой с высокой вычислительной сложностью O(n·d²) и не готова к production-использованию.

1. Термин: Test-Time Training (TTT)

Test-Time Training — это подход, при котором модель или её часть дообучается на тестовых данных в момент инференса. В контексте TTT-слоёв это означает, что каждый слой содержит внутреннюю мини-модель (например, линейное преобразование или маленькую нейросеть), которая обновляется с помощью градиентного спуска по мере поступления токенов последовательности.

Ключевое отличие от обычного обучения:

  • Обычное обучение: веса фиксируются после тренировки на обучающей выборке.
  • TTT: веса внутренней модели динамически меняются на каждом шаге инференса, адаптируясь к текущему контексту.

Термин «Test-Time» подчёркивает, что обучение происходит на этапе тестирования (инференса), а не на этапе тренировки.

2. Мотивация: почему нужны TTT-слои?

Современные архитектуры имеют фундаментальные ограничения:

АрхитектураОграничение
TransformerКвадратичная сложность O(n²) по длине последовательности; неэффективен для очень длинных контекстов.
SSM (State Space Models), например MambaЛинейная сложность O(n), но динамика фиксирована после обучения; не могут адаптироваться к неожиданным паттернам на лету.
Рекуррентные сети (LSTM/GRU)Линейная сложность, но страдают от затухания градиентов и плохо сжимают информацию.

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

3. Как работают TTT-слои: механизм внутреннего обучения

Рассмотрим упрощённую схему работы TTT-слоя на шаге t:

  1. Вход: токен x_t (вектор размерности d).
  2. Внутренняя модель: некоторая параметрическая функция f_θ (например, линейный слой или MLP). Её параметры θ — это state|скрытое состояние слоя.
  3. Обновление: перед обработкой x_t, слой выполняет один или несколько шагов градиентного спуска по функции потерь L, вычисленной на предыдущих токенах (или на всём контексте). Например, можно минимизировать ошибку предсказания следующего токена на уже увиденной последовательности.
  4. Вычисление выхода: после обновления θ, слой применяет f_θ к x_t, получая выходной вектор h_t.
  5. Переход к следующему шагу: θ обновлён, и процесс повторяется для x_{t+1}.

Формально:

θ_t = θ_{t-1} - η · ∇_θ L(θ_{t-1}, {x_1, ..., x_t})
h_t = f_{θ_t}(x_t)

Здесь η — скорость обучения внутреннего оптимизатора (обычно SGD). Функция потерь L может быть, например, среднеквадратичной ошибкой между предсказанием f_θ(x_{t-1}) и истинным x_t (self-supervised loss).

4. Архитектура TTT-слоя

Типичный TTT-слой состоит из следующих компонентов:

  • Model|Inner model (Model|внутренняя модель): небольшая нейросеть, например, двухслойный MLP с размерностью скрытого слоя d_inner << d. Её веса — это и есть state|скрытое состояние.
  • Loss function (функция потерь): обычно self-supervised, например, предсказание следующего токена (next-token prediction) или реконструкция зашумлённого входа.
  • Optimizer (оптимизатор): простой SGD с фиксированной или адаптивной скоростью обучения. Возможно использование Adam, но это увеличивает вычислительные затраты.
  • Hidden state (скрытое состояние): набор параметров θ, которые обновляются на каждом шаге.

Псевдокод forward-прохода TTT-слоя:

class TTTLayer(nn.Module):
    def __init__(self, d_model, d_inner, lr=0.01):
        super().__init__()
        self.inner_model = nn.Linear(d_model, d_inner)  # пример
        self.lr = lr
        self.theta = None  # будет инициализирован при первом токене

    def forward(self, x):
        # x: (batch, d_model)
        if self.theta is None:
            self.theta = self.inner_model.weight.clone()
        # Вычисляем loss на предыдущих токенах (здесь упрощённо)
        # Обновляем theta с помощью SGD
        loss = self.compute_loss(x)  # self-supervised
        grad = torch.autograd.grad(loss, self.theta, retain_graph=True)
        self.theta = self.theta - self.lr * grad[0]
        # Применяем обновлённую модель к текущему токену
        out = F.linear(x, self.theta)
        return out

5. Сравнение с альтернативами

ХарактеристикаTransformerSSM (Mamba)TTT-слой
Сложность инференсаO(n²·d)O(n·d)O(n·d²)
Адаптация к контекстуНет (фиксированные веса)Нет (фиксированная динамика)Да (обучение на лету)
Сжатие информацииСреднее (через attention)Хорошее (через рекуррентность)Потенциально лучшее
Production-readyДаДа (Mamba уже используется)Нет (исследовательская)
ПараллелизацияХорошая (batch attention)Плохая (рекуррентная)Плохая (последовательное обновление)

TTT-слои проигрывают по скорости, но выигрывают в способности адаптироваться к уникальным паттернам данных, что может быть критично для задач с быстро меняющимися доменами.

6. Вычислительная сложность

Основной источник затрат — градиентный спуск на каждом шаге. Для последовательности длины n и скрытой размерности d:

  • Прямой проход внутренней модели: O(d²) на токен.
  • Обратное распространение для вычисления градиента: ещё O(d²).
  • Обновление весов: O(d²).

Итого O(n·d²) на всю последовательность. Для сравнения:

  • Transformer: O(n²·d) — квадратично по n.
  • SSM: O(n·d) — линейно, но без адаптации.

TTT может быть эффективнее Transformer при очень больших n (например, n > 10⁵), но проигрывает SSM по скорости. Однако авторы утверждают, что TTT лучше сжимает информацию, поэтому для достижения того же качества может потребоваться меньшая размерность d.

7. Преимущества TTT

  • Адаптация к стилю и структуре: слой может «подстроиться» под специфический язык, формат данных или паттерны, встречающиеся только в тестовой последовательности.
  • Улучшенное сжатие длинного контекста: внутренняя модель учится выделять наиболее важные закономерности, что позволяет хранить информацию компактнее, чем в SSM.
  • Потенциальная замена attention: TTT-слои могут обрабатывать последовательности произвольной длины без фиксированного окна, сохраняя линейную сложность.
  • Self-supervised learning на лету: не требует размеченных данных для адаптации — loss вычисляется на самих токенах.

8. Недостатки и ограничения

  • Высокая вычислительная стоимость: O(n·d²) всё ещё велико для реальных приложений, особенно на длинных последовательностях.
  • Нестабильность обучения: внутренний градиентный спуск может расходиться или застревать в локальных минимумах, особенно при большом шаге η.
  • Отсутствие production-реализаций: нет оптимизированных библиотек, поддержки GPU-ядер, интеграции с популярными фреймворками.
  • Сложность параллелизации: последовательная природа обновлений не позволяет эффективно использовать batch-обработку на этапе инференса.
  • Чувствительность к гиперпараметрам: скорость обучения, размер внутренней модели, количество шагов градиентного спуска — всё требует тщательной настройки.

9. Связь с Agentic RAG

В контексте Agentic RAG (агентных систем, которые самостоятельно ищут и обрабатывают информацию) TTT-слои могут быть полезны для:

  • Динамической адаптации к новым документам: агент получает набор документов, и TTT-слой может быстро «обучиться» на них, чтобы лучше извлекать релевантную информацию.
  • Улучшения retrieval: если TTT-слой используется в энкодере, он может адаптировать представления запросов и документов под текущий контекст диалога.
  • Обработки длинных историй: агент может накапливать контекст взаимодействия, а TTT-слой будет сжимать его без потери важных деталей.

Однако из-за высокой стоимости TTT пока не применяется в реальных RAG-системах. Это скорее направление для исследований.

10. Пет-проект для закрепления

Задача: реализовать упрощённый TTT-слой на PyTorch и протестировать его на синтетической задаче предсказания следующего токена.

Инструменты: Python, PyTorch, numpy, matplotlib.

Шаги:

  1. Создание данных: сгенерируйте последовательность синусоиды с шумом (длина 1000 точек). Каждый токен — скаляр (d=1).
  2. Реализация TTTLayer:
    • Внутренняя модель: линейное преобразование y = w * x (один параметр w).
    • Loss: MSE между предсказанием следующего токена и истинным значением.
    • Оптимизатор: SGD с lr=0.01.
    • На каждом шаге: обновить w по градиенту loss на предыдущем токене, затем вычислить выход для текущего.
  3. Базовый слой: обычный линейный слой с фиксированным w (обучен на первых 500 точках).
  4. Сравнение: вычислите MSE на тестовой части (последние 500 точек) для TTT-слоя и базового слоя.
  5. Визуализация: постройте графики предсказаний.

Ожидаемый результат: TTT-слой должен показывать меньшую ошибку, так как он адаптируется к изменениям в сигнале (например, к дрейфу частоты), в то время как базовый слой использует фиксированное преобразование.

11. Связь с другими вопросами

ВопросТема
715Что такое State Space Models (SSM) и как они работают?
716В чём отличие Mamba от классических SSM?
717Что такое Agentic RAG и как он устроен?
719Как модели адаптируются к новым данным без дообучения?
720Какие существуют подходы к обработке сверхдлинных контекстов?

12. Навигация


Навигация