Новая альтернатива легкой и крупномасштабной оптимизации гиперпараметров

Одной из определяющих задач при построении моделей машинного обучения является оптимизация гиперпараметров. Правильная оптимизация гиперпараметров напрямую отражается на производительности модели. Вот почему оптимизация гиперпараметров была активной областью исследований в течение нескольких лет. К счастью, сегодня есть несколько альтернатив, которые можно использовать для оптимизации моделей машинного обучения, таких как: HyperOpt [1], Spearmint [2], Vizer [3], AutoSklearn [4] или Autotune [5]. Каждая из этих альтернатив предлагает различные парадигмы оптимизации. Точно так же каждый из этих инструментов оптимизации предлагает другой подход к удобству использования, который может стать более или менее гибким в зависимости от случая.

В этом контексте появляется Optuna [6], цель которого - унифицировать парадигмы оптимизации в соответствии с философией, поддерживаемой тремя столпами: API проектирования за запуском , эффективная реализация и простота настройки. Поэтому в этом блоге мы увидим, что такое Optuna, его компоненты, его парадигма оптимизации и способы ее применения на практике с помощью Scikit-Learn и PyTorch. Итак, этот блог будет разделен на:

  • Что такое Optuna?
  • Интеграция Optuna и Scikit-Learn
  • Интеграция Optuna и PyTorch

Что такое Optuna?

Optuna был представлен Takuya Akiba et. al. [6] в 2019 году. Optuna - это библиотека Python с открытым исходным кодом для оптимизации гиперпараметров. В фоновом режиме Optuna стремится сбалансировать алгоритмы выборки и сокращения. Optuna реализует такие алгоритмы выборки, как Древовидная структура оценщика парзена (TPE) [7, 8] для выборки независимых параметров, а также гауссовских процессов (GP) [8] и Адаптация ковариационной матрицы (CMA) [9] для реляционной выборки параметров, целью которой является использование корреляции между параметрами. Аналогичным образом, Optuna реализует вариант алгоритма Асинхронного последовательного сокращения вдвое (ASHA) [10] для сокращения пространств поиска.

Optuna представляет собой программу оптимизации гиперпараметров в соответствии с новым критерием дизайна, который основан на трех фундаментальных идеях: определить- побочный API, который позволяет пользователям создавать и манипулировать пространствами поиска динамическим образом, эффективная реализация, ориентированная на оптимальную функциональность выборки стратегии, а также алгоритмы обрезки, и простота настройки, ориентированная на универсальность, то есть позволяет оптимизировать функции в легких средах, а также проводить крупномасштабные эксперименты в среды, основанные на распределенных и параллельных вычислениях. На рисунке 2 мы видим визуальное описание архитектуры Optuna.

Критерии, по которым разработан Optuna, делают его простым в реализации, гибким и масштабируемым. Благодаря свойству масштабируемости Optuna оптимизацию крупномасштабных экспериментов можно проводить как параллельно, так и распределенно. Optuna не зависит от фреймворка, то есть его можно легко интегрировать с любыми фреймворками машинного и глубокого обучения, такими как PyTorch, Tensorflow. , Keras, Scikit-Learn, XGBoost и т. д.

Реализация Optuna относительно проста и интуитивно понятна. Во фрагменте кода 1 мы видим скелет базовой реализации Optuna. В основном требуется определить функцию python, которая будет действовать как обертка процедуры для получения значения, которое нужно оптимизировать (минимизировать или максимизировать). Эта процедура состоит из 3 основных шагов: определение пространства поиска, реализация модели и получение значения для оптимизации. .

Отлично, до сих пор мы уже знаем, что такое Optuna, его компоненты и атрибуты. Давайте теперь посмотрим на пару интеграций. В следующем разделе мы увидим интеграцию Optuna с Scikit-Learn, а позже мы увидим интеграция с PyTorch, давайте!

Optuna и интеграция Scikit-Learn

В этом примере мы собираемся решить проблему классификации, используя хорошо известный набор данных о раке груди и алгоритм Random Forest. Идея состоит в том, чтобы реализовать Optuna для оптимизации каждого из гиперпараметров случайного леса, чтобы максимизировать среднюю точность, которая будут сгенерированы через K-кратную процедуру перекрестной проверки.

Как мы видим в предыдущем фрагменте кода, оболочка содержит определение области поиска, модель и расчет значения, которое нужно оптимизировать. В строках 4–6 выполняется определение области поиска трех гиперпараметров, которые необходимо оптимизировать. Как мы видим, для критериев разделения деревьев решений алгоритма Случайный лес определено категориальное пространство поиска, с другой стороны. стороны, для количества оценщиков и максимальной глубины определены целочисленные пространства поиска. Затем инициализируется модель Случайный лес (строка 9), и выполняется обучение в соответствии с процедурой перекрестной проверки k-кратности (строка 18), точность каждой кратности сохраняется (строка 32) и, наконец, возвращается средняя точность (строка 34). Возврат этой функции (в данном случае средняя точность) - это то, что каждое испытание каждого исследования Optuna использует в качестве параметра для настройки алгоритмов выборки и отсечения. Наконец, оптимизацию этой функции можно провести с помощью следующих определений:

