Давайте обсудим идеи, лежащие в основе интеллектуального поиска гиперпараметров для ваших моделей машинного обучения.

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

Один из вариантов - гиперпараметры; это параметры, которые контролируют процесс обучения, но не могут быть получены с помощью самого обучения. Вот несколько примеров:

  • Скорость обучения, эпохи, количество слоев / нейронов в нейронной сети.
  • Количество деревьев, максимальная глубина, критерии качества в случайном лесу.
  • Значения ядра, гаммы и C из опорных векторных машин.

Некоторые из возникающих вопросов: Какие гиперпараметры я должен установить для этой модели? Достаточно ли хороши стандартные? Могу ли я повысить производительность, просто попробовав еще несколько архитектур? И как я могу решить, какие варианты попробовать? Все эти вопросы связаны с настройкой гиперпараметров [1].

В этом посте я расскажу:

  • Стандартные стратегии настройки гиперпараметров в контролируемых моделях.
  • Проблема с неосведомленными стратегиями.
  • Компромиссы информированных стратегий.
  • Как реализовать идеи генетических алгоритмов (ГА) для настройки гиперпараметров.
  • Какие дополнительные функции мы могли бы добавить в GA.
  • Ссылки на пакеты Python с несколькими реализациями.

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

1. Базовые стратегии:

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

  • Поиск по сетке
  • Рандомизированный поиск по сетке
  • Байесовская оптимизация
  • Генетические алгоритмы

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

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

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

2. Визуализация проблемы

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

Я упрощу это представление в виде одномерной функции, чтобы получить некоторую интуицию:

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

dot 1: {"learning_rate": 0.001, "layers": 5, "optimizer": "Adam"}
dot 2: {"learning_rate": 0.01, "layers": 3, "optimizer": "Adagrad"}
dot 3: {"learning_rate": 1, "layers": 6, "optimizer": "SGD"}
dot 4: {"learning_rate": 0.001, "layers": 8, "optimizer": "RMSprop"}
dot 5: {"learning_rate": 0.1, "layers": 20, "optimizer": "SGD"}

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

Хорошо ... мы поняли проблему, так как мы можем ее исправить?

3. Информативный способ

Два других метода, которые я упомянул, - это байесовская оптимизация [3] и генетические алгоритмы [4], которые, можно сказать, следуют информативным критериям, чтобы сделать выбор, что их объединяет, так это то, что они следуют последовательному процессу, в котором пытаются чтобы найти лучший набор гиперпараметров по прошлым решениям, которые они приняли, поэтому, если мы будем рассматривать это как итеративный процесс, это может выглядеть так:

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

Конечно, как и ожидается в науке о данных, это не лучшая идея; может возникнуть несколько вещей, чтобы упомянуть некоторые:

  • Дилемма разведки и эксплуатации. Следует ли мне отправиться в менее изученные регионы, если я чего-то упускаю? Или я должен продолжать пробовать точки рядом с регионами, которые я уже знаю, которые показывают многообещающие результаты?
  • Локальный максимум: это возможный результат первого; что, если моя функция оптимизации невыпуклая, нелинейная и шумная? Что, если я застряну на локальном максимуме, думая, что это лучшее (глобальный максимум) решение?
  • Потребление ресурсов. Как видите, мы сделали этот итеративный процесс, который может потреблять больше ресурсов, чем простой поиск по сетке.
  • Новые параметры: Сколько итераций мне следует выполнить? Как я могу контролировать исследование или использование? , должен ли я создавать больше наборов на каждой итерации? Разве это не просто дополнительные гиперпараметры, которые я должен выбрать?

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

Вы можете проверить, например, sklearn-генетический-opt для подхода генетических алгоритмов или scikit-optimize для байесовского подхода. Я объясню подход с использованием генетических алгоритмов.

4. Подход с использованием генетических алгоритмов (GA)

Генетический алгоритм - это метаэвристика, вдохновленная естественным отбором; они используются в задачах оптимизации и поиска в целом и обычно основаны на наборе функций, таких как мутация, кроссовер и отбор [2]. Назовем их генетическими операторами.

В этом разделе я буду использовать следующие термины как синонимы, чтобы установить связь между GA и машинным обучением:

Один выбор гиперпараметров → Индивидуальный

Население → Несколько особей

Генерация → Одна фиксированная итерация, которая содержит фиксированную совокупность

Ценность фитнеса → Оценка перекрестной проверки

Есть несколько вариантов, но в целом действия выглядят следующим образом:

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

Пойдем шаг за шагом.

