Деанонимизация трансформера на временных рядах: интервенционный протокол | AiManual
AiManual Logo Ai / Manual.
26 Янв 2026 Гайд

Как деанонимизировать поведение трансформера на временных рядах: метод интерпретации с интервенционным протоколом

Практический гайд по интерпретации трансформеров на временных рядах с помощью интервенционного протокола и фальсифицируемых тестов. Шаги, код, ошибки.

Почему трансформеры на временных рядах — это черные ящики, которые всех бесят

Вы обучили трансформер на временных рядах. Он предсказывает лучше, чем все ARIMA, Prophet и ансамбли. Но когда продукт-менеджер спрашивает, почему модель предсказала падение продаж в среду, вы пожимаете плечами. Attention карты? Они показывают красивую цветную матрицу, но не говорят, какие именно лаги важны. Градиентные методы? Они хрупкие и часто противоречат друг другу. Знакомо? Тогда этот гайд — ваш выход из тупика.

К 2026 году трансформеры, такие как TST (Time Series Transformer) или PatchTST, стали стандартом для сложных прогнозов. Но их интерпретируемость отстает от точности. Если вы не понимаете, как модель работает, вы не можете доверять ей в продакшене. Особенно когда начинается Interpretation Drift и сегодняшние объяснения не совпадают со вчерашними.

Интервенционный протокол: не спрашивай модель, а заставь ее признаться

Большинство методов XAI пассивны: они смотрят на то, как модель реагирует на готовые данные. Интервенционный подход — это активный допрос. Мы систематически вмешиваемся во входные данные, замораживаем части скрытых состояний, подменяем значения и смотрим, как меняются предсказания. Это похоже на механистическую интерпретируемость, но для временных рядов.

Зачем это нужно? Чтобы построить фальсифицируемые гипотезы. Не "внимание показывает корреляцию", а "если мы занулим значения в момент времени t, то ошибка предсказания вырастет на X%". Это проверяемое утверждение.

1Подготовка: что нужно иметь перед началом

Не начинайте интервенции без четкого плана. Вот что нужно:

  • Обученная модель трансформера. Подойдет любая архитектура для временных рядов 2026 года: TST, PatchTST, Informer. Убедитесь, что она стабильно работает на ваших данных.
  • Тестовый набор данных. Не тренировочный! Интервенции проводятся на данных, которые модель никогда не видела.
  • Метрика ошибки. MAE, RMSE, MAPE — что угодно, но одна и та же для всех экспериментов.
  • Вычислительные ресурсы. Интервенции требуют множества forward-pass. Если модель большая, готовьте GPU.
💡
Интервенционный протокол не заменяет другие методы XAI. Он дополняет их. Сначала посмотрите на attention карты или градиенты, чтобы сформировать гипотезы, а потом проверяйте их интервенциями.

2Шаг 1: Определите интервенционные стратегии

Что будем изменять? Вот три основные стратегии для временных рядов:

СтратегияКак реализуетсяЧто проверяет
Замена значенийПодстановка среднего, медианы, нуля или шума в конкретный временной шагВажность конкретного наблюдения
Замораживание скрытых состоянийФиксация выхода определенного слоя энкодераРоль конкретного слоя в формировании прогноза
Маскирование attentionПринудительное обнуление весов внимания между определенными временными точкамиВажность временных зависимостей

Начните с замены значений — это самый простой и интерпретируемый метод.

3Шаг 2: Проведите интервенции и замерьте влияние

Здесь нужен код. Пример на Python с использованием PyTorch и библиотеки Captum (актуальные версии на 2026 год).

import torch
import numpy as np
from captum.attr import IntegratedGradients
import matplotlib.pyplot as plt

# Предположим, у нас есть модель TransformerForTimeSeries
model.eval()

# Функция для интервенции: замена значения в позиции idx на replacement
def intervene_on_input(input_series, idx, replacement=0.0):
    intervened = input_series.clone()
    intervened[:, idx] = replacement
    return intervened

# Оригинальный прогноз и ошибка
original_input = test_sequence.unsqueeze(0)  # [1, seq_len, features]
with torch.no_grad():
    original_pred = model(original_input)
    original_loss = loss_fn(original_pred, target)

# Проводим интервенции для каждого временного шага
influence_scores = []
seq_len = original_input.shape[1]

for i in range(seq_len):
    intervened_input = intervene_on_input(original_input, i)
    with torch.no_grad():
        intervened_pred = model(intervened_input)
        intervened_loss = loss_fn(intervened_pred, target)
    # Влияние: насколько выросла ошибка
    influence = intervened_loss.item() - original_loss.item()
    influence_scores.append(influence)

