Глава 206: Самодистилляция в трейдинге
1. Введение
Самодистилляция — это замечательная парадигма, в которой модель обучает саму себя, используя собственные предсказания в качестве мягких целей. В отличие от традиционной дистилляции знаний, где большая модель-учитель передает знания меньшей модели-ученику, самодистилляция полностью устраняет необходимость в отдельном учителе. Модель выступает одновременно и учителем, и учеником, итеративно совершенствуя свои представления через последовательные поколения обучения.
Интуиция за самодистилляцией обманчиво проста: когда нейронная сеть выдает распределения вероятностей по классам (мягкие цели), эти распределения содержат более богатую информацию, чем жесткие метки. Предсказание [0.7, 0.2, 0.1] для задачи с тремя классами говорит нам не только о том, что первый класс наиболее вероятен, но и кодирует взаимосвязи между классами. Обучая новую копию модели на этих мягких целях, мы передаем это “скрытое знание” — неявную структуру, закодированную в распределении вероятностей — обратно в архитектуру.
В трейдинге самодистилляция решает фундаментальную проблему: у нас часто ограниченное количество размеченных данных, а сами метки зашумлены. Метки рыночных режимов (бычий, медвежий, боковой) по своей природе нечеткие — рынок может быть на 70% бычьим и на 30% боковым. Жесткие метки уничтожают этот нюанс, но мягкие цели от обученной модели способны его сохранить. Самодистилляция позволяет итеративно улучшать торговую модель без необходимости в дополнительных данных, внешних учителях или методах ансамблирования, что делает её особенно ценной для продуктивных систем, где важны простота и задержка.
Эта глава исследует самодистилляцию от математических основ до практической реализации на Rust с реальными рыночными данными биржи Bybit.
2. Математические основы
Сети Born-Again
Концепция Born-Again Networks (BAN), представленная Furlanello et al. (2018), обеспечивает теоретическую основу самодистилляции. Процесс работает следующим образом:
- Обучаем начальную модель M_0 на жестких метках с использованием стандартной кросс-энтропийной функции потерь
- Используем M_0 для генерации мягких предсказаний на обучающих данных
- Обучаем новую модель M_1 (идентичная архитектура) с использованием комбинации жестких меток и мягких целей от M_0
- Повторяем: используем M_k для обучения M_{k+1}
Функция потерь для поколения k+1 объединяет два слагаемых:
L_total = alpha * L_CE(y, p_{k+1}) + (1 - alpha) * L_KD(p_k, p_{k+1})где:
- L_CE(y, p_{k+1}) — стандартная кросс-энтропийная потеря между жесткими метками y и предсказаниями новой модели p_{k+1}
- L_KD(p_k, p_{k+1}) — потеря дистилляции знаний между мягкими целями предыдущего поколения и предсказаниями новой модели
- alpha управляет балансом между жестким и мягким обучением
Итерации самообучения
Каждое поколение самодистилляции можно рассматривать как форму регуляризованного повторного обучения. Мягкие цели от поколения k действуют как сглаженная версия обучающих меток, обеспечивая несколько преимуществ:
- Неявное сглаживание меток: Мягкие цели естественным образом предотвращают чрезмерно уверенные предсказания
- Сохранение межклассовых связей: Модель узнает, какие классы “близки” друг к другу
- Подавление шума: Усреднение по неопределенности модели помогает отфильтровывать шум меток
Формально, если мы обозначим мягкие предсказания поколения k как:
q_k(c | x) = exp(z_k(c | x) / T) / sum_j exp(z_k(j | x) / T)где z_k — логиты, а T — параметр температуры, то потеря KL-дивергенции принимает вид:
L_KD = T^2 * sum_c q_k(c | x) * log(q_k(c | x) / q_{k+1}(c | x))Масштабирующий множитель T^2 компенсирует уменьшение величины градиента, вызванное температурным масштабированием.
Прогрессивная самодистилляция
Прогрессивная самодистилляция расширяет базовую схему путем постепенного увеличения сложности обучающего сигнала от поколения к поколению. В ранних поколениях высокая температура (T = 5-10) создает очень мягкие цели, подчеркивающие межклассовые связи. В более поздних поколениях температура снижается (T = 1-2), подталкивая модель к более четким и уверенным предсказаниям.
Этот учебный подход помогает модели сначала выучить общую структуру задачи, прежде чем фокусироваться на границах решений:
T_k = T_0 * decay_rate^kСвязь со сглаживанием меток
Самодистилляция имеет глубокую связь со сглаживанием меток. Стандартное сглаживание меток заменяет жесткие цели на:
y_smooth(c) = (1 - epsilon) * y_hard(c) + epsilon / Cгде epsilon — параметр сглаживания, а C — количество классов. Это фиксированное, равномерное сглаживание. Самодистилляция достигает зависящего от данных, неравномерного сглаживания, где распределение сглаживания берется из собственных выученных представлений модели. Такое адаптивное сглаживание, как правило, более эффективно, поскольку оно отражает реальную структуру данных, а не применяет равномерную неопределенность.
3. Варианты самодистилляции
Born-Again Networks (BAN)
Оригинальный подход BAN обучает каждое поколение с нуля со случайно инициализированными весами. Единственный сигнал, передаваемый между поколениями, — это распределение мягких целей. Это гарантирует, что каждое поколение не просто запоминает веса предыдущей модели, а действительно учится на обогащенном обучающем сигнале.
Ключевые свойства:
- Архитектура остается идентичной по поколениям
- Веса переинициализируются в каждом поколении
- Мягкие цели предварительно вычисляются и фиксируются во время обучения
- Производительность обычно улучшается в течение 2-4 поколений, затем выходит на плато
Be Your Own Teacher (BYOT)
Вариант BYOT вводит вспомогательные классификаторы на промежуточных слоях сети. Каждый промежуточный слой генерирует свои предсказания, и эти предсказания служат дополнительными мягкими целями для финального слоя. Это создает форму внутренней самодистилляции в рамках одного прогона обучения:
- Поверхностные слои выступают “учителями” для более глубоких слоев
- Несколько компонентов потерь вычисляются на разных глубинах сети
- Итоговая потеря — взвешенная сумма послойных потерь
- Этот подход можно рассматривать как форму глубокого надзора в сочетании с самодистилляцией
В торговых приложениях BYOT особенно полезен, поскольку предоставляет множественные представления данных на различных уровнях абстракции, которые могут улавливать как краткосрочные паттерны (мелкие слои), так и более долгосрочные режимные структуры (глубокие слои).
Снэпшотная дистилляция
Снэпшотная дистилляция использует контрольные точки модели, сохраненные во время обучения, вместо обучения отдельных поколений. Сохраняя модель через регулярные интервалы (снэпшоты), мы создаем неявный ансамбль, усредненные предсказания которого служат мягкими целями для продолжения обучения:
- Обучаем модель и сохраняем снэпшоты на эпохах E_1, E_2, …, E_n
- Усредняем предсказания по всем снэпшотам для создания мягких целей
- Продолжаем обучение с использованием этих усредненных мягких целей
Этот подход вычислительно дешевле BAN, поскольку требует только одного расширенного прогона обучения вместо нескольких полных циклов. Снэпшоты естественным образом захватывают разные аспекты данных (ранние снэпшоты могут улавливать простые паттерны, а более поздние — сложные взаимодействия), создавая разнообразный ансамбль для самодистилляции.
4. Торговые приложения
Итеративное улучшение модели без дополнительных данных
В трейдинге получение размеченных данных дорого и часто субъективно. Самодистилляция позволяет извлечь больше ценности из существующих размеченных данных путем итеративного улучшения модели. Каждое поколение самодистилляции фактически увеличивает “эффективный” размер обучающего набора, предоставляя более богатые обучающие сигналы.
Рассмотрим классификатор рыночных режимов, обученный на 1000 размеченных свечах. Жесткие метки — это бинарные решения (бычий/медвежий/боковой), но мягкие предсказания модели после обучения кодируют распределения вероятностей, которые захватывают неоднозначность в каждом образце. Свеча, возникшая при переходе режима, может иметь жесткую метку “бычий”, но мягкое предсказание [0.55, 0.30, 0.15], отражающее переходный характер рынка в этот момент. Обучение следующего поколения на этих мягких целях сохраняет и уточняет этот нюанс.
Регуляризация через самодистилляцию
Самодистилляция действует как мощный регуляризатор для торговых моделей. Финансовые данные печально известны своей зашумленностью, и модели, обученные с жесткими метками, склонны к переобучению на шуме в метках. Мягкие цели от самодистилляции обеспечивают естественный эффект сглаживания, который:
- Предотвращает чрезмерную уверенность модели на зашумленных образцах
- Побуждает модель изучать обобщаемые паттерны вместо запоминания конкретных случаев
- Снижает влияние неправильно размеченных данных (неправильно размеченный образец все равно получит мягкую цель, частично отражающую истинный класс)
Этот регуляризующий эффект особенно ценен в режимах малых данных, характерных для трейдинга, где у нас может быть лишь несколько сотен размеченных переходов режимов.
Оценка неопределенности без ансамблей
Традиционная оценка неопределенности в трейдинге требует поддержки нескольких моделей (ансамбли) или добавления dropout при инференсе (Monte Carlo dropout). Самодистилляция предоставляет альтернативу: отслеживая изменение предсказаний по поколениям, мы можем оценивать неопределенность модели:
- Стабильные предсказания: Если образец получает схожие мягкие цели от поколений 1-5, модель уверена в этом предсказании
- Волатильные предсказания: Если мягкие цели значительно сдвигаются между поколениями, модель не уверена
- Несогласие поколений: Дисперсия предсказаний по поколениям обеспечивает калиброванную оценку неопределенности
Это бесплатно при инференсе — нам нужно развернуть только модель последнего поколения, в то время как оценки неопределенности вычисляются офлайн в процессе самодистилляции.
5. Многопоколенческая самодистилляция
Обучение по нескольким поколениям
Процесс многопоколенческой самодистилляции следует определенному протоколу:
Поколение 0 (Базовое):
- Обучаем модель M_0 на жестких метках с использованием стандартной кросс-энтропии
- Оцениваем и записываем базовую точность
Поколение k (k >= 1):
- Инициализируем свежую модель M_k со случайными весами
- Генерируем мягкие цели с помощью M_{k-1} на всем обучающем наборе
- Обучаем M_k с использованием комбинированной потери: alpha * CE(жесткие) + (1-alpha) * KL(мягкие)
- Оцениваем и записываем точность
Гиперпараметры по поколениям:
- Температура T: обычно начинается с 3-5 и затухает к 1
- Alpha (вес жестких меток): обычно 0.3-0.5
- Скорость обучения: может корректироваться от поколения к поколению в зависимости от сходимости
Анализ насыщения производительности
Эмпирические исследования показывают характерный паттерн производительности самодистилляции:
- Поколения 1-2: Значительное улучшение (1-3% прироста точности), поскольку модель извлекает выгоду из обогащенного обучения
- Поколения 3-4: Убывающая отдача с меньшими улучшениями
- Поколения 5+: Производительность выходит на плато или может незначительно деградировать из-за эффекта “эхо-камеры”, когда предубеждения модели становятся самоподкрепляющимися
В торговых приложениях мы обычно наблюдаем оптимальную производительность на поколении 2-3. За этой точкой модель может начать переобучаться к собственным предубеждениям, а не продолжать улучшаться. Мониторинг производительности на валидационном наборе по поколениям критически важен для выбора оптимального поколения для развертывания.
Явление насыщения можно смягчить с помощью:
- Варьирования расписания температуры по поколениям
- Добавления стохастического шума к мягким целям
- Использования снэпшотного усреднения вместо целей от одной модели
- Периодического введения жестких меток (расписание alpha на основе учебного плана)
6. Пошаговое описание реализации (Rust)
Реализация структурирована вокруг нескольких основных компонентов, отражающих математический фреймворк, описанный выше.
Архитектура нейронной сети
Мы реализуем простую нейронную сеть прямого распространения с настраиваемыми скрытыми слоями. Ключевое требование — сеть должна поддерживать клонирование — каждое поколение начинается со свежей копии архитектуры:
pub struct NeuralNetwork { pub weights: Vec<Array2<f64>>, pub biases: Vec<Array1<f64>>, pub layer_sizes: Vec<usize>,}Сеть поддерживает прямое распространение с температурно-масштабированным softmax выходом для генерации мягких целей.
Цикл обучения самодистилляции
Основной цикл самодистилляции реализует комбинированную функцию потерь:
pub fn self_distillation_step( student: &mut NeuralNetwork, teacher: &NeuralNetwork, input: &Array1<f64>, hard_label: usize, temperature: f64, alpha: f64, learning_rate: f64,) -> f64Эта функция:
- Прямое прохождение входа через учителя (с температурой) и ученика
- Вычисление KL-дивергенции между мягкими выходами учителя и ученика
- Вычисление кросс-энтропии между жесткими метками и предсказаниями ученика
- Комбинирование потерь с весом alpha
- Градиентный спуск по ученику
Многопоколенческое обучение
Структура SelfDistillationTrainer управляет полным многопоколенческим конвейером:
pub struct SelfDistillationTrainer { pub layer_sizes: Vec<usize>, pub num_generations: usize, pub temperature: f64, pub alpha: f64, pub learning_rate: f64, pub epochs_per_generation: usize,}Она отслеживает точность по поколениям, хранит историю поколений и поддерживает как самодистилляцию в стиле BAN (свежая инициализация), так и на основе снэпшотов.
Снэпшотная дистилляция
Вариант на основе снэпшотов сохраняет контрольные точки модели во время обучения и усредняет их предсказания:
pub struct SnapshotDistiller { pub snapshots: Vec<NeuralNetwork>, pub snapshot_interval: usize,}Это обеспечивает вычислительно эффективную альтернативу полному многопоколенческому обучению.
7. Интеграция с Bybit
Реализация включает полную интеграцию с API Bybit для получения реальных рыночных данных. Функция fetch_bybit_klines получает данные свечей для любой поддерживаемой торговой пары:
pub async fn fetch_bybit_klines( symbol: &str, interval: &str, limit: usize,) -> Result<Vec<KlineData>>Признаки извлекаются из необработанных данных свечей и нормализуются в диапазон [0, 1]:
- Доходность: (close - open) / open, нормализованная
- Волатильность: (high - low) / open, нормализованная
- Изменение объема: текущий объем относительно среднего, нормализованное
Метки рыночных режимов присваиваются на основе величины доходности и уровней волатильности:
- Бычий (0): Положительная доходность с умеренной волатильностью
- Медвежий (1): Отрицательная доходность с повышенной волатильностью
- Боковой (2): Около-нулевая доходность
Торговый пример демонстрирует полный конвейер: получение данных BTCUSDT от Bybit, обучение начальной модели, запуск 5 поколений самодистилляции и сравнение точности по поколениям с базовой моделью однократного обучения.
8. Ключевые выводы
-
Самодистилляция устраняет необходимость во внешних учителях. Модель может улучшить себя, обучая последовательные поколения на своих мягких предсказаниях, что идеально для торговых систем, где важна простота.
-
Мягкие цели кодируют более богатую информацию, чем жесткие метки. Распределения вероятностей, производимые обученной моделью, захватывают межклассовые связи и неопределенность на уровне образцов, которые жесткие метки уничтожают.
-
Температура — критический гиперпараметр. Более высокие температуры создают более мягкие распределения, подчеркивающие классовые связи, тогда как более низкие температуры фокусируются на обострении предсказаний. Затухающее расписание температуры по поколениям обеспечивает лучшее из обоих подходов.
-
Производительность выходит на плато после 2-4 поколений. За этой точкой модель рискует закрепить собственные предубеждения. Мониторинг валидации необходим для выбора оптимального поколения.
-
Самодистилляция обеспечивает неявную регуляризацию. Эффект сглаживания мягких целей естественным образом предотвращает переобучение, что особенно ценно в режиме малых данных и высокого шума, характерном для финансовых рынков.
-
Разные варианты служат разным потребностям. BAN для максимального улучшения, BYOT для эффективности однократного обучения и снэпшотная дистилляция для экономии вычислений.
-
Оценка неопределенности доступна бесплатно. Отслеживание стабильности предсказаний по поколениям предоставляет калиброванные оценки неопределенности без поддержки ансамблей при инференсе.
-
Реализация на Rust обеспечивает продуктивное развертывание. Характеристики нулевого копирования и низкой задержки Rust делают его подходящим для торговых систем реального времени, где модели самодистилляции должны генерировать предсказания с минимальными накладными расходами.