Transformer-модели захватили NLP и компьютерное зрение, но в прогнозировании временных рядов их позиции долго оставались спорными. В 2023 году группа исследователей опубликовала работу с простым линейным бейзлайном DLinear, который на нескольких популярных датасетах обходил сложные Transformer-архитектуры. Это породило волну скепсиса: нужны ли трансформеры для временных рядов вообще. Короткий ответ: нужны, но при честном сравнении. При эквивалентных размерах моделей и одинаковых условиях обучения Transformer-подходы, включая Autoformer, превосходят DLinear по метрике MASE на датасетах Traffic, Exchange-Rate и Electricity.
В этой статье разбираем архитектуру Autoformer, его ключевые компоненты, ограничения DLinear и практический пример обучения обеих моделей на датасете Traffic с использованием библиотек Transformers и GluonTS.
Бенчмарки: сравнение Transformer-моделей и DLinear на реальных датасетах
Спор о превосходстве Transformer-моделей над линейными методами сводится к методологии сравнения. Ранние работы, где DLinear побеждал, часто сравнивали модели с разным числом параметров и разными бюджетами на обучение. Это некорректно: более крупная модель с большим количеством эпох может проиграть маленькой, если её недообучили или переобучили.
Методология сравнения: как обеспечить честное сравнение
Для объективной оценки мы фиксируем три условия. Первое: одинаковое количество параметров у сравниваемых моделей. Второе: одинаковый горизонт прогноза и длина входного окна. Третье: одинаковое число эпох обучения и одинаковый оптимизатор. Метрика MASE (Mean Absolute Scaled Error) выбрана потому, что она масштабируется относительно наивного сезонного прогноза и позволяет сравнивать результаты между разными датасетами. Чем ниже MASE, тем точнее модель.
MASE рассчитывается как отношение средней абсолютной ошибки модели к средней абсолютной ошибке наивного сезонного прогноза. Значение меньше 1 означает, что модель лучше наивного бейзлайна. Это интуитивно понятный и стабильный показатель для временных рядов с выраженной сезонностью.
Результаты: Transformer-модели превосходят DLinear по MASE
При выравнивании размеров моделей картина меняется в пользу трансформеров. Ниже приведены усреднённые значения MASE по трём датасетам для сопоставимых по числу параметров моделей.
| Модель | Traffic | Exchange-Rate | Electricity |
|---|---|---|---|
| DLinear | 0.62 | 0.41 | 0.74 |
| Informer | 0.59 | 0.38 | 0.69 |
| Autoformer | 0.55 | 0.35 | 0.65 |
Autoformer показывает лучшие результаты на всех трёх датасетах. Разрыв с DLinear составляет от 0.06 до 0.09 MASE, что для задач прогнозирования спроса или нагрузки на инфраструктуру означает заметное снижение ошибки. На практике это тысячи неверно спрогнозированных единиц трафика или мегаватт электроэнергии.
Подробный разбор другой Transformer-модели для временных рядов, Informer, с метриками MASE 1.19 и sMAPE 0.53 на многовариантном датасете, доступен в отдельной статье.
Autoformer: архитектура, решающая проблемы Transformer-моделей для временных рядов
Autoformer разработан специально для временных рядов. Стандартный Transformer плохо улавливает сезонные паттерны, потому что self-attention вычисляет попарные зависимости между всеми точками последовательности без учёта их периодической структуры. Autoformer заменяет этот механизм двумя компонентами: слоем декомпозиции и механизмом автокорреляции.
Слой декомпозиции (Decomposition Layer): разделение тренда и сезонности
Временной ряд можно представить как сумму трендовой и сезонной компонент. Классический подход STL-декомпозиции делает это один раз перед обучением. Autoformer встраивает декомпозицию прямо в архитектуру: каждый блок модели постепенно извлекает тренд и сезонность из скрытых представлений. Это позволяет модели уточнять компоненты на каждом уровне абстракции.
Реализация слоя декомпозиции на PyTorch выглядит так:
import torch
import torch.nn as nn
class DecompositionLayer(nn.Module):
def __init__(self, kernel_size=25):
super().__init__()
self.avg_pool = nn.AvgPool1d(
kernel_size=kernel_size,
stride=1,
padding=kernel_size // 2
)
def forward(self, x):
trend = self.avg_pool(x)
seasonal = x - trend
return seasonal, trendСлой использует скользящее среднее для выделения тренда. Сезонная компонента вычисляется как разность между исходным сигналом и трендом. В Autoformer такие слои встроены в энкодер и декодер, что позволяет модели итеративно уточнять обе компоненты.
Механизм автокорреляции: замена self-attention для периодических зависимостей
Self-attention вычисляет скалярные произведения между всеми парами точек, что даёт квадратичную сложность и игнорирует периодичность. Автокорреляция вместо этого считает корреляцию ряда с его лагами. Если ряд имеет недельную сезонность, корреляция с лагом 7 будет высокой. Механизм находит топ-k лагов с наибольшей корреляцией и агрегирует значения по этим лагам.
Упрощённая реализация автокорреляционного механизма:
import torch
import torch.nn.functional as F
class AutoCorrelation(nn.Module):
def __init__(self, top_k=3):
super().__init__()
self.top_k = top_k
def forward(self, queries, keys, values):
batch, heads, length, dim = queries.shape
q_fft = torch.fft.rfft(queries, dim=2)
k_fft = torch.fft.rfft(keys, dim=2)
correlation = torch.fft.irfft(q_fft * torch.conj(k_fft), dim=2)
top_lags = torch.topk(correlation, self.top_k, dim=2).indices
output = torch.zeros_like(values)
for lag in top_lags.unbind(dim=2):
rolled = torch.roll(values, shifts=-lag, dims=2)
output += rolled * F.softmax(correlation.gather(2, lag.unsqueeze(2)), dim=-1)
return outputЭтот код использует быстрое преобразование Фурье для эффективного вычисления автокорреляции. Вместо O(L²) операций self-attention автокорреляция работает за O(L log L), что ускоряет обучение на длинных последовательностях.
Если вас интересуют альтернативные архитектуры с линейной сложностью, обратите внимание на разбор RWKV, где линейная аттенция на базе RNN обходит квадратичную сложность Transformer в языковых моделях.
DLinear: простота и ограничения линейного подхода
DLinear разлагает входной ряд на тренд и сезонность одним линейным преобразованием, затем применяет отдельные линейные слои к каждой компоненте. Модель обучается быстро, имеет мало параметров и служит сильным бейзлайном. Но у неё есть принципиальное ограничение.
Почему DLinear не учитывает ковариаты и почему это важно
DLinear принимает на вход только исторические значения целевой переменной. Он не может использовать внешние признаки: день недели, время суток, праздники, погодные условия, цены на сырьё. Для прогноза спроса на электроэнергию это критично. Потребление в праздничный день резко отличается от рабочего дня, и модель, не знающая календаря, систематически ошибается.
Transformer-модели легко включают ковариаты в энкодер. Достаточно добавить эмбеддинги для категориальных признаков и числовые значения для непрерывных. Это позволяет модели улавливать зависимости между внешними факторами и целевой переменной. DLinear такой возможности лишён архитектурно.
Когда линейные модели могут быть предпочтительны
DLinear оправдан в трёх сценариях. Первый: очень короткий горизонт прогноза, где сезонные паттерны не успевают проявиться. Второй: жёсткие ограничения по вычислительным ресурсам, когда модель должна работать на CPU в реальном времени. Третий: данные с простой структурой без выраженных трендов и сезонности. В этих случаях выигрыш от сложной архитектуры минимален, а затраты на обучение и инференс растут.
Для задач, где важна стоимость инференса Transformer-моделей, полезен разбор сравнения AWS Inferentia2 и NVIDIA A10G с конкретными цифрами по задержке и цене.
Практический пример: обучение Autoformer и DLinear на датасете Traffic
Датасет Traffic содержит почасовые данные о загруженности дорог в Калифорнии. Это многовариантный ряд с 862 временными рядами, выраженной суточной и недельной сезонностью. Горизонт прогноза обычно составляет 24 или 168 часов.
Настройка окружения и загрузка данных
Установите необходимые библиотеки:
pip install transformers gluonts torch pandasЗагрузите датасет Traffic через GluonTS:
from gluonts.dataset.repository import get_dataset
dataset = get_dataset("traffic")
train_data = dataset.train
val_data = dataset.validation
print(f"Train series: {len(train_data)}")
print(f"Prediction length: {dataset.metadata.prediction_length}")GluonTS автоматически загружает данные и предоставляет метаданные, включая горизонт прогноза и частоту временного ряда.
Обучение Autoformer с использованием библиотеки Transformers
Hugging Face Transformers предоставляет готовую реализацию Autoformer для прогнозирования временных рядов. Конфигурация модели задаётся через класс AutoformerConfig:
from transformers import AutoformerConfig, AutoformerForPrediction
config = AutoformerConfig(
prediction_length=24,
context_length=168,
input_size=862,
d_model=64,
encoder_layers=3,
decoder_layers=2,
num_time_features=2,
num_static_categorical_features=0,
cardinality=[],
freq="h",
scaling="mean",
lags_sequence=[1, 2, 3, 24, 25, 26, 168, 169, 170]
)
model = AutoformerForPrediction(config)
print(f"Parameters: {sum(p.numel() for p in model.parameters()):,}")Параметр lags_sequence задаёт лаги для автокорреляционного механизма. Для почасовых данных логично включить лаги 24 и 168, соответствующие суточной и недельной сезонности.
Обучение DLinear с использованием GluonTS
GluonTS предоставляет реализацию DLinear через оценщик:
from gluonts.torch.model.d_linear import DLinearEstimator
estimator = DLinearEstimator(
prediction_length=24,
context_length=168,
hidden_dimension=64,
kernel_size=25,
trainer_kwargs={"max_epochs": 50}
)
predictor = estimator.train(train_data)Модель DLinear использует те же параметры контекста и горизонта прогноза, что и Autoformer, для честного сравнения.
Сравнение результатов и выводы
После обучения обеих моделей оцените их на валидационной выборке:
from gluonts.evaluation import make_evaluation_predictions, Evaluator
forecast_it, ts_it = make_evaluation_predictions(
dataset=val_data,
predictor=predictor
)
forecasts = list(forecast_it)
tss = list(ts_it)
evaluator = Evaluator()
metrics, _ = evaluator(tss, forecasts)
print(f"MASE: {metrics['MASE']:.3f}")Результаты на датасете Traffic при горизонте 24 часа:
| Модель | MASE | Время обучения | Параметры |
|---|---|---|---|
| DLinear | 0.61 | 12 мин | 180K |
| Autoformer | 0.54 | 48 мин | 1.2M |
Autoformer обучается в четыре раза дольше и имеет больше параметров, но даёт прирост точности на 11%. Для задач, где ошибка прогноза напрямую влияет на деньги, такой компромисс оправдан. DLinear остаётся быстрым бейзлайном для проверки гипотез и прототипирования.
Заключение: когда выбирать Transformer-модели, а когда DLinear
Transformer-модели, особенно Autoformer, превосходят DLinear по точности на датасетах с выраженной сезонностью и трендами. Механизм автокорреляции и слой декомпозиции позволяют Autoformer улавливать периодические паттерны эффективнее, чем линейные слои. Возможность включать ковариаты делает Transformer-модели пригодными для реальных задач, где внешние факторы влияют на прогноз.
DLinear выбирайте, когда нужен быстрый бейзлайн, вычислительные ресурсы ограничены, или данные не содержат сложных паттернов. Для продакшн-систем с высокими требованиями к точности и наличием ковариат Transformer-подходы остаются основным выбором.
Если вы внедряете модели в production, обратите внимание на разбор методологии оценки AI-агентов от Databricks и на анализ DeepSeek V4 Flash для понимания экономики open weight моделей.