Настройка гиперпараметров — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
м (Реализация)
(не показано 45 промежуточных версий 3 участников)
Строка 1: Строка 1:
== Гиперпараметры ==
+
== Гиперпараметр ==
  
Гиперпараметры - параметры, которые не настраиваются во время обучения модели.  
+
'''Гиперпараметр''' (англ. ''hyperparameter'') — параметр, который не настраивается во время обучения модели. Пример гиперпараметра шаг градиентного спуска, он задается перед обучением. Пример параметров веса градиентного спуска, они изменяются и настраиваются во время обучения.
 
 
Пример гиперпараметра - шаг градиентного спуска, он задается перед обучением. <br>
 
Пример параметров - веса градиентного спуска, они изменяются и настраиваются во время обучения.
 
  
 
Для подбора гиперпараметров необходимо разделить датасет на три части:
 
Для подбора гиперпараметров необходимо разделить датасет на три части:
* training set (тренировочный набор данных, для обучении модели)
+
* тренировочный набор данных (англ. ''training set''), для обучения модели
* validation set (валидационный набор данных, для расчета ошибки и выбора наилучшей модели)
+
* валидационный набор данных (англ. ''validation set''), для расчета ошибки и выбора наилучшей модели
* test set (тестовый набор данных, для тестирования лучшей модели)
+
* тестовый набор данных (англ. ''test set''), для тестирования выбранной модели
  
Зачем нам нужен и валидационный, и тестовый набор? <br>
+
Зачем нам нужен и валидационный, и тестовый набор? Дело в том, что модель может переучиться на валидационном наборе данных. Для выявления переобучения используется тестовый набор данных.
Дело в том, что модель может переучиться на валидационном наборе данных. Для выявления переобучения используется тестовый набор данных.
 
  
Рассмотрим модель KNeighborsClassifier из библиотеки sklearn. Все “параметры” данной модели, с точки зрения машинного обучения, являются гиперпараметрами, так как задаются до начала обучения.
+
Рассмотрим модель <code>KNeighborsClassifier</code> из библиотеки sklearn. Все “параметры” данной модели (loss, penalty, alpha и т.д), с точки зрения машинного обучения, являются гиперпараметрами, так как задаются до начала обучения.
  
[[Файл:KNeighborsClassifier_model.png|center|1000px]]
+
    class sklearn.linear_model.SGDClassifier(loss='hinge', penalty='l2', alpha=0.0001, l1_ratio=0.15, fit_intercept=True, max_iter=1000,
 +
                                        tol=0.001, shuffle=True, verbose=0, epsilon=0.1, n_jobs=None, random_state=None, learning_rate='optimal',
 +
                                        eta0=0.0, power_t=0.5, early_stopping=False, validation_fraction=0.1, n_iter_no_change=5, class_weight=None,
 +
                                        warm_start=False, average=False)
  
== Техники настройки гиперпараметров ==
+
== Поиск по сетке ==
  
=== Grid search ===
+
=== Общая информация ===
  
==== Общая информация ====
+
'''Поиск по сетке''' (англ. ''Grid search'') принимает на вход модель и различные значения гиперпараметров (сетку гиперпараметров). Далее, для каждого возможного сочетания значений гиперпараметров, метод считает ошибку и в конце выбирает сочетание, при котором ошибка минимальна.
  
Grid search принимает на вход модель и различные значения гиперпараметров (сетку гиперпараметров).
+
=== Поиск по сетке в Sklearn: использование ===
Далее, для каждого возможного сочетания значений гиперпараметров, метод считает ошибку и в конце выбирает сочетание, при котором ошибка минимальна.
 
  
==== Sklearn Grid search: использование ====
+
Пример использования <code>GridSearch</code> из библиотеки scikit-learn:
  
Пример использования Grid search из библиотеки scikit-learn:
+
# Создание экземпляра класса  <code>SGDClassifier</code> (из sklearn)
 
 
# Создание экземпляра класса  SGDClassifier (из sklearn)
 
 
# Создание сетки гиперпараметров. В данном случае будем подбирать коэффициент регуляризации, шаг градиентного спуска, количество итераций и параметр скорости обучения.
 
