Optuna — это продвинутая структура оптимизации гиперпараметров с визуализацией для интерпретируемости.

Введение

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

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

Обзор гиперпараметров

Гиперпараметры — это переменные, которые контролируют процесс обучения модели машинного обучения. В конечном итоге они определяют, как модель изучает конкретную связь между входными данными и прогнозами.

Очень простой пример: «фиксировать перехват на простой линейной регрессии или нет» — это гиперпараметр модели линейной регрессии.

Часто бывает необходимо оптимизировать гиперпараметры модели для решения конкретной проблемы. Вот несколько причин, почему:

  • Гиперпараметры машинного обучения не подходят для всех, поскольку эти модели могут требовать различных ограничений для обобщения различных шаблонов данных вне выборки и различных проблем.
  • Оптимизация гиперпараметров позволяет нам получить оптимальную модель с лучшими наборами гиперпараметров. Эта модель должна давать оптимальные результаты, минимизирующие функцию потерь.

Обзор методов оптимизации

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

Традиционные методы

Традиционный способ выполнения оптимизации гиперпараметров был исчерпывающим и не информировал о предыдущей информации. Некоторые примеры:

  • Поиск по сетке, исчерпывающий поиск в предопределенном подмножестве.
  • Случайный поиск выбирает случайным образом из предопределенного подмножества.

По мере роста объема данных и пространства гиперпараметров некоторые из традиционных методов поиска быстро приходят в негодность. Они либо тратят слишком много времени, либо даже не могут найти минимумы.

Байесовский метод

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

После этого апостериорное распределение используется для формирования функции сбора данных, которая определяет следующую точку с наилучшей вероятностью улучшения.

Однако, поскольку он использует доступную информацию для принятия решений, возникает проблема исследования и эксплуатации.

  • Исследование похоже на глобальный поиск; мы заинтересованы в изучении пространства поиска гиперпараметров в поисках еще лучших решений.
  • Использование похоже на локальный поиск; мы хотим усовершенствовать наше текущее решение и постараться не тратить драгоценные ресурсы на нежелательные области поиска.

Затем предлагается несколько алгоритмов для оптимального баланса дилеммы разведки-эксплуатации. Вот некоторые примеры: оценщик Парцена с древовидной структурой (TPE) и регрессор гауссовского процесса, например. Кригинг.

Метод ранней остановки

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

Он работает путем проверки промежуточных оценок модели с помощью определенного набора гиперпараметров. Например, при обучении нейронной сети, допустим, для сети выбираются 16 различных наборов гиперпараметров. После пяти эпох мы проверяем все промежуточные оценки и отбрасываем те гиперпараметры, которые работают плохо.

Двумя популярными алгоритмами оптимизации с ранней остановкой являются последовательное деление пополам (SHA) и Hyperband.

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

Эволюционный метод

Эволюционные методы оптимизации ищут пространство гиперпараметров с помощью эволюционных алгоритмов. Этот метод был вдохновлен концепцией эволюции Чарльза Дарвина. Обычно это следует процессу, следующему за биологической концепцией эволюции:

  • Исходная выборка берется из пространства поиска гиперпараметров населения.
  • Гиперпараметры оцениваются с использованием функции пригодности и ранжируются по их относительной пригодности.
  • Наихудшие гиперпараметры отбрасываются, а новые наборы гиперпараметров генерируются посредством кроссовера и мутации.
  • Эволюционные процессы повторяются до тех пор, пока бюджетное ограничение или производительность не улучшится.

Представляем, Оптуна.

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

По умолчанию Optuna реализует байесовский алгоритм оптимизации (TPE), но его можно легко переключить на другие существующие алгоритмы в пакете.

Алгоритмы оптимизации в Оптуне

Optuna называет свои алгоритмы оптимизации двумя разными категориями, а именно стратегией выборки и стратегией обрезки.

  • Стратегия выборки:алгоритмы, которые выбирают наилучшую комбинацию параметров, концентрируясь на областях, где гиперпараметры дают лучшие результаты.
  • Стратегия сокращения. Методы оптимизации, основанные на ранней остановке, как мы обсуждали выше.

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

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

Стратегия выборки

TPESampler (оценщик Парцена с древовидной структурой):

