Модель 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 даёт конкретные цифры по задержке и стоимости.