Глава 216: One-Shot поиск нейронной архитектуры (NAS)
1. Введение
Поиск нейронной архитектуры (NAS) изменил подход к проектированию моделей глубокого обучения, но традиционные методы NAS чрезвычайно затратны по вычислительным ресурсам. Обучение и оценка тысяч отдельных архитектур с нуля требует огромных вычислительных мощностей — ресурсов, которые большинство торговых компаний не могут оправдать для разработки моделей. One-Shot NAS элегантно решает эту проблему, обучая единую суперсеть (supernet), которая инкапсулирует все архитектуры-кандидаты в общем пространстве весов.
Основная идея обманчиво проста: вместо независимого обучения каждой архитектуры мы обучаем одну переpараметризованную сеть, подграфы которой соответствуют различным архитектурам. После обучения суперсети мы оцениваем архитектуры-кандидаты, извлекая соответствующие подсети и измеряя производительность с использованием общих весов. Лучшие архитектуры затем переобучаются с нуля для получения финальных моделей.
В области трейдинга One-Shot NAS особенно привлекателен. Рынки переключаются между режимами — трендовым, возвратным к среднему, волатильным, спокойным — и оптимальная архитектура модели может различаться для разных режимов. One-Shot NAS позволяет быстро исследовать архитектурные решения (количество слоёв, размерности скрытых слоёв, функции активации, остаточные соединения) без затрат на независимое обучение каждого варианта. Команда квантов может исследовать сотни архитектур за время, которое обычно требуется для обучения нескольких штук.
В этой главе рассматриваются математические основы разделения весов и сэмплирования путей, описывается полный конвейер One-Shot NAS и демонстрируется реализация на Rust, которая получает данные с Bybit для поиска оптимальных архитектур торговых моделей.
2. Математические основы
2.1 Разделение весов в суперсетях
Суперсеть — это направленный ациклический граф (DAG), где каждое ребро содержит несколько операций-кандидатов. Пусть пространство поиска определено на DAG с N узлами. Для каждого ребра (i, j) существует набор операций-кандидатов:
O_{i,j} = {o_1, o_2, ..., o_K}где каждая операция o_k имеет собственные параметры w_k^{(i,j)}. Конкретная архитектура a определяется выбором ровно одной операции для каждого ребра:
a = {a_{i,j} | a_{i,j} in {1, ..., K}, для всех рёбер (i,j)}Полный набор весов суперсети — это объединение весов всех операций:
W_super = Объединение по всем (i,j), k: {w_k^{(i,j)}}Ключевое допущение One-Shot NAS заключается в том, что общие веса обеспечивают разумное приближение к весам, обученным независимо. Формально, если w_a^* обозначает оптимальные веса для архитектуры a, обученной независимо, а w_a^{shared} обозначает веса, извлечённые из обученной суперсети, то:
rank(a | w_a^{shared}) ≈ rank(a | w_a^*)Именно эта корреляция рангов делает One-Shot NAS работоспособным. Нам не нужно, чтобы общие веса достигали той же абсолютной производительности — нам нужно лишь сохранение относительного порядка архитектур.
2.2 Обучение суперсети с сэмплированием путей
Обучение суперсети включает сэмплирование случайных путей (подсетей) на каждом шаге обучения. При каждом прямом проходе мы сэмплируем архитектуру a ~ P(A) равномерно из пространства поиска и активируем только выбранные операции:
L(W_super) = E_{a ~ P(A)} [L(x, y; W_a)]где W_a — подмножество весов суперсети, соответствующее архитектуре a. Обновление градиента:
W_super <- W_super - lr * градиент L(x, y; W_a) по W_aОбратите внимание, что на каждом шаге обновление градиента получают только веса сэмплированного пути. За множество итераций все операции накапливают градиенты пропорционально частоте их сэмплирования.
2.3 Dropout путей
Для улучшения качества разделения весов мы применяем dropout путей: на каждом ребре мы можем активировать более одной операции с некоторой вероятностью или случайно отбрасывать операции. Это действует как регуляризатор и обеспечивает обучение операций в разнообразных контекстах. Вероятность dropout p_drop контролирует компромисс между эффективностью обучения и качеством разделения весов.
2.4 Ранжирование архитектур
После сходимости обучения суперсети мы оцениваем архитектуры следующим образом:
- Сэмплируем или перечисляем архитектуры-кандидаты
- Для каждой архитектуры извлекаем соответствующие веса из суперсети
- Оцениваем на отложенной валидационной выборке
- Ранжируем архитектуры по валидационной метрике
Топ-K архитектур отбираются для независимого переобучения, которое даёт финальные модели.
3. Конвейер One-Shot NAS
Полный конвейер состоит из четырёх этапов:
Этап 1: Определение пространства поиска
Пространство поиска определяет доступные архитектурные варианты. Для торговых моделей типичные варианты включают:
- Типы слоёв: Dense, LSTM-подобные рекуррентные, свёрточные (для обнаружения паттернов), остаточные соединения
- Размерности скрытых слоёв: 16, 32, 64, 128, 256
- Функции активации: ReLU, GELU, Tanh, Sigmoid, LeakyReLU
- Количество слоёв: от 1 до 6
- Уровни dropout: 0.0, 0.1, 0.2, 0.3
- Нормализация: Нет, LayerNorm, BatchNorm
Полное пространство поиска — это декартово произведение всех вариантов. При 5 типах слоёв, 5 размерностях, 5 активациях и 6 вариантах глубины мы уже имеем 750 архитектур-кандидатов — слишком много для независимого обучения.
Этап 2: Обучение суперсети
Суперсеть обучается на исторических рыночных данных. На каждом шаге обучения:
- Сэмплируется случайная архитектура из пространства поиска
- Извлекается соответствующая подсеть
- Выполняется прямой проход через подсеть
- Вычисляется функция потерь (MSE для предсказания цены, кросс-энтропия для предсказания направления)
- Обратное распространение только через активные операции
- Обновляются только активные веса
Обучение продолжается до сходимости, обычно требуя в 2-5 раз больше эпох, чем для одной архитектуры.
Этап 3: Оценка и ранжирование подсетей
После обучения мы оцениваем большое количество архитектур-кандидатов:
- Сэмплируем N случайных архитектур (например, N = 50-500)
- Для каждой извлекаем веса из суперсети
- Оцениваем на валидационных данных
- Сортируем по валидационной метрике (коэффициент Шарпа, точность, профит-фактор)
- Выбираем топ-K архитектур (например, K = 3-5)
Этап 4: Независимое переобучение
Топ-K архитектур переобучаются с нуля с собственными независимыми весами. Это устраняет артефакты связывания весов из суперсети и даёт модели, готовые к продакшену. Производительность при независимом обучении — это истинная мера качества архитектуры.
4. Применение в трейдинге
4.1 Быстрое исследование архитектур
В количественных финансах способность быстро итерировать дизайн моделей — конкурентное преимущество. One-Shot NAS позволяет команде исследовать сотни архитектур за один цикл обучения. Например:
- Обучить суперсеть на 1 годе минутных данных BTCUSDT (500K+ свечей)
- Оценить 200 случайных подсетей на 3 месяцах отложенных данных
- Определить топ-5 архитектур за часы вместо дней
4.2 Адаптивный выбор архитектуры по режиму рынка
Различные рыночные режимы могут благоприятствовать различным архитектурам. Неглубокая широкая сеть может превосходить в трендовых рынках, где доминируют недавние признаки, тогда как более глубокая сеть с остаточными соединениями может лучше улавливать сложные зависимости в изменчивых, возвратных к среднему рынках.
One-Shot NAS позволяет выбор архитектуры в зависимости от режима:
- Обучить суперсеть на данных, охватывающих несколько режимов
- Разделить валидационные данные по обнаруженному режиму (тренд, возврат к среднему, волатильность)
- Ранжировать архитектуры отдельно для каждого режима
- Развернуть специфичные для режима модели с детектором режима в качестве маршрутизатора
4.3 Поиск в пространстве признаков
Помимо архитектуры модели, One-Shot NAS может искать в пространстве вариантов конструирования признаков:
- Какие технические индикаторы включить (RSI, MACD, Bollinger Bands и т.д.)
- Длины окон наблюдения (5, 10, 20, 50, 100 баров)
- Преобразования признаков (сырые, z-score, ранговые, лог-доходности)
Кодируя эти варианты как операции в суперсети, мы одновременно оптимизируем конвейер признаков и архитектуру модели.
5. Суперсеть vs. независимое обучение
5.1 Эффекты связывания весов
Фундаментальная проблема One-Shot NAS — связывание весов: операции разделяют динамику обучения суперсети, и качество весов операции зависит от того, какие другие операции были совместно активированы во время обучения. Это проявляется как:
- Ко-адаптация: Операции, часто сэмплируемые вместе, могут развить взаимозависимые веса, которые плохо работают при разделении.
- Недообучение: Операции в больших пространствах поиска могут получать недостаточно обновлений градиента, что приводит к ненадёжным оценкам.
- Интерференция: Конкурирующие операции на одном ребре могут толкать общие вышестоящие веса в противоречивых направлениях.
5.2 Надёжность ранжирования
Эмпирические исследования показывают, что ранжирования One-Shot NAS имеют корреляцию тау Кендалла 0.5-0.8 с независимыми ранжированиями. Это означает, что архитектуры с высшим рангом из суперсети обычно хороши, но не всегда являются абсолютно лучшими. Практические меры включают:
- Больший топ-K: Выбирать больше архитектур для переобучения, чтобы увеличить вероятность включения истинно лучшей.
- Несколько запусков суперсети: Обучить несколько суперсетей с различными случайными начальными значениями и агрегировать ранжирования.
- Прогрессивное сужение: Постепенно уменьшать пространство поиска во время обучения суперсети.
Для торговых приложений корреляция ранжирования 0.6+ обычно достаточна — нам не нужно найти единственную лучшую архитектуру, а лишь набор сильных кандидатов.
6. Описание реализации
Наша реализация на Rust состоит из нескольких ключевых компонентов.
6.1 Определение пространства поиска
Мы определяем пространство поиска с помощью перечислений для каждого архитектурного выбора:
enum Activation { ReLU, Tanh, Sigmoid, LeakyReLU, GELU }enum LayerType { Dense, Conv1D, Residual, GatedDense }ArchitectureConfig определяет выбранную операцию для каждой точки выбора:
struct ArchitectureConfig { layer_type: LayerType, hidden_dim: usize, num_layers: usize, activation: Activation, dropout_rate: f64,}6.2 Структура суперсети
Суперсеть хранит весовые матрицы для всех операций-кандидатов. Для каждой пары (позиция слоя, тип операции) мы храним отдельные веса:
struct Supernet { search_space: SearchSpace, weights: HashMap<(usize, LayerType), Array2<f64>>, biases: HashMap<(usize, LayerType), Array1<f64>>,}6.3 Сэмплирование путей и обучение
На каждом шаге обучения мы сэмплируем случайную архитектуру и выполняем прямой проход, используя только веса выбранных операций:
fn train_step(&mut self, x: &Array2<f64>, y: &Array1<f64>, lr: f64) { let arch = self.search_space.sample_random(); let prediction = self.forward(x, &arch); let loss = mse_loss(&prediction, y); self.backward(&arch, &loss, lr);}6.4 Оценка подсетей
После обучения мы оцениваем подсети, извлекая их веса и выполняя инференс на валидационных данных:
fn evaluate_subnet(&self, arch: &ArchitectureConfig, val_x: &Array2<f64>, val_y: &Array1<f64>) -> f64 { let predictions = self.forward(val_x, arch); compute_sharpe_ratio(&predictions, val_y)}6.5 Выбор архитектуры и переобучение
Топ-K архитектур выбираются и переобучаются с нуля с заново инициализированными весами, обеспечивая отсутствие артефактов связывания весов.
7. Интеграция с Bybit
Реализация получает реальные рыночные данные через публичный API Bybit. Мы используем эндпоинт /v5/market/kline для получения OHLCV-свечей:
async fn fetch_bybit_klines(symbol: &str, interval: &str, limit: usize) -> Vec<Candle> { let url = format!( "https://api.bybit.com/v5/market/kline?category=spot&symbol={}&interval={}&limit={}", symbol, interval, limit ); // Парсинг ответа в структуры Candle}Из сырых свечей конструируются признаки:
- Логарифмические доходности за несколько горизонтов (1, 5, 10 баров)
- Отношения скользящих средних (close/SMA_20, close/SMA_50)
- Волатильность (скользящее стандартное отклонение доходностей)
- Отношение объёма (volume/SMA_volume_20)
- Аппроксимация RSI
Целевая переменная — направление доходности следующего бара (бинарная классификация) или величина доходности следующего бара (регрессия).
8. Ключевые выводы
-
One-Shot NAS обучает единую суперсеть, содержащую все архитектуры-кандидаты, радикально снижая вычислительные затраты на поиск архитектуры с O(N * T) до O(T), где N — количество кандидатов, а T — время обучения.
-
Разделение весов обеспечивает приближённое ранжирование: общие веса не так хороши, как независимо обученные, но они достаточно хорошо сохраняют относительный порядок архитектур для выявления сильных кандидатов.
-
Конвейер состоит из четырёх этапов: определение пространства поиска, обучение суперсети, оценка и ранжирование подсетей, переобучение топ-K с нуля.
-
Преимущества для трейдинга включают быстрое исследование дизайнов моделей, адаптивный выбор архитектуры по режиму рынка и совместную оптимизацию признаков и структуры модели.
-
Связывание весов — основное ограничение: ко-адаптация, недообучение и интерференция могут ухудшить качество ранжирования. Меры включают больший топ-K, несколько запусков суперсети и прогрессивное сужение.
-
Независимое переобучение необходимо: никогда не разворачивайте суперсеть напрямую. Всегда переобучайте выбранные архитектуры с нуля для устранения артефактов связывания весов.
-
Ранжирование не обязано быть идеальным: на практике достаточно определить набор сильных архитектур (топ 10%). One-Shot NAS превосходно справляется с быстрым отсеиванием слабых архитектур, а не с точным определением единственной лучшей.
-
Реализация на Rust обеспечивает производительность, необходимую для обучения суперсетей на больших наборах рыночных данных, сохраняя при этом безопасность типов и эффективность работы с памятью.