Перейти к содержанию
Публикация AiManual

Informer: многовариантное вероятностное прогнозирование временных рядов с линейной сложностью

Разбираем Informer для многовариантного вероятностного прогнозирования: ProbSparse attention, дистилляция, код с GluonTS и Hugging Face Transformers, метрики MA

Коротко

Что будет в материале

  1. 01

    Почему Informer? Проблема квадратичной сложности в трансформерах для временных рядов

  2. 02

    Архитектура Informer: ProbSparse attention и дистилляция

  3. 03

    Практическая реализация: от данных до прогноза

  4. 04

    Оценка результатов: метрики MASE и sMAPE

Модель Informer решает задачу многовариантного вероятностного прогнозирования временных рядов за счёт двух архитектурных улучшений: ProbSparse attention и механизма дистилляции. Это снижает вычислительную сложность с O(T^2D) до O(T log T), а потребление памяти с O(NT^2) до O(N·T log T). На практике модель достигает MASE 1.19 и sMAPE 0.53 на датасете traffic_hourly, но многовариантный подход не всегда выигрывает у одномерного.

Разберём полный цикл: подготовку данных через GluonTS, конфигурацию в Hugging Face Transformers, обучение с Accelerate и автогрессионный инференс. В конце сравним многовариантное и одномерное прогнозирование и дадим критерии выбора модели.

Почему Informer? Проблема квадратичной сложности в трансформерах для временных рядов

Стандартный self-attention вычисляет внимание между всеми парами позиций. Для последовательности длины T это даёт T^2 операций. С учётом размерности признаков D сложность по времени составляет O(T^2D), а по памяти O(NT^2), где N - число рядов. Для длинных последовательностей это делает трансформеры непрактичными.

Пример: при T = 1000 стандартный attention требует 1 000 000 операций на слой. ProbSparse attention сокращает это до примерно 10 000 операций. Разница в сто раз.

Informer решает проблему двумя механизмами. ProbSparse attention отбирает только значимые запросы, а дистилляция сжимает последовательность между слоями энкодера. Это позволяет обрабатывать ряды длиной в тысячи шагов без экспоненциального роста затрат.

Архитектура Informer: ProbSparse attention и дистилляция

Informer сохраняет общую схему трансформера: энкодер обрабатывает историю, декодер генерирует прогноз. Но внутри два ключевых отличия.

ProbSparse attention: как отбираются важные запросы

В обычном attention каждый запрос взаимодействует со всеми ключами. Однако распределение внимания многих запросов близко к равномерному. Такие запросы не несут полезной информации и их можно пропустить.

Для каждого запроса q_i вычисляется метрика разреженности:

M(q_i, K) = max_j (q_i k_j^T / sqrt(d)) - mean_j (q_i k_j^T / sqrt(d))

Если распределение внимания равномерное, максимум и среднее близки, метрика мала. Запрос считается «ленивым» и не вычисляется. На практике выбираются top-u запросов с наибольшей разреженностью, где u = c * ln L_Q. Коэффициент c задаётся в конфигурации.

Это снижает число вычисляемых пар ключ-запрос с T^2 до T ln T. Для длинных последовательностей выигрыш существенный.

Дистилляция: сжатие признаков в энкодере

После каждого слоя attention в энкодере применяется операция дистилляции. Она состоит из свёртки с kernel size 3 и stride 2, затем ELU активации и max pooling. Длина последовательности уменьшается вдвое на каждом шаге.

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

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

Практическая реализация: от данных до прогноза

Рассмотрим полный цикл на датасете traffic_hourly. Это многовариантный ряд с 862 записями в час. Для воспроизведения понадобятся библиотеки GluonTS, Hugging Face Transformers и Accelerate.

Подготовка данных с GluonTS

GluonTS загружает датасет, разбивает на train/test и создаёт окна с заданными context length и prediction length. Пример:

from gluonts.dataset.repository import get_dataset
from gluonts.dataset.loader import TrainDataLoader

dataset = get_dataset("traffic_hourly")
train_loader = TrainDataLoader(
    dataset.train,
    batch_size=32,
    num_batches_per_epoch=100
)