Байесовский алгоритм оптимизации, который:

  1. Во-первых, случайным образом выбирает подмножество гиперпараметров и сортируетих на основе их оценок.
  2. Гиперпараметры далее делятся на две группы на основе некоторого предопределенного квантиля.
  3. Затем эти две группы моделируются с расчетными плотностямиl(x1) и g(x2) с использованием оценок Парзена (оценок плотности ядра).
  4. Найдите гиперпараметры с наибольшим ожидаемым улучшением [наименьшее значение l(x1)/g(x2)].
  5. Гиперпараметр с наибольшим ожидаемым улучшением оценивается, сортируется и снова делится. Этот процесс повторяется до тех пор, пока бюджет не будет завершен и не будут возвращены лучшие гиперпараметры.

NSGAIISampler (генетический алгоритм сортировки без доминирования II)

Эволюционный алгоритм оптимизации с несколькими целевыми функциями.

Говорят, что индивидуум (А) доминирует над индивидуумом (В), если

  • Нет цели A хуже, чем цель B
  • Существует по крайней мере одна цель A лучше, чем цель B.

Основной процесс алгоритма:

  1. Первоначально отбирается случайная родительская популяция, и каждому оцениваемому решению присваивается ранг пригодности, равный его уровню недоминирования. Сначала он выбирает все недоминируемые решения из совокупности P и присваивает им ранг 1, затем выбирает все из оставшихся решений и присваивает им ранг 2, и так далее, пока всем индивидуумам не будет присвоен ранг.
  2. Выбираются два случайных испытания, и лучшее из них становится Родителем 1. Процесс повторяется один раз для выбора другого Родителя 2 [Выбор бинарного турнира].
  3. Эти два родителя воссоединяются, чтобы произвести потомство, которое становится дочерней популяцией [Рекомбинация]. Дочерний элемент подвергается мутации и изменяет некоторые свои значения [Мутация]. Этот шаг повторяется до тех пор, пока исходный размер популяции не удвоится.
  4. Население снова отсортировано по недоминированию. Новое поколение будет выбрано в порядке ранга. Crowding-sort будет реализован для расчета плотности решений, если конкретный ранг только частично включен в следующее поколение. Менее плотные испытания выбираются для следующего поколения до тех пор, пока подсчет популяции снова не достигнет исходного размера популяции.
  5. Новое поколение воспроизводится и снова итеративно отбрасывается до тех пор, пока не будет достигнуто максимальное количество поколений и не будут возвращены лучшие гиперпараметры.

Некоторые другие популярные стратегии выборки: CMA-ES Sampler, MOTPE Sampler.

Стратегия обрезки

SuccessiveHalvingPruner (асинхронное последовательное деление пополам)

  1. Случайным образом выбирает начальный набор значений гиперпараметров.
  2. Тренируйте испытания в течение 1 эпохи, пока не будет достигнуто заданное максимальное количество испытаний.
  3. В то же время испытание одновременно продвигается на другую ступеньку (сходную с рангом) для обучения большего количества эпох всякий раз, когда результат испытания находится среди верхних d процентов в пределах ступени, где d — предопределенный делитель.

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

Некоторые другие популярные стратегии обрезки: MedianPruner, HyperbandPruner.

Реализация кода

Целевая функция

Прежде чем мы начнем реализовывать оптимизацию с помощью Optuna, нам необходимо определить целевую функцию.
Целевая функция будет содержать всю логику определения обычной модели, процесса обучения и тестирования. После оценки модели она должна вернуть метрику оценки, которую также выбирает пользователь.

Судебный процесс

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

import optuna
import sklearn
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score
def objective(trial):
    digits = sklearn.datasets.load_digits()
    x, y = digits.data, digits.target
    max_depth = trial.suggest_int("rf_max_depth", 2, 64, log=True)
    max_samples = trial.suggest_float("rf_max_samples", 0.2, 1)
   
    rf_model = RandomForestClassifier(
        max_depth = max_depth,
        max_samples = max_samples,
        n_estimators = 50,
        random_state = 42)
score = cross_val_score(rf_model, x, y,  cv=3).mean()
return score

Изучение

Затем можно вызвать объект Study, чтобы оптимизировать целевую функцию и найти наилучшую комбинацию гиперпараметров. Затем он будет запускать пробные версии итеративно, пока не будет задано максимальное пробное время или время, определенное пользователем. Испытание с лучшими гиперпараметрами будет сохранено в Study.best_trial.

study = optuna.create_study(direction = "maximize")
study.optimize(objective, n_trials = 100)
trial = study.best_trial
print("Best Score: ", trial.value)
print("Best Params: ")
for key, value in trial.params.items():
    print("  {}: {}".format(key, value))

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

optuna.visualization.plot_contour(study)

optuna.visualization.plot_param_importances(study)