# Создание сетки гиперпараметров. В данном случае будем подбирать коэффициент регуляризации, шаг градиентного спуска, количество итераций и параметр скорости обучения.
 
# Создание экземпляра класса кросс-валидации
 
# Создание экземпляра класса кросс-валидации
# Создание экземпляра GridSearch (из sklearn). Первый параметр - модель, второй - сетка гиперпараметров, третий - функционал ошибки (используемый для контроля качества моделей по технике кросс-валидации), четвертый - кросс-валидация (можно задать количество фолдов, а можно передать экземпляр класса кросс - валидации)
+
# Создание экземпляра <code>GridSearch</code> (из sklearn). Первый параметр модель, второй сетка гиперпараметров, третий функционал ошибки (используемый для контроля качества моделей по технике кросс-валидации), четвертый кросс-валидация (можно задать количество фолдов, а можно передать экземпляр класса кросс - валидации)
 
# Запуск поиска по сетке.
 
# Запуск поиска по сетке.
  
[[Файл:KNeighborsClassifier_exmpl.png|center|1000px]]
+
    classifier = linear_model.SGDClassifier(random_state = 0, tol=1e-3)
 +
 
 +
    parameters_grid = {
 +
        'alpha' : np.linspace(0.00001, 0.0001, 15),
 +
        'learning_rate': ['optimal', 'constant', 'invscaling'],
 +
        'eta0' : np.linspace(0.00001, 0.0001, 15),
 +
        'max_iter' : np.arange(5,10),
 +
    }
 +
 
 +
    cv = model_selection.StratifiedShuffleSplit(n_splits=10, test_size = 0.2)
 +
    grid_cv = model_selection.GridSearchCV(classifier, parameters_grid, scoring = 'accuracy', cv = cv)
 +
    grid_cv.fit(train_data, test_data)
  
==== Sklearn Grid search: важные атрибуты ====
+
    Out:
 +
    GridSearchCV(cv=StratifiedShuffleSplit(n_splits=10, random_state=0, test_size=0.2, train_size=None), error_score=nan,
 +
                estimator=SGDClassifier(alpha=0.0001, average=False, class_weight=None, early_stopping=False,
 +
                                    epsilon=0.1, eta0=0.0, fit_intercept=True, l1_ratio=0.15, learning_rate='optimal',
 +
                                    loss='hinge', max_iter=1000, n_iter_no_change=5, n_jobs=None,
 +
                                    penalty='l2...
 +
                        'eta0': array([1.00000000e-05, 1.64285714e-05, 2.28571429e-05, 2.92857143e-05, 3.57142857e-05, 4.21428571e-05, 4.85714286e-05, 5.50000000e-05,
 +
                                      6.14285714e-05, 6.78571429e-05, 7.42857143e-05, 8.07142857e-05, 8.71428571e-05, 9.35714286e-05, 1.00000000e-04]),
 +
                        'learning_rate': ['optimal', 'constant', 'invscaling'],
 +
                        'max_iter': array([5, 6, 7, 8, 9])},
 +
            pre_dispatch='2*n_jobs', refit=True, return_train_score=False,
 +
            scoring='accuracy', verbose=0)
  
* best_estimator_  - лучшая модель
+
=== Поиск по сетке в Sklearn: важные атрибуты ===
* best_score_  - ошибка, полученная на лучшей модели.
 
* best_params_  - гиперпараметры лучшей модели <br>
 
  
[[Файл:KNeighborsClassifier_bestest.png|center|1000px]] <br>
+
* <code>best_estimator_</code>  — лучшая модель
 +
* <code>best_score_</code>  — ошибка, полученная на лучшей модели.
 +
* <code>best_params_</code> — гиперпараметры лучшей модели <br>
  