# Визуализация
plt.figure(figsize=(12, 4))
plt.plot(range(seq_len), influence_scores, marker='o')
plt.xlabel('Временной шаг')
plt.ylabel('Прирост ошибки (MAE)')
plt.title('Карта влияния временных шагов на прогноз')
plt.axhline(y=0, color='r', linestyle='--', alpha=0.5)
plt.show()

Этот код показывает, насколько ошибка предсказания растет при удалении информации из каждого временного шага. Положительные значения — шаг важен. Отрицательные? Да, такое бывает и означает, что модель использует шум или артефакты.

4Шаг 3: Проведите фальсифицируемые тесты

Теперь у вас есть гипотеза: "Шаги 10, 11, 12 критически важны для прогноза на следующую неделю". Проверьте ее фальсифицируемым тестом.

Фальсифицируемый тест: если гипотеза верна, то при интервенции на шаги 10-12 ошибка должна вырасти значимо больше, чем при интервенции на случайные шаги.

# Тест на значимость
hypothesis_indices = [10, 11, 12]
num_random_trials = 1000

# Влияние на гипотетически важных шагах
hypothesis_intervention_loss = 0.0
for idx in hypothesis_indices:
    intervened = intervene_on_input(original_input, idx)
    with torch.no_grad():
        loss = loss_fn(model(intervened), target).item()
    hypothesis_intervention_loss += loss
hypothesis_avg_loss = hypothesis_intervention_loss / len(hypothesis_indices)

# Монте-Карло: влияние случайных шагов
random_losses = []
for _ in range(num_random_trials):
    random_idx = np.random.randint(0, seq_len)
    intervened = intervene_on_input(original_input, random_idx)
    with torch.no_grad():
        loss = loss_fn(model(intervened), target).item()
    random_losses.append(loss)

# Сравнение
p_value = np.mean(np.array(random_losses) >= hypothesis_avg_loss)
print(f"p-value: {p_value:.4f}")
if p_value < 0.05:
    print("Гипотеза подтверждается: эти шаги действительно важны.")
else:
    print("Гипотеза не подтверждается. Ищите другие объяснения.")

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

Где все ломается: ошибки, которые допускают 90% инженеров

  • Интервенции нарушают временную структуру. Замена значения на ноль может создать артефакт, который модель никогда не видела. Всегда проверяйте, не является ли ваша интервенция выбросом. Вместо нуля используйте сглаженные значения или значения из других примеров.
  • Игнорирование автокорреляции. Временные ряды автокоррелированы. Удаление одного шага влияет на соседние. Используйте блоковые интервенции (маскирование целых сегментов) для проверки устойчивости.
  • Слепая вера в attention карты. Attention веса показывают, куда модель "смотрит", но не обязательно, что эта информация используется для прогноза. Всегда проверяйте интервенциями. Подробнее об этом в статье "Как Llama 3.2 3B думает внутри".
  • Отсутствие бейзлайна. Всегда сравнивайте влияние интервенций с влиянием на случайном шуме или на зашумленных данных. Иначе вы можете приписать важность случайным флуктуациям.

Интервенционный протокол — это не разовая акция. Внедрите его в пайплайн мониторинга модели. Каждую неделю запускайте тесты на важность шагов и сравнивайте с предыдущими результатами. Если карта влияния резко изменилась, возможно, произошел дрифт данных или модели.

FAQ: короткие ответы на сложные вопросы

Этот метод работает только для трансформеров?

Нет. Интервенционный протокол применим к любой архитектуре: RNN, CNN, гибридным моделям. Но для трансформеров он особенно полезен из-за сложности их attention-механизмов.

Как выбрать replacement value для интервенций?

Используйте несколько стратегий: среднее по ряду, медиану, интерполированное значение, значение из другого ряда. Если результаты согласуются across стратегий — ваши выводы надежны.

Метод требует много вычислений. Как ускорить?

Используйте батчевые интервенции (вмешивайтесь в несколько шагов одновременно), аппроксимации через интегрированные градиенты (Captum) или сэмплируйте только ключевые шаги, выявленные другими методами XAI.

Как связать интервенции с бизнес-логикой?

Переведите временные шаги в бизнес-события. Если важным оказался шаг, соответствующий понедельнику, спросите: "Что происходит у нас по понедельникам?" Может, это день отчетности или акция. Так интерпретация становится actionable.

Что дальше? От интерпретации к дизайну моделей

Интервенционный протокол не только объясняет, но и помогает улучшать модели. Обнаружили, что модель слишком зависит от одного шага? Добавьте регуляризацию. Увидели, что attention мечется между далекими точками? Возможно, стоит попробовать архитектуру с ограниченным вниманием, как Mamba, или принудительно сгладить веса.

Главное — перестать гадать. Начните проводить интервенции систематически. Через месяц у вас будет не просто точная модель, а полная карта ее причинно-следственных связей. И когда в следующий раз спросят "почему?", вы откроете ноутбук и покажите график.