ensmallen
Высокопроизводительная библиотека численной оптимизации на C++. Она предоставляет единый и гибкий интерфейс для оптимизации произвольных целевых функций, поддерживая широкий спектр алгоритмов — от классических градиентных методов до современных стохастических техник и эволюционных стратегий. Библиотека тесно интегрируется с Armadillo для эффективных линейно-алгебраических операций и широко используется в машинном обучении и научных вычислениях.
Особенности
- Широкий спектр оптимизаторов: полноградиентные методы, стохастические, безградиентные, методы для задач с ограничениями и многокритериальной оптимизации;
- Поддержка произвольных, дифференцируемых, сепарабельных, разреженных и категориальных целевых функций;
- Все данные представляются через типы
arma::mat, что обеспечивает высокую производительность за счёт оптимизированных BLAS/LAPACK-библиотек; - Для создания нового оптимизатора достаточно реализовать один метод, а для новой целевой функции — один-два C++ метода.
Основные компоненты
Библиотека построена вокруг концепции разделения целевой функции и оптимизатора. Пользователь определяет класс функции с необходимыми методами, после чего любой подходящий оптимизатор может быть применён для поиска минимума (подробнее с документацией можно ознакомиться здесь).
Определение целевой функции
В зависимости от свойств функции, пользователь реализует соответствующий набор методов. Наиболее общий случай требует только вычисления значения. Для дифференцируемых функций добавляется вычисление градиента.
Основные методы для разных типов функций:
- Произвольная функция:
double Evaluate(const arma::mat& x)— возвращает значение функцииf(x).
- Дифференцируемая функция:
double Evaluate(const arma::mat& x)— значение функции;void Gradient(const arma::mat& x, arma::mat& g)— вычисление градиентаf'(x)и сохранение вg;- (Опционально)
double EvaluateWithGradient(const arma::mat& x, arma::mat& g)— одновременное вычисление значения и градиента, часто эффективнее раздельных вызовов.
- Сепарабельная функция:
- Дополнительно требуются методы для работы с мини-батчами:
Evaluate()иGradient()с параметромbegin/batchSize, а такжеNumFunctions()иShuffle().
- Дополнительно требуются методы для работы с мини-батчами:
Категории оптимизаторов
ensmallen включает десятки готовых оптимизаторов, разбитых по категориям. Каждый оптимизатор имеет метод Optimize(f, x), где f — целевая функция, а x — начальное приближение (после вызова содержит найденный оптимум).
Основные категории и примеры:
- Полноградиентные:
ens::L_BFGS— ограниченная по памяти BFGS, эффективен для задач со средней размерностью;ens::GradientDescent— классический градиентный спуск.
- Стохастические:
ens::SGD— стохастический градиентный спуск;ens::Adam,ens::AdaGrad,ens::RMSProp— адаптивные методы, популярные в глубоком обучении;ens::AdaBelief,ens::Yogi,ens::DemonSGD— современные модификации Adam.
- Безградиентные:
ens::CMAES— ковариационная стратегия эволюции;ens::CNE— классическая нейроэволюция;ens::DE— дифференциальная эволюция.
- Для задач с ограничениями:
ens::AugLagrangian— метод множителей Лагранжа;ens::FrankWolfe— алгоритм Франка-Вульфа для выпуклых задач с простыми ограничениями;ens::FBS,ens::FISTA,ens::FASTA— проксимальные градиентные методы для L1-регуляризации и подобных задач.
- Многокритериальные:
ens::NSGA2,ens::MOEA_D— алгоритмы для поиска Парето-фронта.
Коллбэки
ensmallen предоставляет механизм коллбэков для тонкой настройки поведения оптимизации, логирования и ранней остановки.
Основные коллбэки:
ens::PrintLoss— вывод значения функции на каждой итерации;ens::EarlyStopAtMinLoss— остановка при достижении минимальной ошибки;ens::ProgressBar— отображение прогресса оптимизации;ens::StoreBestCoordinates— сохранение лучших параметров;ens::GradClipByNorm/ens::GradClipByValue— ограничение градиентов для стабильности.