4.1–4.2 Создайте поколение 0 и оцените его:

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

Каждый набор обычно кодируется в форме хромосомы, двоичного представления группы; например, если мы установим размер первого поколения в три человека, это будет выглядеть так:

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

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

4.3 Создание нового поколения:

Теперь мы можем создать новый набор кандидатов; как уже упоминалось, существует несколько генетических операторов; Я покажу самые распространенные:

Кроссовер:

Этот оператор состоит из двух родительских хромосом и их соединения для создания новых потомков; то, как мы выбираем родителей, может быть с помощью функции распределения вероятностей, которая дает большую вероятность людям с более высокой приспособленностью к поколению, скажем, выбраны индивидуальные числа 1 и 3, тогда мы можем взять две случайные точки каждого родителя и сделать кроссовер вот так:

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

Child 1: {"learning_rate": 0.015, "layers": 4, "optimizer": "Adam"}
Child 2: {"learning_rate": 0.4, "layers": 6, "optimizer": "SGD"}

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

Мутация:

С достаточно низкой вероятностью (‹~ 0,1) этот оператор случайным образом изменяет один из генов или целый гиперпараметр для создания более разнообразных наборов.

Возьмем, например, дочерний из предыдущего изображения; давайте возьмем случайный ген и изменим его значение:

Или даже может изменить целый параметр, например оптимизатор:

Элитарность:

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

Итак, после выполнения этих операций новое поколение может выглядеть так:

С этого момента просто повторяйте процесс для нескольких поколений, пока не достигнете критерия остановки, например:

  • Достигнуто максимальное количество поколений.
  • Процесс длился дольше установленного бюджета.
  • За последние n поколений нет улучшений производительности (ниже порогового значения).

Следующее изображение - это пример того, что мы могли бы получить после запуска нашего оптимизатора GA в течение нескольких поколений; это регрессионная модель, использующая случайный лес с метрикой r-квадрат:

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

Чем темнее цвет на этом изображении, тем больше различных оценок применялось в этой области; счет такой же R-квадрат.

Итак, сейчас возникает вопрос, как мы можем это реализовать? Надо ли делать это с нуля? Как упоминалось ранее, уже есть несколько пакетов, которые могут в этом помочь; мы увидим особенности одного из них.

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

Представляем Sklearn-генетический-опт

Sklearn-Genetic-opt - это пакет на основе Python, который использует эволюционные алгоритмы из пакета DEAP для выбора набора гиперпараметров, которые оптимизируют (макс. Или мин.) Баллы перекрестной проверки; пакет можно использовать как для регрессионных, так и для классификационных задач. На данный момент Sklearn-генетический-opt совместим с любым регрессором или классификатором scikit-learn (или совместимым со sklearn).

Этот пакет имеет следующие особенности:

  • GASearchCV: основной класс пакета содержит эволюционную процедуру оптимизации перекрестной проверки и имеет API, аналогичный scikit-learn GridSeachCV.
  • Алгоритмы: набор различных эволюционных алгоритмов для использования в качестве процедуры оптимизации.
  • Обратные вызовы. Пользовательские стратегии оценки для создания правил ранней остановки, ведения журнала или вашей пользовательской логики.
  • Графики. Создавайте заранее определенные графики, чтобы понять процесс оптимизации. Например, последние два графика пришли из пакета.
  • MLflow: встроенная интеграция с mlflow для регистрации и управления жизненным циклом всех гиперпараметров, CV-оценок и подогнанных моделей.

Таким образом, он работает с использованием аналогичных процедур, подобных описанной в последнем разделе, но добавляет некоторые дополнительные функции, такие как обратные вызовы, ведение журнала MLflow и подход с использованием различных алгоритмов; это выглядит так:

А вот как может выглядеть протоколирование MLflow:

Вот и все! Спасибо, что прочитали этот контент; Я надеюсь, что это было полезно для размышлений о ваших стратегиях настройки; вот ссылки по теме для последнего пакета, если вы хотите его проверить:

Документация: https://sklearn-genetic-opt.readthedocs.io/en/stable/

Репозиторий: https://github.com/rodrigo-arenas/Sklearn-genetic-opt

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

[1] https://en.wikipedia.org/wiki/Hyperparameter_optimization

[2] https://www.jmlr.org/papers/volume13/bergstra12a/bergstra12a.pdf

[3] https://www.cs.toronto.edu/~rgrosse/courses/csc411_f18/tutorials/tut8_adams_slides.pdf

[4] https://en.wikipedia.org/wiki/Genetic_algorithm