В этой статье наглядно объясняется, как работает алгоритм CMA-ES в библиотеке Optuna. Подойдёт тем, кто хочет понять принцип оптимизации, не углубляясь в сложную математику и английскую документацию.
Что такое Optuna и сэмплинг
Optuna — это библиотека для оптимизации гиперпараметров. Вместо полного перебора она использует результаты предыдущих запусков, чтобы умно выбирать новые значения гиперпараметров, например, такие, которые уменьшат loss или улучшат метрики вроде recall и precision.
Каждый запуск модели с определённым набором гиперпараметров (например, learning_rate = 0.01, batch_size = 32) — это одна точка в пространстве возможных решений. Задача Optuna — находить следующую точку так, чтобы приблизиться к оптимальному решению.
Процесс выбора следующей точки называется сэмплированием. Алгоритмы, которые это делают, — сэмплеры. Они определяют, в какую сторону двигаться и какие значения выглядят многообещающе. Основные сэмплеры в Optuna:
- TPE
- Random
- CMA-ES (Covariance Matrix Adaptation Evolution Strategy)
В этой статье подробно разбирается CMA-ES.
Шаг 1: Задание пространства гиперпараметров
Цель CMA-ES — найти глобальный минимум целевой функции. На практике это может быть, например, ошибка модели XGBoost в зависимости от гиперпараметров scale_pos_weight и max_depth.
Начнём с точки (0, -1). Алгоритм будет искать следующие точки в окрестности текущей. Эту окрестность можно представить как доверительный эллипс — область, в которой с высокой вероятностью будут находиться перспективные точки.
Для начала зададим:
- sigma = 0.8 — начальный шаг поиска (влияет на радиус области)
- среднее — начальный центр поиска (координаты начальной точки)
- ковариационная матрица C — единичная матрица, что означает симметричный поиск (форма области — круг, а не эллипс)
Таким образом, область поиска — круг радиусом σ·√5.991 ≈ 1.96, в котором с 95% вероятностью будут сгенерированные точки. Единичная ковариационная матрица означает, что поиск ведётся одинаково во всех направлениях.
Шаг 2: Сэмплирование точек
На этом этапе генерируются потенциально хорошие точки — те, что могут быстрее привести к минимуму. Точки берутся из нормального распределения вокруг текущего центра.
На каждой итерации генерируется 15 новых точек по формуле:
x = mean + sigma × N(0, C)
где:
- mean — текущее среднее (центр поиска)
- sigma — длина шага
- N(0, C) — двумерное нормальное распределение с нулевым средним и ковариационной матрицей C
- C — ковариационная матрица
- 15 — размер выборки
Таким образом, алгоритм исследует пространство в разных направлениях.
Шаг 3: Отбор лучших точек
Лучшими считаются точки с минимальным значением целевой функции. Из 15 сгенерированных выбираем топ-7 (половину).
Эти лучшие (красные) точки используются для определения направления дальнейшего поиска. Худшие (синие) отбрасываются.
Каждой лучшей точке присваивается вес — чем лучше точка, тем больше её вклад в обновление центра поиска.
Новое среднее (новый центр поиска) вычисляется как взвешенное среднее координат лучших точек. Это похоже на градиентный спуск: мы двигаемся туда, где функция даёт лучшие значения.
Шаг 4: Адаптация ковариационной матрицы и шага поиска
Ковариационная матрица C определяет форму области поиска. Её обновление позволяет алгоритму «запоминать» удачные направления и адаптироваться к ландшафту функции.
Новая матрица — это комбинация старой и новой, построенной по лучшим точкам. Формула обновления:
C = (1 - c_cov) × C + c_cov × Σ(w_i × d_i × d_i^T)
где:
- c_cov — скорость обучения для обновления матрицы (например, 0.9)
- d_i — нормализованные шаги лучших точек
- w_i — веса точек
Собственные значения матрицы показывают, насколько вытянута область поиска в каждом направлении. Это помогает быстрее двигаться вдоль оврагов и сложных форм ландшафта.
Теперь обновим глобальный шаг поиска (sigma). Это делается с помощью эволюционного пути — вектора, который накапливает информацию о направлении движения центра поиска.
Формула включает несколько ключевых параметров:
- Эволюционный путь — направление, в котором двигался центр поиска
- Ожидаемая длина вектора — эталон для случайного движения (если нет направленного поиска)
- Скорость обучения — насколько быстро алгоритм реагирует на новые данные
- Демпфирующий параметр — стабилизирует изменения шага
Если алгоритм уверенно движется в одном направлении, шаг увеличивается. Если топчется на месте — уменьшается. Это позволяет балансировать между скоростью и точностью.
Резюме: как работает CMA-ES
Алгоритм повторяется до сходимости. Основные шаги:
- Начинаем с одной точки и круговой области поиска
- Генерируем новые точки вокруг центра
- Оцениваем их по значению целевой функции
- Выбираем лучшие и перемещаем центр поиска
- Обновляем форму области (через ковариационную матрицу)
- Регулируем размер шага в зависимости от уверенности в направлении
- Повторяем, пока не найдём глобальный минимум
Преимущества CMA-ES
CMA-ES — мощный метод оптимизации без градиентов. Его ключевые преимущества:
- Работает с функциями, у которых нет производных, есть шум, разрывы или локальные минимумы
- Не требует тонкой настройки — большинство параметров адаптируется автоматически
- Эффективен в пространствах от нескольких до сотен измерений
- Хорошо масштабируется и поддерживает параллельные вычисления
- Сходится быстро на квадратичных функциях, даже без градиентов
Основная идея — адаптация ковариационной матрицы и управление шагом поиска — позволяет алгоритму учиться геометрии функции на ходу.
Таким образом, CMA-ES сочетает случайный поиск и интеллектуальную адаптацию, оставаясь надёжным инструментом для сложных задач оптимизации в Optuna.