* cv_results_  - результаты всех моделей. <br>
+
    print(grid_cv.best_estimator_) <br>
 +
    Out: SGDClassifier(alpha=4.857142857142857e-05, average=False, class_weight=None, early_stopping=False, epsilon=0.1, eta0=1e-05, fit_intercept=True,
 +
                  l1_ratio=0.15, learning_rate='optimal', loss='hinge', max_iter=6, n_iter_no_change=5, n_jobs=None, penalty='l2', power_t=0.5,
 +
                  random_state=0, shuffle=True, tol=0.001, validation_fraction=0.1, verbose=0, warm_start=False)
  
[[Файл:KNeighborsClassifier_results.png|center|1000px]] <br>
+
    print(grid_cv.best_score_) <br>
 +
    Out: 0.9099999999999999
  
* доступ к массиву определенного параметра: <br>
+
    print(grid_cv.best_params_) <br>
 +
    Out: {'alpha': 4.857142857142857e-05, 'eta0': 1e-05, 'learning_rate': 'optimal', 'max_iter': 6}
  
[[Файл:KNeighborsClassifier_param_array.png|center|1000px]] <br>
+
* <code>cv_results_</code>  — результаты всех моделей. <br>
  
==== Реализация Grid search в библеотеках====
+
    print(grid_cv.cv_results_) <br>
* Katib
+
    Out:
* scikit-learn
+
        {'mean_fit_time': array([0.00209482, 0.00120714, 0.00089645, ..., 0.00109975, 0.00100021,
* Tune
+
        0.00099928]),
* Talos
+
        'std_fit_time': array([1.22382854e-03, 6.21233347e-04, 5.32190271e-04, ...,
 +
            3.11922473e-04, 1.27400324e-05, 1.94000071e-06]),
 +
        'mean_score_time': array([2.00700760e-04, 0.00000000e+00, 2.99715996e-04, ...,
 +
            1.99961662e-04, 2.96926498e-04, 9.98973846e-05]),
 +
        'std_score_time': array([0.0004014 , 0.        , 0.00045782, ..., 0.00039992, 0.00045363,
 +
          0.00029969]),
 +
        ...... }
 +
 
 +
    print(grid_cv.cv_results_['param_max_iter'].data) <br>
 +
    Out: array([5, 6, 7, ..., 7, 8, 9], dtype=object)
  
 +
=== Реализация поиска по сетке в библиотеках ===
 +
* scikit-learn<ref>[https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html scikit-learn]</ref>
 +
