Глава 215: Дифференцируемый поиск архитектуры нейронных сетей (DARTS)
1. Введение - Дифференцируемый NAS (DARTS): непрерывный и дифференцируемый поиск архитектуры
Поиск архитектуры нейронных сетей (NAS) стал мощной парадигмой автоматизации проектирования архитектур нейронных сетей. Традиционные методы NAS, такие как подходы на основе обучения с подкреплением или эволюционные алгоритмы, требуют обучения тысяч кандидатных архитектур с нуля, потребляя огромные вычислительные ресурсы. Для торговых приложений, где быстрая итерация по дизайну модели критически важна из-за смены рыночных режимов, такие затраты непомерны.
Дифференцируемый поиск архитектуры (DARTS), представленный Лю, Симоняном и Яном в 2019 году, фундаментально изменил ландшафт NAS, переформулировав задачу дискретного выбора архитектуры как задачу непрерывной оптимизации. Вместо поиска по дискретному множеству архитектур по одной, DARTS ослабляет пространство поиска до непрерывного, что позволяет использовать градиентный спуск для совместной оптимизации как архитектуры, так и её весов. Это сокращает стоимость поиска с тысяч GPU-дней до одного GPU-дня, делая поиск архитектуры практичным для таких областей, как алгоритмическая торговля, где важны актуальность и адаптивность модели.
Ключевая идея DARTS элегантна: вместо выбора одной операции для каждого ребра в вычислительном графе, присваивается непрерывный вес каждой операции-кандидату, и эти веса оптимизируются с помощью стандартного обратного распространения. По завершении поиска производится дискретизация путём сохранения операции с наибольшим весом на каждом ребре. Эта глава рассматривает математические основы DARTS, алгоритм, торговые приложения, известные варианты и полную реализацию на Rust с интеграцией данных биржи Bybit.
2. Математические основы
2.1 Непрерывная релаксация дискретного выбора архитектуры
Рассмотрим направленный ациклический граф (DAG), где каждый узел представляет скрытое представление, а каждое ребро — кандидатную операцию (например, свёртка, skip-соединение, полносвязный слой). В дискретной формулировке каждое ребро выбирает ровно одну операцию из множества кандидатов O = {o_1, o_2, …, o_K}. Общее число возможных архитектур растёт комбинаторно с числом рёбер и операций, что делает полный перебор невозможным.
DARTS заменяет дискретный выбор непрерывной релаксацией. Для каждого ребра (i, j) в DAG вместо выбора одной операции DARTS вычисляет взвешенную смесь всех кандидатных операций:
f_{i,j}(x) = sum_{k=1}^{K} p_k * o_k(x)где веса смешивания p_k получаются из обучаемых параметров архитектуры alpha через softmax:
p_k = exp(alpha_k) / sum_{m=1}^{K} exp(alpha_m)2.2 Параметры архитектуры alpha
Параметры архитектуры alpha = {alpha_{i,j,k}} образуют отдельный набор обучаемых параметров, отличный от весов сети w. Каждый alpha_{i,j,k} управляет вкладом операции k на ребре (i, j). Изначально все значения alpha устанавливаются равными (или случайными), что означает равный вклад всех операций. Во время поиска градиентный спуск по alpha сдвигает распределение в сторону предпочтения определённых операций.
Softmax гарантирует, что веса смешивания образуют допустимое распределение вероятностей, а температура softmax может быть настроена для контроля резкости распределения. По мере обучения распределение обычно заостряется, и одна операция начинает доминировать на каждом ребре.
2.3 Двухуровневая оптимизация
DARTS формулирует поиск архитектуры как задачу двухуровневой оптимизации:
min_{alpha} L_val(w*(alpha), alpha)при условии w*(alpha) = argmin_{w} L_train(w, alpha)Внешняя цель минимизирует потери на валидации по параметрам архитектуры alpha, тогда как внутренняя цель обучает веса сети w на обучающих потерях. Эта формулировка гарантирует, что архитектура оптимизирована для обобщения (производительность на валидации), а не просто для подгонки под обучающие данные.
На практике двухуровневая оптимизация аппроксимируется чередующимися шагами градиентного спуска:
-
Шаг 1 (Обновление весов): Один шаг градиента по w с использованием обучающих потерь:
w' = w - eta_w * grad_w L_train(w, alpha) -
Шаг 2 (Обновление архитектуры): Один шаг градиента по alpha с использованием валидационных потерь:
alpha' = alpha - eta_alpha * grad_alpha L_val(w', alpha)
Это чередование эффективно, поскольку избегает полного обучения сети при каждом обновлении архитектуры. Аппроксимация первого порядка (использование w’ вместо полностью сходившегося w*) вносит некоторое смещение, но хорошо работает на практике.
2.4 Аппроксимация второго порядка
Для более точных градиентов архитектуры DARTS поддерживает аппроксимацию второго порядка, учитывающую зависимость w* от alpha:
grad_alpha L_val(w*(alpha), alpha) ≈ grad_alpha L_val(w', alpha) - eta_w * grad^2_{alpha,w} L_train(w, alpha) * grad_w L_val(w', alpha)Второй член включает произведение гессиана на вектор, которое может быть эффективно вычислено с помощью конечных разностей. Это даёт лучшую оценку истинного градиента архитектуры, но при дополнительных вычислительных затратах.
3. Алгоритм DARTS
3.1 Смешанная операция
Смешанная операция является атомарным строительным блоком пространства поиска DARTS. Каждая смешанная операция содержит:
- Набор из K кандидатных операций {o_1, …, o_K}
- Параметры архитектуры alpha = (alpha_1, …, alpha_K)
- Softmax-веса p = softmax(alpha)
Во время прямого прохода все операции применяются к входу, и их выходы объединяются с использованием softmax-весов. Именно это делает архитектуру дифференцируемой: градиент протекает через все операции одновременно, взвешенный их параметрами архитектуры.
3.2 Градиент архитектуры
Градиент архитектуры grad_alpha L_val указывает, какие операции следует усилить (положительный вклад в снижение валидационных потерь) и какие ослабить. Для смешанной операции с операциями {o_k} и весами {p_k}:
dL/d(alpha_k) = sum_{m} (dL/dp_m) * (dp_m/d(alpha_k))Якобиан softmax dp_m/d(alpha_k) = p_m * (delta_{mk} - p_k) гарантирует, что увеличение alpha_k увеличивает вес операции k при уменьшении весов остальных операций.
3.3 Дискретизация
После завершения фазы поиска непрерывная архитектура должна быть дискретизирована в конкретную архитектуру для финальной оценки. Стандартная стратегия дискретизации:
- Для каждого ребра (i, j) выбирается операция с наибольшим весом архитектуры:
o*_{i,j} = argmax_k alpha_{i,j,k}
- Для каждого узла сохраняются top-k входящих рёбер (обычно k=2) на основе максимального веса ребра.
- Удаляются нулевые операции и неиспользуемые рёбра.
3.4 Фазы поиска и оценки
Рабочий процесс DARTS состоит из двух различных фаз:
Фаза поиска:
- Обучение небольшой прокси-сети со смешанными операциями
- Чередование обновлений весов и параметров архитектуры
- Обычно выполняется 50-100 эпох на уменьшенном наборе данных
- Выход: оптимизированные параметры архитектуры alpha
Фаза оценки:
- Дискретизация архитектуры из alpha
- Построение полноразмерной сети с найденной архитектурой
- Обучение с нуля на полном наборе данных
- Оценка на отложенных тестовых данных
4. Торговые приложения
4.1 Эффективный поиск оптимальных архитектур для прогнозирования временных рядов
Прогнозирование финансовых временных рядов представляет уникальные архитектурные задачи. В отличие от классификации изображений, где доминируют свёрточные архитектуры, оптимальная архитектура для торговых сигналов неочевидна. Различные рыночные режимы (трендовый, возвратный к среднему, волатильный) могут выигрывать от различных вычислительных примитивов.
DARTS обеспечивает эффективное исследование этого пространства проектирования. Специфичное для трейдинга пространство поиска может включать:
- Identity/Skip-соединения: Для рынков, где недавние сырые признаки наиболее предсказательны
- Полносвязные слои: Для изучения сложных нелинейных взаимодействий признаков
- 1D свёрточные операции: Для обнаружения локальных временных паттернов (например, свечных формаций)
- Операции экспоненциального скользящего среднего: Для захвата трендовой информации на различных временных масштабах
- Операции разности: Для обучения на доходностях вместо цен
- Операции внимания: Для селективной фокусировки на релевантных временных шагах
Запуская DARTS на исторических рыночных данных, мы можем определить, какая комбинация этих примитивов лучше всего работает для конкретного актива или торговой стратегии. Поиск можно перезапускать периодически при изменении рыночных условий, автоматически адаптируя архитектуру модели.
4.2 Выбор операций для обработки финансовых признаков
В инженерии признаков для трейдинга практики часто спорят о том, какие преобразования применять к сырым рыночным данным. DARTS может автоматизировать этот выбор:
- Входные признаки: данные OHLCV, снимки книги ордеров, ставки финансирования
- Кандидатные операции для каждого признака: нормализация, логарифмическое преобразование, дифференцирование, оконные статистики, пропуск (без обработки)
- DARTS выбирает: Оптимальный конвейер обработки для каждого признака независимо
Этот подход имеет несколько преимуществ перед ручной инженерией признаков:
- Устраняет человеческое предубеждение при выборе признаков
- Может обнаружить неочевидные преобразования признаков
- Адаптируется к новым рыночным режимам при перезапуске
- Поиск вычислительно дёшев (часы, а не дни)
4.3 Поиск архитектуры для нескольких активов
Для торговых систем уровня портфеля DARTS может искать архитектуры, которые обрабатывают потоки данных нескольких активов совместно. Пространство поиска включает операции для межактивного взаимодействия (слои корреляции, внимание между активами) наряду с операциями обработки одного актива. Это позволяет обнаруживать архитектуры, улавливающие отношения лид-лаг и эффекты заражения между активами.
5. Варианты DARTS
5.1 PC-DARTS (Partially Connected DARTS)
PC-DARTS решает проблему неэффективного использования памяти стандартным DARTS, который требует хранения всех кандидатных операций в памяти одновременно. Ключевые инновации:
- Частичные связи каналов: Только подмножество каналов выбирается для смешанной операции во время поиска, сокращая потребление памяти в 1/K раз
- Нормализация рёбер: Добавлена явная нормализация весов рёбер для стабилизации поиска
- PC-DARTS может выполнять поиск на более крупных прокси-сетях, что приводит к лучшим архитектурам
Для торговых приложений PC-DARTS позволяет выполнять поиск с большими наборами признаков и длинными окнами наблюдения, которые иначе превысили бы лимиты памяти.
5.2 FairDARTS
Стандартный DARTS страдает от несправедливого преимущества для операций без параметров (skip-соединения, ноль), поскольку их легче оптимизировать. FairDARTS решает это с помощью:
- Сигмоидная релаксация: Замена softmax на независимые сигмоидные активации для каждой операции, устраняя эффект конкурентного исключения
- Обработка нулевой операции: Нулевая операция обрабатывается отдельно с механизмом отсечения по порогу
- Это даёт более сбалансированные архитектуры с более богатыми вычислительными графами
В трейдинге это важно, поскольку skip-соединения (соответствующие «использовать сырые признаки напрямую») иначе доминировали бы, потенциально упуская важные нелинейные преобразования.
5.3 DARTS+ (Улучшенная устойчивость)
DARTS+ вводит раннюю остановку поиска архитектуры на основе собственных значений гессиана валидационных потерь. Когда доминирующее собственное значение становится слишком большим, поиск стал нестабильным и должен быть остановлен. Дополнительные улучшения включают:
- Вспомогательные skip-соединения: Добавлены к каждому промежуточному узлу для уменьшения несправедливого преимущества skip-соединений в поиске
- Регуляризация пространства поиска: L2-регуляризация параметров архитектуры для предотвращения преждевременной сходимости
5.4 Progressive DARTS (P-DARTS)
P-DARTS постепенно увеличивает глубину поисковой сети в процессе поиска:
- Начало с мелкой сети (меньше ячеек)
- Постепенное увеличение глубины с отсечением операций
- Это сокращает разрыв в глубине между поисковой и оценочной сетями
- Особенно актуально для трейдинга, где оптимальная глубина сети неизвестна
6. Пошаговое описание реализации на Rust
Наша реализация на Rust предоставляет полную систему DARTS, подходящую для торговых приложений. Реализация организована вокруг нескольких ключевых компонентов:
6.1 Примитивы операций
Каждая кандидатная операция реализует общий интерфейс, принимающий входной вектор и производящий выходной вектор. Наше пространство поиска включает:
- Identity: Передача входа без изменений (skip-соединение)
- Zero: Вывод нулей (эквивалент удалению ребра)
- Dense: Полносвязное линейное преобразование с обучаемыми весами
- Conv1D-подобная: Свёртка скользящим окном для обнаружения временных паттернов
- Skip Connection: Остаточное соединение для потока градиента
6.2 Смешанные операции и softmax-смешивание
Структура MixedOperation хранит параметры архитектуры alpha для каждой кандидатной операции и вычисляет взвешенную softmax-смесь во время прямого прохода. Температура softmax может быть отожжена во время поиска для постепенного заострения распределения архитектуры.
6.3 Цикл двухуровневой оптимизации
Процедура поиска чередует:
- Выборку обучающего батча и обновление весов сети w
- Выборку валидационного батча и обновление параметров архитектуры alpha
Оба обновления используют простой градиентный спуск с настраиваемыми скоростями обучения. Градиент архитектуры вычисляется с использованием аппроксимации первого порядка для эффективности.
6.4 Дискретизация архитектуры
После завершения поиска метод discretize() извлекает финальную архитектуру, выбирая операцию с наибольшим весом на каждом ребре. Полученная дискретная архитектура может быть оценена независимо.
7. Интеграция данных Bybit
Реализация включает полную интеграцию с API Bybit для получения реальных рыночных данных:
Конвейер данных:
- Получение: Запрос к конечной точке
/v5/market/klineBybit для свечей BTCUSDT - Разбор: Извлечение open, high, low, close, volume из JSON-ответа
- Нормализация: Применение z-score нормализации к каждому признаку
- Окно: Создание выборок скользящего окна для прогнозирования временных рядов
- Разделение: Деление на обучающий и валидационный наборы для двухуровневой оптимизации
8. Ключевые выводы
-
DARTS делает NAS практичным, заменяя дискретный поиск непрерывной оптимизацией. Поиск архитектуры, ранее требовавший тысячи GPU-дней, теперь завершается за часы, что делает его осуществимым для торговых приложений, где модели должны часто обновляться.
-
Непрерывная релаксация — ключевая идея. Заменяя жёсткий выбор операций на взвешенные softmax-смеси, DARTS позволяет оптимизировать выбор архитектуры на основе градиентов наряду с весами сети.
-
Двухуровневая оптимизация обеспечивает обобщение. Оптимизация параметров архитектуры на валидационных данных при обучении весов на обучающих данных помогает находить архитектуры, которые обобщают, а не переобучаются.
-
Трейдинг выигрывает от автоматического проектирования архитектуры. Финансовые рынки демонстрируют смену режимов, которая может требовать различных архитектур сети. DARTS обеспечивает быструю автоматическую адаптацию архитектуры без ручного вмешательства.
-
Пространства поиска операций должны быть специфичны для области. Для трейдинга включайте операции, захватывающие релевантную финансовую динамику: временные свёртки для обнаружения паттернов, skip-соединения для доступа к сырым признакам и полносвязные слои для нелинейного взаимодействия признаков.
-
Варианты решают практические ограничения. PC-DARTS снижает требования к памяти, FairDARTS устраняет смещение в сторону операций без параметров, а DARTS+ улучшает стабильность поиска. Выбирайте вариант, соответствующий вашим вычислительным ограничениям и характеристикам данных.
-
Дискретизация — критический шаг. Разрыв между непрерывной релаксированной архитектурой и дискретизированной финальной архитектурой может влиять на производительность. Техники прогрессивного поиска (P-DARTS) и тщательный выбор рёбер помогают преодолеть этот разрыв.
-
Реализация на Rust обеспечивает производительность. Реализуя DARTS на Rust, мы достигаем безопасности памяти и характеристик производительности, необходимых для боевых торговых систем, сохраняя при этом возможность интеграции с потоками данных бирж, таких как Bybit.