Каждый батч содержит тензоры past_values и future_values. past_values - история, future_values - целевой горизонт для прогноза.

Конфигурация модели в Hugging Face Transformers

Модель задаётся через InformerConfig. Основные параметры:

from transformers import InformerConfig, InformerForPrediction

config = InformerConfig(
    d_model=512,
    n_heads=8,
    num_encoder_layers=4,
    num_decoder_layers=2,
    dropout=0.1,
    attention_dropout=0.1,
    context_length=96,
    prediction_length=24,
    distil=True
)
model = InformerForPrediction(config)

Параметр distil=True включает дистилляцию в энкодере. context_length и prediction_length задают длину истории и горизонта прогноза.

Обучение с Accelerate

Accelerate упрощает распределённое обучение и mixed precision. Инициализация:

from accelerate import Accelerator

accelerator = Accelerator(mixed_precision="fp16")
model, optimizer, train_loader = accelerator.prepare(model, optimizer, train_loader)

Далее стандартный цикл: прямой проход, расчёт loss, backward, шаг оптимизатора. Accelerate автоматически распределяет модель и батчи по доступным GPU.

Инференс: автогрессионная генерация прогноза

Для вероятностного прогноза используется sampling из распределения Student-t. Модель получает начальный контекст и генерирует по одному шагу, используя предыдущие прогнозы как вход для следующего шага.

Результат - распределение прогнозов для каждого шага горизонта. Из него извлекаются медиана и доверительные интервалы 50% и 90%. Визуализация показывает не только точечный прогноз, но и неопределённость.

Оценка результатов: метрики MASE и sMAPE

На тестовой выборке traffic_hourly модель показала MASE = 1.19 и sMAPE = 0.53.

MASE (Mean Absolute Scaled Error) сравнивает ошибку модели с ошибкой наивного сезонного прогноза. Значение меньше 1 означает, что модель лучше наивного подхода. Здесь 1.19 - модель немного хуже сезонного бенчмарка.

sMAPE (symmetric Mean Absolute Percentage Error) измеряет симметричную процентную ошибку. Значение 0.53 соответствует средней ошибке около 53%. Это высокий показатель, но для traffic_hourly с его волатильностью он ожидаем.

Результаты получены на конкретном датасете и могут варьироваться при других настройках.

Многовариантное vs одномерное прогнозирование: когда Informer проигрывает

Многовариантные модели пытаются уловить межсерийные корреляции. Если рядов много и корреляции сильные, это даёт выигрыш. Но при недостаточном объёме данных или слабых корреляциях модель переобучается и даёт худшие результаты, чем отдельные одномерные модели.

На traffic_hourly одномерная модель может показать MASE ниже 1.19. Причина: 862 ряда в час создают шумную корреляционную структуру. Модель тратит ресурсы на поиск закономерностей, которых нет.

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

Когда использовать Informer: практические рекомендации

Informer подходит при следующих условиях:

  • Длинные последовательности: тысячи шагов истории.
  • Многовариантные данные с потенциальными корреляциями между рядами.
  • Необходимость вероятностных прогнозов с доверительными интервалами.
  • Доступ к GPU для обучения.

Для коротких рядов или малого числа серий проще использовать классические статистические модели или одномерные трансформеры. Они быстрее обучаются и часто дают сопоставимую точность.

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

Заключение: Informer как инструмент в арсенале прогнозиста

Informer решает проблему квадратичной сложности трансформеров для длинных временных рядов. ProbSparse attention и дистилляция позволяют обрабатывать многовариантные данные с линейно-логарифмической сложностью. Практическая реализация с GluonTS, Hugging Face Transformers и Accelerate доступна и воспроизводима.

Метрики MASE 1.19 и sMAPE 0.53 на traffic_hourly показывают, что модель работает, но не всегда превосходит одномерные подходы. Оценка межсерийных корреляций остаётся сложной задачей.

Для глубокого понимания архитектурных изменений в трансформерах рекомендую разбор проекта AttnRes, где residual stream заменяется на attention-based routing. А если интересен практический опыт деплоя NLP-моделей, материал про Hugging Face Inference Endpoints даёт конкретные цифры по задержке и стоимости.

Подписаться на канал