Глава 208: Прогрессивная дистилляция
1. Введение
Дистилляция знаний сжимает большую, высокоёмкую модель-«учителя» в меньшую модель-«ученика», которая работает быстрее, потребляет меньше памяти и может развёртываться в условиях ограниченных ресурсов. Классический подход выполняет этот перенос за один шаг — один учитель, один ученик, один цикл обучения. Прогрессивная дистилляция идёт принципиально иным путём: она сжимает учителя через последовательность промежуточных стадий, каждая из которых лишь немного меньше предыдущей, так что итоговая миниатюрная модель сохраняет значительно больше предсказательной способности учителя.
Интуиция проста. Попросить 100-слойную сеть напрямую обучить 4-слойную — это как попросить университетского профессора объяснить квантовую теорию поля пятилетнему ребёнку за один разговор. Лучшая стратегия — цепочка переводов: профессор учит аспиранта, аспирант — студента, студент — школьника, а школьник наконец объясняет суть ребёнку. На каждом звене цепи разрыв в знаниях мал, и теряется меньше информации.
В контексте алгоритмической торговли прогрессивная дистилляция открывает мощный конвейер развёртывания. Исследовательская команда может обучить огромную модель с сотнями признаков и миллионами параметров, а затем прогрессивно дистиллировать её через уровни стейджинга, продакшена и периферии — каждый уровень оптимизирован под требования задержки и ресурсов целевой среды. Результат — семейство моделей с общей родословной, где каждая модель является наилучшим возможным приближением оригинала при заданном бюджете вычислений.
Эта глава охватывает математические основы, прогрессивные стратегии, применения в трейдинге и полную реализацию на Rust, которая получает рыночные данные с Bybit в реальном времени и демонстрирует многоэтапную дистилляцию с отслеживанием точности и размера моделей.
2. Математические основы
2.1 Многоэтапный конвейер дистилляции
Пусть конвейер прогрессивной дистилляции состоит из $N$ стадий. Мы начинаем с модели-учителя $M_0$ (исходная большая модель) и создаём последовательность прогрессивно уменьшающихся моделей $M_1, M_2, \ldots, M_N$. На стадии $k$ модель $M_{k-1}$ выступает учителем, а $M_k$ — учеником.
Целевая функция дистилляции на стадии $k$:
$$\mathcal{L}k = \alpha_k \cdot \mathcal{L}{\text{soft}}(M_{k-1}, M_k; T_k) + (1 - \alpha_k) \cdot \mathcal{L}_{\text{hard}}(M_k, y)$$
где:
- $\mathcal{L}{\text{soft}}$ — функция потерь по мягким меткам, сравнивающая сглаженные выходы учителя $M{k-1}$ и ученика $M_k$ при температуре $T_k$
- $\mathcal{L}_{\text{hard}}$ — стандартная функция потерь по истинным меткам $y$
- $\alpha_k \in [0, 1]$ контролирует баланс, обычно уменьшается с ростом стадий
Для задач регрессии, типичных в трейдинге (прогнозирование доходностей, волатильности, спредов), мягкая функция потерь упрощается до среднеквадратичной ошибки между выходами учителя и ученика:
$$\mathcal{L}{\text{soft}}^{(k)} = \frac{1}{n} \sum{i=1}^{n} \left( M_{k-1}(x_i) - M_k(x_i) \right)^2$$
2.2 Прогрессивное уменьшение ёмкости
Определим ёмкость модели $M_k$ как $C_k$ (например, общее число параметров). Прогрессивное расписание удовлетворяет:
$$C_0 > C_1 > C_2 > \cdots > C_N$$
Коэффициент сжатия на каждой стадии: $r_k = C_{k-1} / C_k$. Ключевой принцип проектирования — поддержание умеренного $r_k$ (обычно от 1.5 до 4.0), чтобы каждый ученик мог точно воспроизвести своего непосредственного учителя. Общее сжатие — это произведение:
$$R = \prod_{k=1}^{N} r_k = \frac{C_0}{C_N}$$
Прогрессивный конвейер с $N = 3$ стадиями и коэффициентом на стадию $r = 2$ достигает общего сжатия $R = 8$, но каждый отдельный шаг преодолевает лишь двукратный разрыв.
2.3 Дистилляция на основе учебного плана
Прогрессивная дистилляция естественно поддерживает учебный план (curriculum). Ранние стадии используют высокие температуры ($T_k$ велико) для передачи широких распределительных знаний. Поздние стадии снижают температуру для фокусировки на сложных образцах вблизи границ решений. Формально:
$$T_k = T_{\max} \cdot \left(1 - \frac{k}{N}\right)^{\gamma}$$
где $\gamma$ управляет расписанием охлаждения. Дополнительно коэффициент смешивания $\alpha_k$ может следовать аналогичному расписанию:
$$\alpha_k = \alpha_{\max} \cdot \left(1 - \frac{k}{N}\right)$$
Это обеспечивает большую привязку финального ученика $M_N$ к истинным меткам, а не к (уже сильно сжатому) сигналу учителя.
3. Прогрессивные стратегии
3.1 Послойное уменьшение
Прогрессивное удаление слоёв. 12-слойная сеть становится 8-слойной, затем 6-слойной, затем 4-слойной. На каждой стадии оставшиеся слои поглощают знания удалённых посредством дистилляции. Это сохраняет ширину (скрытую размерность) сети, поддерживая репрезентативную способность на слой при уменьшении глубины.
3.2 Уменьшение ширины
Сужение скрытых размерностей на каждой стадии. Сеть со скрытыми слоями по 512 нейронов становится 256, затем 128, затем 64. Уменьшение ширины обычно мягче уменьшения глубины, потому что вклад каждого нейрона может быть более плавно аппроксимирован меньшим числом нейронов на следующей стадии.
3.3 Уменьшение глубины
Сокращение числа этапов обработки или блоков. Это особенно эффективно для трансформерных торговых моделей, где слои внимания могут быть объединены или удалены. Каждая стадия дистилляции учит более мелкую модель воспроизводить промежуточные представления более глубокой модели.
3.4 Комбинированные прогрессивные расписания
Наиболее эффективный подход комбинирует уменьшение ширины и глубины. Например:
| Стадия | Слои | Скрытая размерность | Параметры | Сжатие |
|---|---|---|---|---|
| 0 (Учитель) | 8 | 256 | ~530K | 1.0x |
| 1 (Средняя) | 6 | 192 | ~225K | 2.4x |
| 2 (Малая) | 4 | 128 | ~70K | 7.6x |
| 3 (Крошечная) | 2 | 64 | ~9K | 59x |
4. Применения в трейдинге
4.1 Конвейер развёртывания: от исследований до периферии
Прогрессивная дистилляция естественно отображается на многоуровневую инфраструктуру торговой операции:
Исследовательский уровень (Модель $M_0$): Полная модель-учитель работает на GPU-кластерах во время ночной пакетной обработки. Она использует все доступные признаки — сотни альтернативных данных, микроструктуру книги заявок, кросс-активные корреляции — и может тратить секунды на предсказание. Эта модель устанавливает потолок производительности.
Уровень стейджинга (Модель $M_1$): Умеренно сжатая модель работает на стандартных серверах для валидации на бумажной торговле. Она использует сокращённый набор признаков и работает в 3–5 раз быстрее учителя. Здесь PnL стратегии проверяется перед запуском в бой.
Продакшен-уровень (Модель $M_2$): Малая модель работает на ко-локированных серверах со строгими бюджетами задержки (менее миллисекунды). Она использует только признаки цены и объёма, доступные в реальном времени, и выдаёт предсказания достаточно быстро для управления ордерами.
Периферийный уровень (Модель $M_3$): Крошечная модель работает на встроенном оборудовании или в шлюзах API бирж. Она выполняет простые проверки рисков и корректировки позиций с микросекундной задержкой, используя только последний тик цены.
Модель каждого уровня — наилучшее возможное приближение исследовательской модели при заданном вычислительном бюджете, потому что прогрессивная дистилляция обеспечивает минимальные потери информации на каждом переходе.
4.2 Адаптивная сложность по рыночным условиям
Рыночные режимы различаются по сложности. В спокойных трендовых рынках может быть достаточно крошечной модели. В волатильные периоды со сменой режимов может потребоваться полный учитель. Прогрессивная дистилляция предлагает естественное решение: поддерживать всё семейство моделей и направлять предсказания на соответствующий уровень в зависимости от обнаруженных рыночных условий.
Модуль определения режима может отслеживать волатильность, ширину спредов и дисбаланс книги заявок для выбора активного уровня модели:
- Низкая волатильность, сильный тренд: Использовать $M_3$ (крошечная) — паттерны просты, задержка важна.
- Нормальные условия: Использовать $M_2$ (малая) — баланс скорости и точности.
- Высокая волатильность, неясный режим: Использовать $M_1$ (средняя) — больше ёмкости для захвата сложной динамики.
- Кризис / смена режима: Использовать $M_0$ (учитель) — максимальная точность, задержка вторична по отношению к правильности.
5. Сравнение с одноэтапной дистилляцией
Одноэтапная дистилляция обучает единственного ученика непосредственно от учителя. Прогрессивная дистилляция вводит промежуточные стадии. Ключевые преимущества прогрессивной дистилляции:
5.1 Уменьшенный разрыв знаний
Каждая стадия преодолевает малый разрыв ёмкости. Ученик на стадии $k$ должен аппроксимировать лишь модель, которая немного больше него самого, а не ту, что в 10–100 раз больше. Это драматически снижает сложность каждой отдельной задачи дистилляции.
5.2 Эффект регуляризации
Промежуточные модели выступают неявными регуляризаторами. Мягкие метки от $M_{k-1}$ сами являются сглаженной версией знаний оригинального учителя, что может предотвратить переобучение финального ученика на шум в выходах учителя.
5.3 Выравнивание пространства признаков
Прогрессивные стадии естественно создают последовательность всё более абстрактных представлений признаков. Каждый ученик изучает признаки, структурно похожие на (но более простые, чем) признаки своего учителя, что делает ландшафт потерь дистилляции более гладким и легче оптимизируемым.
5.4 Эмпирические данные
На практике прогрессивная дистилляция с $N = 3$ стадиями обычно сохраняет 90–95% точности учителя при сжатии 50–100x, тогда как одноэтапная дистилляция при том же сжатии сохраняет лишь 75–85%. Разрыв увеличивается с ростом общего коэффициента сжатия.
5.5 Затраты
Основная стоимость прогрессивной дистилляции — время обучения: $N$ последовательных циклов обучения вместо одного. Однако каждый цикл быстрее одноэтапного (потому что ученик меньше), так что общие накладные расходы обычно составляют лишь 1.5–2.5x. Учитывая преимущества в точности, это почти всегда оправданный компромисс.
6. Пошаговый обзор реализации (Rust)
Реализация на Rust в этой главе предоставляет полную систему прогрессивной дистилляции со следующими компонентами:
6.1 FlexibleNetwork
Структура FlexibleNetwork представляет нейронную сеть прямого распространения с настраиваемыми размерами слоёв. Она хранит матрицы весов и векторы смещений для произвольного числа слоёв, используя ndarray для линейной алгебры. Прямой проход применяет активацию ReLU на скрытых слоях и линейный выход на последнем слое.
pub struct FlexibleNetwork { pub weights: Vec<Array2<f64>>, pub biases: Vec<Array1<f64>>, pub layer_sizes: Vec<usize>,}Ключевые методы:
new(layer_sizes)— инициализация со случайными весами Xavier/Heforward(input)— вычисление выхода сетиparam_count()— возврат общего числа обучаемых параметровtrain_supervised(X, y, epochs, lr)— стандартное безградиентное обучение (эволюционное)train_distill(teacher, X, epochs, lr)— обучение для соответствия выходам учителя
6.2 Конвейер прогрессивной дистилляции
ProgressiveDistiller организует многоэтапное сжатие:
pub struct ProgressiveDistiller { pub stages: Vec<Vec<usize>>, // конфигурации слоёв для каждой стадии pub models: Vec<FlexibleNetwork>, pub stage_metrics: Vec<StageMetrics>,}Он берёт обученного учителя и список спецификаций архитектур (по одной на стадию), а затем последовательно дистиллирует от каждой промежуточной модели к следующей.
6.3 Потери и метрики
На каждой стадии реализация отслеживает:
- Потери дистилляции — MSE между выходами учителя и ученика
- Число параметров — всего весов + смещений
- Коэффициент сжатия — относительно оригинального учителя
- Сохранение точности — R-квадрат ученика относительно R-квадрата учителя на отложенных данных
6.4 Сравнение с одноэтапной дистилляцией
Функция one_shot_distill обучает ученика того же размера, что и финальный прогрессивный ученик, но непосредственно от оригинального учителя. Это позволяет честно сравнить оба подхода.
7. Интеграция данных Bybit
Реализация получает реальные данные свечей BTCUSDT с публичного API Bybit:
GET https://api.bybit.com/v5/market/kline?category=linear&symbol=BTCUSDT&interval=5&limit=200Ответ предоставляет данные OHLCV (открытие, максимум, минимум, закрытие, объём), которые преобразуются в признаки:
- Доходности: $(close_t - close_{t-1}) / close_{t-1}$
- Волатильность: $(high_t - low_t) / close_t$
- Изменение объёма: $(volume_t - volume_{t-1}) / volume_{t-1}$
- Ценовой моментум: доходность за скользящее окно в 5 периодов
Целевая переменная — доходность следующего периода, что делает это стандартной задачей регрессии прогнозирования доходности. Конвейер прогрессивной дистилляции затем сжимает модель предсказания через несколько стадий, сохраняя как можно больше предсказательной точности.
8. Ключевые выводы
-
Прогрессивная дистилляция сжимает модели через несколько промежуточных стадий, каждая из которых преодолевает малый разрыв ёмкости, вместо попытки одного большого шага сжатия.
-
Математическая основа включает цепочку пар учитель-ученик, где каждый ученик становится учителем для следующей стадии. Температура и расписания смешивания могут следовать убыванию по учебному плану.
-
Торговые системы выигрывают от естественного отображения на уровни: исследования (полная модель) → стейджинг (средняя) → продакшен (малая) → периферия (крошечная), где каждый уровень запускает лучшую модель для своих ограничений.
-
Адаптивный выбор модели на основе рыночного режима позволяет системе динамически выбирать между задержкой и точностью, используя более простые модели на спокойных рынках и более сложные во время кризисов.
-
Прогрессивная дистилляция стабильно превосходит одноэтапную при высоких коэффициентах сжатия (>10x), причём разрыв увеличивается с ростом сжатия. Стоимость — умеренное дополнительное время обучения.
-
Комбинированное уменьшение ширины и глубины по стадиям обеспечивает лучший баланс сжатия и сохранения точности, что подтверждается реализацией в этой главе.
-
Интеграция данных рынка в реальном времени (через API Bybit) демонстрирует, что прогрессивная дистилляция работает на реальных, зашумлённых финансовых временных рядах — а не только на чистых академических бенчмарках.