Наконец, при выполнении оптимизации, получении оптимальных гиперпараметров и обучении модели с такой оптимальной конфигурацией мы получаем:

Best average accuracy: 0.9666356155876418
Best parameters: {'criterion': 'entropy', 'n_estimators': 40, 'max_depth': 6}
Train score: 1.0
Test score: 0.982456140350877

Вы можете найти полную реализацию этого примера здесь: https://github.com/FernandoLpz/Optuna-Sklearn-PyTorch

Как мы видим, интеграция Optuna и Scikit-Learn относительно проста и интуитивно понятна. В общем, достаточно обернуть модель Scikit-Learn и вернуть значение для оптимизации. Определение исследования Optuna позволяет нам определить, будет ли процедура максимизацией или минимизацией.

Теперь давайте посмотрим на более надежную интеграцию с PyTorch, где мы попытаемся найти оптимальные гиперпараметры и даже оптимальное количество слоев, которые нейронная сеть должна содержать, давайте!

Интеграция Optuna и PyTorch

В этом примере мы рассмотрим проблему многоклассовой классификации, используя хорошо известный набор данных MNIST. Для практических целей реализуемая нами нейронная сеть будет состоять только из линейных слоев. Идея состоит в том, чтобы использовать Optuna для поиска оптимальных гиперпараметров модели, таких как: оптимизатор и скорость обучения . Кроме того, мы будем использовать Optuna, чтобы найти оптимальное количество слоев в нейронной сети, а также оптимальное количество единиц для каждого слоя.

Итак, давайте начнем с определения нейронной сети:

Одним из преимуществ Optuna является то, что он позволяет нам определять объекты, которые определяют пространства поиска динамически. В этом случае мы сначала инициализируем пустой стек, где объекты, определяющие линейные слои и отсевы, определенные пробным (строки 6 и 7), будут динамически сохранены. Впоследствии определяется пространство поиска для количества слоев и исключения (строки 11 и 12). Затем начинается процесс внесения в стек динамического количества линейных слоев, определяемого пробным путем, а также количества единиц для каждого слоя. Важно отметить, что входное измерение первого слоя и выходное измерение последнего слоя всегда будут статическими (строки 15 и 29 соответственно). Размеры остальных слоев будут определены пробным (строка 20). На данный момент у нас уже есть стопка линейных слоев с соответствующими входными и выходными размерами и стопка выпадающих слоев. Однако в PyTorch класс, определяющий нейронную сеть, должен иметь переменные экземпляра, которые относятся к объектам, которые определяют каждый компонент нейронной сети. В этом случае каждый слой и выпадение, определенные в стеках, должны быть определены как переменные экземпляра (строки 36 и 39). Наконец, функция вперед. Поскольку количество слоев и отсевов уже определено в стеках, нам просто нужно развернуть стеки и передать входной тензор x по каждому слою и выпадению.

Как мы уже заметили, определение нейронной сети не подразумевает сложности, рассматриваются только динамические назначения каждого компонента сети. Теперь давайте посмотрим, как обучить эту нейронную сеть для оптимизации гиперпараметров.

С учетом скелета, показанного во фрагменте кода 1, функция оболочки, определенная во фрагменте кода 5, будет эквивалентом оптимизации нейронной сети. Сначала нейронная сеть инициализируется путем передачи ей trial в качестве параметра (строка 4), затем определяются области поиска для оптимизатора и скорости обучения. и это все. Остальное - это обучить нейронную сеть партиями и вычислить точность в тестовом наборе, такая точность - это возвращаемое значение и то, которое Optuna использует для выполнения оптимизации.

В итоге, проведя оптимизацию, мы получаем следующие результаты:

Best accuracy: 0.944831498
Best parameters: {'n_layers': 2, 'dropout': 0.2048202637410447, 'output_dim_0': 13, 'output_dim_1': 24, 'optimizer': 'Adam', 'lr': 0.0030389965486299388}
Train score: 0.95349231
Test score: 0.94231892

Вы можете найти полную реализацию этого примера здесь: https://github.com/FernandoLpz/Optuna-Sklearn-PyTorch

Заключение

В этом блоге мы узнали, что такое Optuna, какова философия, на основе которой была разработана Optuna, ее компоненты и пара примеров интеграции Optuna с Scikit-Learn и PyTorch.

Существует множество альтернатив для оптимизации гиперпараметров. У некоторых есть общие черты в методологиях оптимизации, алгоритмах выборки и отсечения. Точно так же каждый из них предлагает определенные характеристики для использования и реализации каждого инструмента. В этом случае Optuna появляется как инструмент оптимизации гиперпараметров, который фокусируется на простоте, гибкости и масштабируемости реализации, что делает его пока хорошо принятым инструментом.

использованная литература

[1] Hyperopt: библиотека Python для оптимизации гиперпараметров алгоритмов машинного обучения

[2] Хранилище мяты

[3] Визер

[4] Auto-Sklearn 2.0: новое поколение

[5] Автонастройка: среда оптимизации без производных для настройки гиперпараметров

[6] Optuna: среда оптимизации гиперпараметров нового поколения

[7] Древовидный оценщик Парзена

[8] Алгоритмы оптимизации гиперпараметров

[9] Полностью дерандомизированная самоадаптация в стратегиях эволюции

[10] Система для параллельной настройки гиперпараметров