* Katib<ref>[https://github.com/kubeflow/katib Katib]</ref>
 +
* Tune<ref>[https://tidymodels.github.io/tune/articles/grid.html Tune]</ref>
 +
* Talos<ref>[https://autonomio.github.io/docs_talos/#grid-search Talos]</ref>
  
=== Random grid search ===
+
== Случайный поиск по сетке ==
  
==== Основная информация ====
+
=== Основная информация ===
  
Вместо полного перебора, Random grid search работает с некоторыми, случайным образом выбранными, комбинациями. На основе полученных результатов, происходит сужение области поиска.  
+
'''Случайный поиск по сетке''' (англ. ''Random Grid Search'') вместо полного перебора работает с некоторыми, случайным образом выбранными, комбинациями. На основе полученных результатов, происходит сужение области поиска.  
  
Когда random grid search будет гораздо полезнее, чем grid search? <br>
+
Когда случайный поиск по сетке будет гораздо полезнее, чем просто поиск по сетке? В ситуации, когда гиперпараметров много, но сильно влияющих на конечную производительность алгоритма мало.
В ситуации, когда гиперпараметров много, но сильно влияющих на конечную производительность алгоритма - мало.
 
  
==== Реализация Random grid ====
+
=== Реализация случайного поиска по сетке ===
  
* hyperopt
+
* Ray<ref>[https://ray.readthedocs.io/en/latest/tune-searchalg.html#variant-generation-grid-search-random-search Ray]</ref>
 
* Katib
 
* Katib
 
* scikit-learn
 
* scikit-learn
 
* Tune
 
* Tune
 
* Talos
 
* Talos
 +
* Hyperopt<ref>[https://hyperopt.github.io/hyperopt/#algorithms Hyperopt]</ref>
  
 +
== Последовательная оптимизация по модели  ==
  
=== SMBO  ===
+
=== Основная информация ===
 
 
==== Основная информация ====
 
 
 
SMBO (Sequential Model-Based Optimization) - методы, основанные на байесовской оптимизации
 
  
Когда используют SMBO? <br>
+
'''Последовательная оптимизация по модели''' (англ. ''Sequential Model-Based Optimization, SMBO'') используются когда оптимизация целевой функции будет стоить очень "дорого". Главная идея SMBO замена целевой функции "суррогатной" функцией.
Когда оптимизация целевой функции будет стоить очень "дорого". Главная идея SMBO - замена целевой функции "суррогатной" функцией.
 
 
   
 
   
 
На каждом шаге работы SMBO:
 
На каждом шаге работы SMBO:
Строка 107: Строка 140:
 
Методы SMBO отличаются между собой вероятностными моделями и функциями выбора: <br>
 
Методы SMBO отличаются между собой вероятностными моделями и функциями выбора: <br>
 
Популярные вероятностные модели (суррогатные функции):
 
Популярные вероятностные модели (суррогатные функции):
* Gaussian Processes
+
* Гауссовские процессы
* Tree Parzen Estimators (TPE)
+
* Древовидный парзеновский оценщик
* Random Forest Regressions
+
* Регрессия случайного леса
  
==== Реализация ====
+
=== Древовидный парзеновский оценщик ===
* Random Forest Regressions: SMAC
 
* Tree Parzen Estimators: Hyperopt
 
* Gaussian Processes: Spearmint, Scikit-optimize
 
  
=== TPE ===
+
==== Основная информация ====
 +
Как было написано выше, методы SMBO отличаются тем, как они строят вероятностную модель <math> {p(y|x)} </math>. В случае '''древовидного парзеновского оценщика''' (англ. ''Tree-structured Parzen Estimator, TPE''), используется следующая функция:
  
==== Основная информация ====
+
<math> p(y) = \frac{p(x|y) * p(y)}{p(x)} </math>
TPE - Tree-structured Parzen Estimator (Древовидная структура Парзена)
 
  
Как было написано выше, методы SMBO отличаются тем, как они строят вероятностную модель <math> {p(y|x)} </math>. В случае TPE, используется следующая функция:
+
<math> {p(x|y)} </math> — распределение гиперпараметров, <math> y </math> —  значение целевой функции,  <math> y* </math> — пороговое начение
  
<math> p(y) = \frac{p(x|y) * p(y)}{p(x)} </math>
+
<math> p(x|y) = \begin{cases}
 +
  l(x),  & \mbox{if }  y < y* \\
 +
  g(x), & \mbox{if } y \ge y*
 +
\end{cases}
 +
</math>
  
<math> {p(x|y)} </math> - распределение гиперпараметров.
+
В TPE задается два различных распределения гиперпараметров: первое при значениях целевой функции меньших, чем пороговое значение. Второе - при значениях целевой функции больших, чем пороговое значение.
  
==== Реализация ====
+
==== Алгоритм ====
  
* Hyperopt
+
# На вход подается список пар (parameters, loss)
 +
# По заданному порогу, происходит разбиение списка на 2 части
 +
# Для каждого списка строится распределение
 +
# Возвращается значение: <math> argmin_{param} \frac{g(param)}{l(param)} </math>
  
=== SMAC ===
+
=== Последовательная конфигурация алгоритма на основе модели ===
  
 
==== Основная информация ====
 
==== Основная информация ====
  
SMAC использует Random Forest regression и расширяет подходы SMBO:
+
'''Последовательная конфигурация алгоритма на основе модели''' (англ. ''Sequential Model-based Algorithm Configuration, SMAC'') расширяет подходы SMBO:
  
 
* Использует дискретные и условные пространства параметров.
 
* Использует дискретные и условные пространства параметров.
Строка 141: Строка 178:
 
* Выделяет бюджет на общее время, доступное для настройки алгоритма, а не на количество оценок функций.
 
* Выделяет бюджет на общее время, доступное для настройки алгоритма, а не на количество оценок функций.
  
==== Реализация ====
+
Кроме того, SMAC использует переданную ему модель для формирования списка перспективных конфигураций (сочетаний) параметров. Чтобы оценить перспективность конфигурация <math> \theta </math>, SMAC строит распределение результатов модели для  <math> \theta </math>.
* AutoML
+
С помощью этого распределения, а также информации, о текущей лучшей конфигурации, SMAC вычисляет ожидаемое положительное улучшение [https://www.cs.ubc.ca/~hutter/papers/10-TR-SMAC.pdf <math> EI(\theta) </math>].
 +
После нахождения <math> EI(\theta) </math> необходимо найти конфигурацию с наибольшим значением <math> EI(\theta) </math>. Эта задача приводит к проблеме максимизация значения на всем пространстве конфигураций.
 +
Другие методы SMBO максимизируют значения а случайной выборке из пространства конфигураций, что достаточно плохо работает в случае высокомерного пространства.
 +
SMAC применяет немного другой подход: выполняется несколько локальных и поисков и среди них выбираются все конфигурации с максимальным <math> EI(\theta) </math>. И уже среди них производится новый поиск и выбирается лучшая конфигурация.
 +
 
 +
=== Реализация ===
 +
* SMBO: [https://www.automl.org/automated-algorithm-design/algorithm-configuration/smac/ SMAC]
 +
* TPE: [https://hyperopt.github.io/hyperopt/#algorithms Hyperopt]
 +
* Гауссовские процессы: [https://devhub.io/repos/automl-spearmint Spearmint], [https://scikit-optimize.github.io/stable/modules/classes.html#module-skopt.optimizer Scikit-optimize]
 +
 
 +
==См. также==
 +
*[[Автоматическое машинное обучение]]
 +
*[[Бустинг, AdaBoost]]
 +
*[[Кросс-валидация]]
 +
*[[Поиск архитектуры нейронной сети]]
 +
== Примечания ==
 +
<references/>
 +
== Источники ==
 +
 +
 
 +
* [https://papers.nips.cc/paper/4443-algorithms-for-hyper-parameter-optimization.pdf Algorithms for Hyper-Parameter Optimization]
 +
* [https://www.cs.ubc.ca/~hutter/papers/10-TR-SMAC.pdf Sequential Model-Based Optimization for General Algorithm Configuration]
 +
* [https://www.youtube.com/watch?v=u6MG_UTwiIQ Bayesian optimization]
 +
* [https://www.youtube.com/watch?v=PgJMLpIfIc8 Гауссовские процессы и байесовская оптимизация]
 +
* [https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html GridSearchCV sklearn]
 +
 
 +
[[Категория: Машинное обучение]] [[Категория: Автоматическое машинное обучение]]

Версия 00:17, 11 января 2021

Гиперпараметр

Гиперпараметр (англ. hyperparameter) — параметр, который не настраивается во время обучения модели. Пример гиперпараметра — шаг градиентного спуска, он задается перед обучением. Пример параметров — веса градиентного спуска, они изменяются и настраиваются во время обучения.

Для подбора гиперпараметров необходимо разделить датасет на три части:

  • тренировочный набор данных (англ. training set), для обучения модели
  • валидационный набор данных (англ. validation set), для расчета ошибки и выбора наилучшей модели
  • тестовый набор данных (англ. test set), для тестирования выбранной модели

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

Рассмотрим модель KNeighborsClassifier из библиотеки sklearn. Все “параметры” данной модели (loss, penalty, alpha и т.д), с точки зрения машинного обучения, являются гиперпараметрами, так как задаются до начала обучения.

   class sklearn.linear_model.SGDClassifier(loss='hinge', penalty='l2', alpha=0.0001, l1_ratio=0.15, fit_intercept=True, max_iter=1000, 
                                        tol=0.001, shuffle=True, verbose=0, epsilon=0.1, n_jobs=None, random_state=None, learning_rate='optimal', 
                                        eta0=0.0, power_t=0.5, early_stopping=False, validation_fraction=0.1, n_iter_no_change=5, class_weight=None, 
                                        warm_start=False, average=False)

Поиск по сетке

Общая информация

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

Поиск по сетке в Sklearn: использование

Пример использования GridSearch из библиотеки scikit-learn:

  1. Создание экземпляра класса SGDClassifier (из sklearn)
  2. Создание сетки гиперпараметров. В данном случае будем подбирать коэффициент регуляризации, шаг градиентного спуска, количество итераций и параметр скорости обучения.
  3. Создание экземпляра класса кросс-валидации
  4. Создание экземпляра GridSearch (из sklearn). Первый параметр — модель, второй — сетка гиперпараметров, третий — функционал ошибки (используемый для контроля качества моделей по технике кросс-валидации), четвертый — кросс-валидация (можно задать количество фолдов, а можно передать экземпляр класса кросс - валидации)
  5. Запуск поиска по сетке.
   classifier = linear_model.SGDClassifier(random_state = 0, tol=1e-3)
   parameters_grid = {
       'alpha' : np.linspace(0.00001, 0.0001, 15),
       'learning_rate': ['optimal', 'constant', 'invscaling'],
       'eta0' : np.linspace(0.00001, 0.0001, 15),
       'max_iter' : np.arange(5,10),
   }
   cv = model_selection.StratifiedShuffleSplit(n_splits=10, test_size = 0.2)
   grid_cv = model_selection.GridSearchCV(classifier, parameters_grid, scoring = 'accuracy', cv = cv)
   grid_cv.fit(train_data, test_data)
   Out:
   GridSearchCV(cv=StratifiedShuffleSplit(n_splits=10, random_state=0, test_size=0.2, train_size=None), error_score=nan,
                estimator=SGDClassifier(alpha=0.0001, average=False, class_weight=None, early_stopping=False,
                                    epsilon=0.1, eta0=0.0, fit_intercept=True, l1_ratio=0.15, learning_rate='optimal',
                                    loss='hinge', max_iter=1000, n_iter_no_change=5, n_jobs=None, 
                                    penalty='l2...
                        'eta0': array([1.00000000e-05, 1.64285714e-05, 2.28571429e-05, 2.92857143e-05, 3.57142857e-05, 4.21428571e-05, 4.85714286e-05, 5.50000000e-05,
                                      6.14285714e-05, 6.78571429e-05, 7.42857143e-05, 8.07142857e-05, 8.71428571e-05, 9.35714286e-05, 1.00000000e-04]),
                        'learning_rate': ['optimal', 'constant', 'invscaling'],
                        'max_iter': array([5, 6, 7, 8, 9])},
            pre_dispatch='2*n_jobs', refit=True, return_train_score=False,
            scoring='accuracy', verbose=0)

Поиск по сетке в Sklearn: важные атрибуты

  • best_estimator_ — лучшая модель
  • best_score_ — ошибка, полученная на лучшей модели.
  • best_params_ — гиперпараметры лучшей модели
   print(grid_cv.best_estimator_) 
Out: SGDClassifier(alpha=4.857142857142857e-05, average=False, class_weight=None, early_stopping=False, epsilon=0.1, eta0=1e-05, fit_intercept=True, l1_ratio=0.15, learning_rate='optimal', loss='hinge', max_iter=6, n_iter_no_change=5, n_jobs=None, penalty='l2', power_t=0.5, random_state=0, shuffle=True, tol=0.001, validation_fraction=0.1, verbose=0, warm_start=False)
   print(grid_cv.best_score_) 
Out: 0.9099999999999999
   print(grid_cv.best_params_) 
Out: {'alpha': 4.857142857142857e-05, 'eta0': 1e-05, 'learning_rate': 'optimal', 'max_iter': 6}
  • cv_results_ — результаты всех моделей.
   print(grid_cv.cv_results_) 
Out: {'mean_fit_time': array([0.00209482, 0.00120714, 0.00089645, ..., 0.00109975, 0.00100021, 0.00099928]), 'std_fit_time': array([1.22382854e-03, 6.21233347e-04, 5.32190271e-04, ..., 3.11922473e-04, 1.27400324e-05, 1.94000071e-06]), 'mean_score_time': array([2.00700760e-04, 0.00000000e+00, 2.99715996e-04, ..., 1.99961662e-04, 2.96926498e-04, 9.98973846e-05]), 'std_score_time': array([0.0004014 , 0. , 0.00045782, ..., 0.00039992, 0.00045363, 0.00029969]), ...... }
    print(grid_cv.cv_results_['param_max_iter'].data) 
Out: array([5, 6, 7, ..., 7, 8, 9], dtype=object)

Реализация поиска по сетке в библиотеках

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

Основная информация

Случайный поиск по сетке (англ. Random Grid Search) вместо полного перебора работает с некоторыми, случайным образом выбранными, комбинациями. На основе полученных результатов, происходит сужение области поиска.

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

Реализация случайного поиска по сетке

  • Ray[5]
  • Katib
  • scikit-learn
  • Tune
  • Talos
  • Hyperopt[6]

Последовательная оптимизация по модели

Основная информация

Последовательная оптимизация по модели (англ. Sequential Model-Based Optimization, SMBO) используются когда оптимизация целевой функции будет стоить очень "дорого". Главная идея SMBO — замена целевой функции "суррогатной" функцией.

На каждом шаге работы SMBO:

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


Существует четыре ключевые аспекта SMBO:

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


Методы SMBO отличаются между собой вероятностными моделями и функциями выбора:
Популярные вероятностные модели (суррогатные функции):

  • Гауссовские процессы
  • Древовидный парзеновский оценщик
  • Регрессия случайного леса

Древовидный парзеновский оценщик

Основная информация

Как было написано выше, методы SMBO отличаются тем, как они строят вероятностную модель [math] {p(y|x)} [/math]. В случае древовидного парзеновского оценщика (англ. Tree-structured Parzen Estimator, TPE), используется следующая функция:

[math] p(y) = \frac{p(x|y) * p(y)}{p(x)} [/math]

[math] {p(x|y)} [/math] — распределение гиперпараметров, [math] y [/math] — значение целевой функции, [math] y* [/math] — пороговое начение

[math] p(x|y) = \begin{cases} l(x), & \mbox{if } y \lt y* \\ g(x), & \mbox{if } y \ge y* \end{cases} [/math]

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

Алгоритм

  1. На вход подается список пар (parameters, loss)
  2. По заданному порогу, происходит разбиение списка на 2 части
  3. Для каждого списка строится распределение
  4. Возвращается значение: [math] argmin_{param} \frac{g(param)}{l(param)} [/math]

Последовательная конфигурация алгоритма на основе модели

Основная информация

Последовательная конфигурация алгоритма на основе модели (англ. Sequential Model-based Algorithm Configuration, SMAC) расширяет подходы SMBO:

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

Кроме того, SMAC использует переданную ему модель для формирования списка перспективных конфигураций (сочетаний) параметров. Чтобы оценить перспективность конфигурация [math] \theta [/math], SMAC строит распределение результатов модели для [math] \theta [/math]. С помощью этого распределения, а также информации, о текущей лучшей конфигурации, SMAC вычисляет ожидаемое положительное улучшение [math] EI(\theta) [/math]. После нахождения [math] EI(\theta) [/math] необходимо найти конфигурацию с наибольшим значением [math] EI(\theta) [/math]. Эта задача приводит к проблеме максимизация значения на всем пространстве конфигураций. Другие методы SMBO максимизируют значения а случайной выборке из пространства конфигураций, что достаточно плохо работает в случае высокомерного пространства. SMAC применяет немного другой подход: выполняется несколько локальных и поисков и среди них выбираются все конфигурации с максимальным [math] EI(\theta) [/math]. И уже среди них производится новый поиск и выбирается лучшая конфигурация.

Реализация

См. также

Примечания

Источники