Оглавление

1. Введение

2. Различные методы оптимизации гиперпараметров

3. Настройка с помощью Keras-Tuner

Введение

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

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

  • Параметр: значения, которые изучаются моделью и не могут быть настроены специалистами по обработке и анализу данных. Включает среднее значение, дисперсию данных, веса, систематическую ошибку и т. д.
  • Гиперпараметр: Заранее заданный учеными по данным, он не может быть изучен моделью, такой как number of layers , number of neurons, learning_rate и т. д.…

Методы оптимизации гиперпараметров

Это будет краткое концептуальное объяснение без математических подробностей.

Поиск в сетке

Пространство поиска — это декартово произведение всех возможных гиперпараметров.

Например, если мы хотим попробовать два гиперпараметра, скажем, learning_rate и optimizer, [0,1, 0,001, 0,0001] и ['адам', 'SGD'] соответственно, модель поездов поиска по сетке с (0.1, 'адам'), (0.001, ' Адам»), (0,0001, Адам), (0,1, SGD), (0,001, SGD) и (0,0001, SGD), что является всеми возможными вариантами (декартово произведение двух списков).

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

Случайный поиск

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

Случайный поиск и поиск по сетке интуитивно понятны и просты в реализации, однако у них есть несколько недостатков:

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

Гиперполоса

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

Последовательное сокращение вдвое страдает от компромисса между бюджетом и количеством конфигураций:

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

Hyperband преодолевает этот компромисс, разделяя общий бюджет на несколько комбинаций number of config vs. budget (некоторые наборы пробуют большие конфигурации, некоторые пробуют маленькие конфигурации), а затем используют последовательное деление пополам для каждого набора.

Байесовская оптимизация

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

  1. Постройте вероятностную модель (суррогатную модель) целевой функции (гиперпараметр, который минимизирует цель, скажем, RMSE).
  2. Попробуйте разные гиперпараметры на вероятностной модели и выберите лучший.
  3. применить гиперпараметр, выбранный на втором шаге, к истинной целевой функции.
  4. обновить вероятностную модель, включив в нее новые результаты
  5. повторите шаги 1~4.

БОХБ

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

Настройка с помощью Keras-Tuner

Существует множество библиотек, поддерживающих различные методы оптимизации гиперпараметров, которые мы реализуем с помощью библиотеки keras-tuner, которая является частью библиотеки Keras. Некоторые другие популярные библиотеки, которые стоит проверить, это RayTune (часть Ray) и Optuna, я добавлю некоторые ресурсы, объясняющие эти библиотеки.

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

Сначала мы подготовим наши данные и построим модель без keras_tuner.

Вот гиперпараметры для настройки:

  • количество слоев
  • количество нейронов на слой
  • уровень отчисления
  • функция активации
  • скорость обучения

Две основные части:

  • build_model: построить модель, как указано выше, но с другим набором гиперпараметров, выбранных тюнером.
  • Tuner: класс, который управляет процессом поиска гиперпараметров, все различные методы HPO RandomSearch, HyperBand и BayesianOptimization являются подклассом класса Tuner.

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

Примечание: hpэто параметр, который передается классом тюнера при каждом испытании.

  • строки 2~7: инициализируем наше пространство поиска гиперпараметров в нашей функции.
  • 9~11: hp.Choice() выбирает значение из списка значений, а hp.Float() выбирает из min_value и max_value, и в зависимости от параметра «выборки» значения выбираются по-разному. В нашем случае, поскольку мы выбрали «логарифм», равные вероятности даны для каждого порядка величины 0,0001, 0,001 и 0,1.
  • 17~18: hp.Int() просто выберите целое значение из диапазона, обратите внимание, что верхний и нижний диапазоны включаются. Здесь мы выбираем number of neurons в диапазоне от 32 до 512.
  • 19~21: количество используемых слоев выбирается hp.Choice, -1 потому, что мы добавили один плотный слой выше. Теперь для каждого слоя мы выбираем number of neurons в диапазоне от 32 до 512. Если вы хотите, чтобы все слои имели одинаковые number of neurons, просто используйте dnn_units из строки 18 на каждой итерации (удалите строку 20).
  • 22: hp.Boolean() выбирает из True/False, если True, добавляется слой отсева с коэффициентом отсева 0,25.

Мы передаем построенную выше модель, а также цель (какой тюнер будет отслеживать производительность) в наш класс тюнера и начинаем поиск!

Из строки 13 видно, что цель нашего тюнера — максимизировать val_accuracy.

После создания тюнера с нашей моделью мы запускаем метод .search() для поиска в нашем пространстве поиска гиперпараметров. Обратите внимание, что при каждом испытании наш тюнер отправляет разные гиперпараметры для обучения, каждый подкласс тюнера (RandomSearch, Hyperband, BO) будет использовать свои собственные стратегии выбора следующих гиперпараметров.

После завершения поиска вся история сохраняется в directory/project_name/. Класс Tuner имеет несколько полезных методов, таких как result_summary() для отображения сводки настроек, get_best_hyperparameters() и т. д. Вы можете ознакомиться со всеми другими методами в официальной документации keras_tuner в разделе класса Tuner.

Теперь мы построим модель с лучшими гиперпараметрами и обучим ее на полном наборе данных.

Заключение

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

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

Керас-тюнер

rayTune