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

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

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

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

Обзор статьи

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

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

Краткий обзор алгоритма дифференциальной эволюции

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

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

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

Используя итеративный процесс, Differential Evolution может минимизировать функцию, выполнив следующие действия:

1 - Инициализация: создайте начальную популяцию с векторами NP со случайными значениями параметров в пределах границ.

2 - Начальная оценка: вычислить значение функции для векторов NP.

3 - Для каждого переносчика в популяции:

3.1 - Мутация: мы строим мутантный вектор, где значение каждого параметра вычисляется как мутация параметров других векторов, случайно выбранных из популяции. Распространенной стратегией для вычисления этого мутантного вектора является best1bin, где каждый параметр pᵢ мутантного вектора вычисляется, как показано в уравнении ниже. Параметр мутанта - это вариант параметра pᵢ для лучшего вектора (вектора с наименьшим значением) плюс скорость мутации ( F) умноженное на pᵢ- разность двух случайно выбранных векторов, r₁ и r₂.

3.2 - Рекомбинация: пробный вектор создается путем выбора каждого из его параметров в качестве значения текущего вектора или значения мутантного вектора. Для каждого параметра мы генерируем случайное равномерное число R в интервале (0,1). Если R ниже, чем скорость рекомбинации, мы принимаем мутантный параметр; в противном случае мы используем параметр текущего параметра.

3.3 - Замена: оцените функцию пробного вектора. Если он более устойчив, чем текущий, замените текущий вектор пробным вектором.

4 - Повторяйте шаг 3 до сходимости генеральной совокупности: итерация останавливается, когда стандартное отклонение функции в генеральной совокупности меньше определенного процента от среднего значения функции. Цикл также останавливается, если сходимость не достигается после максимального количества итераций.

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

Генерировать данные

В качестве примера мы будем использовать данные, которые соответствуют двумерной функции f (x₁, x₂) = sin (x₁) + cos (x₂), плюс небольшое случайное изменение в интервале (-2 , 2) чтобы оживить. Следовательно, наши данные будут соответствовать выражению:

На рисунке ниже мы показываем в оттенках серого значение sin (x₁) + cos (x₂) в качестве справки. Затем мы показываем цветные точки, чтобы обозначить нашу 441 точку (сетка 21 x 21), вычисленную с помощью приведенного выше выражения в интервале x₁: (- 10,10) и x₂: (- 10,10).

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

Модель машинного обучения

Наша цель - использовать сгенерированные ранее данные для обучения модели машинного обучения, которая сможет предсказывать значение функции f (x₁, x₂) в различных конфигурациях.

В этой статье я буду использовать Kernel Ridge Regression (KRR). Мы будем использовать ядро ​​радиальной базисной функции для KRR, которое зависит от дисперсии ядра Гаусса γ. С помощью KRR нам также необходимо оптимизировать гиперпараметр регуляризации α. Если вы хотите получить более подробную информацию о KRR и его реализации, ознакомьтесь с моим недавним руководством по этой теме.

Здесь мы используем 10-кратную перекрестную проверку, при которой наши данные разделяются на обучающий набор, используемый для оптимизации модели, и набор тестов, используемый для измерения точности модели. В качестве показателя точности мы будем использовать среднеквадратичную ошибку (RMSE), которая представляет собой среднюю ошибку между значениями f (x₁, x₂) в тесте. набор и те, которые предсказаны нашей моделью.

Предыдущий шаг: исследование пространства гиперпараметров

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

Ниже мы покажем, как выглядит эта сетка, и код, используемый для выполнения поиска по сетке гиперпараметров. Рисунок ниже дает нам начальное представление о том, какие значения гиперпараметров возвращают меньшее RMSE.

Настройка гиперпараметров

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

В качестве входных данных требуется функция Scipy Difference_evolution:

  • KRR_function. Это функция, вывод которой (RMSE) будет минимизирован. В качестве входных данных ему необходимы: i) кортеж с гиперпараметрами для оптимизации (α и γ) и ii) переменные X, y, содержащие наши данные.
  • Определите границы возможных значений гиперпараметров.
  • Дополнительные переменные, используемые KRR_function. В нашем случае это будет кортеж, содержащий X и y.
  • Другие подходящие варианты алгоритма дифференциальной эволюции:
  1. Стратегия. В нашем случае достаточно использовать strategy = ’best1bin’ по умолчанию. С помощью этой стратегии значение каждого параметра мутантных векторов получается как вариация значения лучшего вектора для этого параметра пропорционально разнице двух других случайных векторов.
  2. Численность населения. Это выбирает, сколько векторов мы будем рассматривать. Большее число замедлит прогресс, но повысит вероятность обнаружения глобального минимума. Здесь мы используем значение по умолчанию popsize = 15.
  3. Константа мутации. Это значение контролирует, насколько параметры изменяются на стадии мутации. Большее значение означает больший радиус поиска, но замедляет сходимость. Мы используем значение по умолчанию mutation = 0,5.
  4. Константа рекомбинации. Эта константа контролирует, насколько вероятно изменение параметров пробных векторов на стадии рекомбинации. Более высокие значения означают, что мутации с большей вероятностью будут приняты, что может ускорить конвергенцию с риском возникновения нестабильности популяции. Мы используем значение по умолчанию рекомбинация = 0,7.
  5. Допуск. Это значение определяет, когда алгоритм считается сходящимся. Мы будем использовать tol = 0,01, что означает, что алгоритм считается сходимым, когда стандартное отклонение RMSE всех векторов в генеральной совокупности меньше 1% от среднего RMSE.

Этот код возвращает конвергентные значения гиперпараметров, которые приводят к минимизированному среднеквадратичному значению:

Converged hyperparameters: alpha= 0.347294, gamma= 3.342522
Minimum rmse: 1.140462

Мы можем раскомментировать последнюю строку функции KRR_function, чтобы вывести все промежуточные значения:

alpha: 63.925979 . gamma: 19.290688 . rmse: 1.411122
alpha: 59.527726 . gamma:  2.228886 . rmse: 1.421191
alpha: 24.470318 . gamma:  3.838062 . rmse: 1.379171
alpha: 61.944876 . gamma: 15.703799 . rmse: 1.407040
alpha: 68.141245 . gamma:  0.847900 . rmse: 1.431469
                        [...]
alpha:  0.347408 . gamma:  3.342461 . rmse: 1.140462
alpha:  0.347294 . gamma:  3.342522 . rmse: 1.140462
alpha:  0.347294 . gamma:  3.342522 . rmse: 1.140462
alpha:  0.347294 . gamma:  3.342522 . rmse: 1.140462

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

В дополнение ко всем изученным промежуточным значениям, мы также нанесли красным цветом сведенное значение. Таким образом, мы можем наблюдать, как алгоритм исследует различные конфигурации в пределах установленных границ, и в конечном итоге он сошелся в комбинацию (α, γ), которая минимизирует RMSE.

Вывод

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

Помните, что представленный здесь набор данных, коды, изображения и т. Д. Предоставлены в этом репозитории GitHub.

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

Была ли эта статья вам полезна? Сообщите мне, смогли ли вы успешно использовать алгоритм дифференциальной эволюции для оптимизации гиперпараметров вашей модели машинного обучения!