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

Представьте, что у нас есть только один гиперпараметр, и мы хотим его оптимизировать. Нам пришлось бы выполнить программу, сценарий, алгоритм или что-то еще, что мы настраиваем, N раз, что является числом возможных значений параметра. С двумя параметрами нам пришлось бы выполнять N раз для каждого времени второго параметра, таким образом, N**2. И так далее.

Существует множество возможностей для настройки гиперпараметров. В этом случае я объясню подход из эволюционных алгоритмов. В частности, оценка алгоритмов распределения (EDA). Аналогично генетическим алгоритмам. Суть этого алгоритма заключается в том, что алгоритм итеративно предлагает несколько решений, из которых выбираются лучшие, соответствующие функции стоимости, которую мы хотим оптимизировать. Из этой выборки мы генерируем новые решения на основе построенного из них нормального распределения. На рис. 1 показана блок-схема. В каждой итерации отбирается поколение с группой решений. Это называется поколением, состоящим из нескольких особей. При отборе лучших особей отбирается процент этого поколения (параметр АЛЬФА)

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

Давайте рассмотрим простой пример, решенный с помощью пакета Python EDaspy. Чтобы установить пакет, просто выполните:

pip install EDAspy

У нас есть функция стоимости следующим образом. Три гиперпараметра, которые мы хотим оптимизировать, — это словарь[‘param1’], словарь[‘param2’] и словарь[‘param3’]. Также функция стоимости включает в себя некоторые веса. Алгоритм должен найти оптимальные значения гиперпараметров, чтобы минимизировать функцию стоимости.

weights = [20,10,-4]
def cost_function(dictionary):
    function = weights[0]*dictionary['param1']**2 + weights[1]*(np.pi/dictionary['param2']) - 2 - weights[2]*dictionary['param3']
    if function < 0:
        return 9999999
    return function

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

from EDAspy.optimization.univariate import EDA_continuous as EDAc
import pandas as pd
import numpy as np

wheights = [20,10,-4]

def cost_function(dictionary):
    function = wheights[0]*dictionary['param1']**2 + wheights[1]*(np.pi/dictionary['param2']) - 2 - wheights[2]*dictionary['param3']
    if function < 0:
        return 9999999
    return function

vector = pd.DataFrame(columns=['param1', 'param2', 'param3'])
vector['data'] = ['mu', 'std', 'min', 'max']
vector = vector.set_index('data')
vector.loc['mu'] = [5, 8, 1]
vector.loc['std'] = 20
vector.loc['min'] = 0
vector.loc['max'] = 100

EDA = EDAc(SIZE_GEN=40, MAX_ITER=200, DEAD_ITER=20, ALPHA=0.7, vector=vector, aim='minimize', cost_function=cost_function)
bestcost, params, history = EDA.run()
print(bestcost)
print(params)
print(history)

В этом случае мы используем непрерывный одномерный EDA. При настройке нет зависимостей между гиперпараметрами. Все они настраиваются независимо. В качестве параметров алгоритма мы устанавливаем SIZE_GEN как количество людей (количество решений каждой итерации); MAX_ITER как количество максимальных итераций; DEAD_ITER как количество итераций без наилучшего глобального улучшения стоимости, после которых алгоритм остановится; АЛЬФА как процент поколения, из которого мы выбираем лучших людей для обновления нормального распределения, из какой выборки; и функция стоимости. Обратите внимание, что ALPHA и начальный вектор также могут быть настроены по желанию. Высокая альфа будет выбирать широкий спектр решений и будет иметь тенденцию к медленной сходимости (если сходиться). Низкие значения ALPHA могут означать стек в локальном оптимуме. Советую попробовать разные значения АЛЬФА в разных исполнениях.

Алгоритм вернет наилучшую стоимость, параметры и историю, если потребуется. График показан на рисунке 2.

В будущих историях я расскажу о FS с EDA и других подходах с этим удивительным пакетом оптимизации!