Мы видим, что основным гиперпараметром, влияющим на производительность модели, является max_depth. На контурном графике по мере увеличения максимальной глубины производительность увеличивается независимо от max_samples.

Реализация обрезки

Во многих случаях, когда модель машинного обучения не дает никаких промежуточных результатов, реализация обрезки не так практична. Однако для случаев, когда присутствуют промежуточные значения, например, для нейронных сетей, отсечение — отличный способ сократить время вычислений.

Одним из примеров модели, которая дает промежуточные результаты, является стохастический градиентный спуск.

Во-первых, мы инициализируем целевую функцию.

import optuna
from optuna.pruners import SuccessiveHalvingPruner
from optuna.samplers import TPESampler
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
from sklearn.linear_model import SGDClassifier
def objective(trial):
# Loading the data set and splitting into train, test sets
    iris = load_iris()
    classes = list(set(iris.target))
    train_x, valid_x, train_y, valid_y = train_test_split(
        iris.data, iris.target, test_size=0.25
    )
    # Prompting Optuna to suggest a hyperparameter value
    alpha = trial.suggest_float("alpha", 1e-5, 1e-1, log=True)
    sgd = SGDClassifier(alpha = alpha, random_state = 42)
    # Report the intermediate score for every step
    for step in range(100):
        sgd.partial_fit(train_x, train_y, classes=classes)
        # Report the intermediate objective value.
        intermediate_value = sgd.score(valid_x, valid_y)
        trial.report(intermediate_value, step)
        # Prune the intermediate value if neccessary.
        if trial.should_prune():
            raise optuna.TrialPruned()
    return sgd.score(valid_x, valid_y)

После этого мы можем создать исследование с Optuna и оптимизировать целевую функцию.

study = optuna.create_study(sampler = TPESampler(), 
                            pruner = SuccessiveHalvingPruner(),
                            direction= "maximize")
study.optimize(objective, n_trials = 20)

pruned_trials = study.get_trials(states=[optuna.trial.TrialState.PRUNED])
complete_trials = study.get_trials(states=[optuna.trial.TrialState.COMPLETE])
print("# Pruned trials: ", len(pruned_trials))
print("# Complete trials: ", len(complete_trials))
trial = study.best_trial
print("Best Score: ", trial.value)
print("Best Params: ")
for key, value in trial.params.items():
    print("  {}: {}".format(key, value))

Мы увидим еще два участка, которые предоставила компания «Оптуна». Эти графики могут помочь нам проверить историю оптимизации и увидеть, какие испытания были сокращены.

optuna.visualization.plot_optimization_history(study)

optuna.visualization.plot_intermediate_values(study)

Мы можем увидеть, как работают секаторы, остановив нежелательные гиперпараметры с плохими промежуточными значениями и сосредоточившись на обучении лучших гиперпараметров.

Еда на вынос

Optuna позволяет нам внедрять самые современные алгоритмы оптимизации, чтобы ускорить процесс настройки гиперпараметров, который необходим в конвейере машинного обучения.

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

  • Если мы тренируемся только с небольшим объемом данных, используя менее сложную модель, GridSearch и RandomSearch могут превзойти эти алгоритмы с точки зрения скорости и производительности.
  • При этом по мере увеличения объема данных и усложнения моделей стоимость случайного обучения набора гиперпараметров без какой-либо информации значительно возрастает, и эти усовершенствованные алгоритмы значительно превосходят традиционные методы.

Большое спасибо, что нашли время, чтобы прочитать этот кусок письма.

Рекомендации

[1] Т. Акиба, С. Сано, Т. Янасэ, Т. Охта и М. Кояма. Optuna: платформа оптимизации гиперпараметров нового поколения (2019 г.), arXiv.

[2] Л. Ли, К. Джеймисон, А. Ростамизаде, Э. Гонина, М. Хардт, Б. Рехт, А. Талвалкар. Система массовой параллельной настройки гиперпараметров (2018), arXiv.

[3] Дж. Бергстра, Р. Барденет, Ю. Бенжио и Б. Кегл. Алгоритмы оптимизации гиперпараметров (2011 г.), Материалы 24-й Международной конференции по системам обработки нейронной информации (NIPS’11). Curran Associates Inc., Ред-Хук, Нью-Йорк, США, 2546–2554.

[4] К. Деб, А. Пратап, С. Агарвал и Т. Мейариван, Быстрый и элитарный многоцелевой генетический алгоритм: NSGA-II (2002), IEEE Transactions on Evolutionary Вычисления, том. 6, нет. 2, стр. 182–197. дои: 10.1109/4235.996017.