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

Материал из Викиконспекты
Перейти к: навигация, поиск
(Основная информация)
м (rollbackEdits.php mass rollback)
 
(не показано 15 промежуточных версий 4 участников)
Строка 1: Строка 1:
== Гиперпараметры ==
+
== Гиперпараметр ==
  
Гиперпараметры параметры, которые не настраиваются во время обучения модели. Пример гиперпараметра — шаг градиентного спуска, он задается перед обучением. Пример параметров — веса градиентного спуска, они изменяются и настраиваются во время обучения.
+
'''Гиперпараметр''' (англ. ''hyperparameter'') параметр, который не настраивается во время обучения модели. Пример гиперпараметра — шаг градиентного спуска, он задается перед обучением. Пример параметров — веса градиентного спуска, они изменяются и настраиваются во время обучения.
  
 
Для подбора гиперпараметров необходимо разделить датасет на три части:
 
Для подбора гиперпараметров необходимо разделить датасет на три части:
* training set (тренировочный набор данных, для обучении модели)
+
* тренировочный набор данных (англ. ''training set''), для обучения модели
* validation set (валидационный набор данных, для расчета ошибки и выбора наилучшей модели)
+
* валидационный набор данных (англ. ''validation set''), для расчета ошибки и выбора наилучшей модели
* test set (тестовый набор данных, для тестирования лучшей модели)
+
* тестовый набор данных (англ. ''test set''), для тестирования выбранной модели
  
 
Зачем нам нужен и валидационный, и тестовый набор? Дело в том, что модель может переучиться на валидационном наборе данных. Для выявления переобучения используется тестовый набор данных.
 
Зачем нам нужен и валидационный, и тестовый набор? Дело в том, что модель может переучиться на валидационном наборе данных. Для выявления переобучения используется тестовый набор данных.
Строка 17: Строка 17:
 
                                         warm_start=False, average=False)
 
                                         warm_start=False, average=False)
  
== Grid search ==
+
== Поиск по сетке ==
  
 
=== Общая информация ===
 
=== Общая информация ===
  
Grid search принимает на вход модель и различные значения гиперпараметров (сетку гиперпараметров). Далее, для каждого возможного сочетания значений гиперпараметров, метод считает ошибку и в конце выбирает сочетание, при котором ошибка минимальна.
+
'''Поиск по сетке''' (англ. ''Grid search'') принимает на вход модель и различные значения гиперпараметров (сетку гиперпараметров). Далее, для каждого возможного сочетания значений гиперпараметров, метод считает ошибку и в конце выбирает сочетание, при котором ошибка минимальна.
  
=== Sklearn Grid search: использование ===
+
=== Поиск по сетке в Sklearn: использование ===
  
 
Пример использования <code>GridSearch</code> из библиотеки scikit-learn:
 
Пример использования <code>GridSearch</code> из библиотеки scikit-learn:
Строка 59: Строка 59:
 
             scoring='accuracy', verbose=0)
 
             scoring='accuracy', verbose=0)
  
=== Sklearn Grid search: важные атрибуты ===
+
=== Поиск по сетке в Sklearn: важные атрибуты ===
  
 
* <code>best_estimator_</code>  — лучшая модель
 
* <code>best_estimator_</code>  — лучшая модель
Строка 93: Строка 93:
 
     Out: array([5, 6, 7, ..., 7, 8, 9], dtype=object)
 
     Out: array([5, 6, 7, ..., 7, 8, 9], dtype=object)
  
=== Реализация Grid search в библеотеках ===
+
=== Реализация поиска по сетке в библиотеках ===
* [https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html scikit-learn]
+
* scikit-learn<ref>[https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html scikit-learn]</ref>
* [https://github.com/kubeflow/katib Katib]
+
* Katib<ref>[https://github.com/kubeflow/katib Katib]</ref>
* [https://tidymodels.github.io/tune/articles/grid.html Tune]
+
* Tune<ref>[https://tidymodels.github.io/tune/articles/grid.html Tune]</ref>
* [https://autonomio.github.io/docs_talos/#grid-search Talos]
+
* 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? В ситуации, когда гиперпараметров много, но сильно влияющих на конечную производительность алгоритма — мало.
+
Когда случайный поиск по сетке будет гораздо полезнее, чем просто поиск по сетке? В ситуации, когда гиперпараметров много, но сильно влияющих на конечную производительность алгоритма — мало.
  
=== Реализация Random grid ===
+
=== Реализация случайного поиска по сетке ===
  
* [https://ray.readthedocs.io/en/latest/tune-searchalg.html#variant-generation-grid-search-random-search Ray]
+
* Ray<ref>[https://ray.readthedocs.io/en/latest/tune-searchalg.html#variant-generation-grid-search-random-search Ray]</ref>
* [https://github.com/kubeflow/katib Katib]
+
* Katib
* [https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.RandomizedSearchCV.html scikit-learn]
+
* scikit-learn
* [https://ray.readthedocs.io/en/latest/tune-searchalg.html#variant-generation-grid-search-random-search Tune]
+
* Tune
* [https://autonomio.github.io/docs_talos/#models Talos]
+
* Talos
* [https://hyperopt.github.io/hyperopt/#algorithms Hyperopt]
+
* Hyperopt<ref>[https://hyperopt.github.io/hyperopt/#algorithms Hyperopt]</ref>
  
== SMBO ==
+
== Последовательная оптимизация по модели ==
  
 
=== Основная информация ===
 
=== Основная информация ===
  
SMBO (Sequential Model-Based Optimization) — методы, основанные на байесовской оптимизации
+
'''Последовательная оптимизация по модели''' (англ. ''Sequential Model-Based Optimization, SMBO'') используются когда оптимизация целевой функции будет стоить очень "дорого". Главная идея SMBO — замена целевой функции "суррогатной" функцией.
 
 
Когда используют SMBO? Когда оптимизация целевой функции будет стоить очень "дорого". Главная идея SMBO — замена целевой функции "суррогатной" функцией.
 
 
   
 
   
 
На каждом шаге работы SMBO:
 
На каждом шаге работы SMBO:
Строка 142: Строка 140:
 
Методы SMBO отличаются между собой вероятностными моделями и функциями выбора: <br>
 
Методы SMBO отличаются между собой вероятностными моделями и функциями выбора: <br>
 
Популярные вероятностные модели (суррогатные функции):
 
Популярные вероятностные модели (суррогатные функции):
* Gaussian Processes
+
* Гауссовские процессы
* Tree Parzen Estimators (TPE)
+
* Древовидный парзеновский оценщик
* Random Forest Regressions
+
* Регрессия случайного леса
  
=== TPE ===
+
=== Древовидный парзеновский оценщик ===
  
 
==== Основная информация ====
 
==== Основная информация ====
TPE — Tree-structured Parzen Estimator (Древовидная структура Парзена)
+
Как было написано выше, методы SMBO отличаются тем, как они строят вероятностную модель <math> {p(y|x)} </math>. В случае '''древовидного парзеновского оценщика''' (англ. ''Tree-structured Parzen Estimator, TPE''), используется следующая функция:
 
 
Как было написано выше, методы SMBO отличаются тем, как они строят вероятностную модель <math> {p(y|x)} </math>. В случае TPE, используется следующая функция:
 
  
 
<math> p(y) = \frac{p(x|y) * p(y)}{p(x)} </math>
 
<math> p(y) = \frac{p(x|y) * p(y)}{p(x)} </math>
Строка 172: Строка 168:
 
# Возвращается значение: <math> argmin_{param} \frac{g(param)}{l(param)} </math>
 
# Возвращается значение: <math> argmin_{param} \frac{g(param)}{l(param)} </math>
  
=== SMAC ===
+
=== Последовательная конфигурация алгоритма на основе модели ===
  
 
==== Основная информация ====
 
==== Основная информация ====
  
SMAC использует Random Forest regression и расширяет подходы SMBO:
+
'''Последовательная конфигурация алгоритма на основе модели''' (англ. ''Sequential Model-based Algorithm Configuration, SMAC'') расширяет подходы SMBO:
  
 
* Использует дискретные и условные пространства параметров.
 
* Использует дискретные и условные пространства параметров.
Строка 189: Строка 185:
  
 
=== Реализация ===
 
=== Реализация ===
* Random Forest Regressions: [https://www.automl.org/automated-algorithm-design/algorithm-configuration/smac/ SMAC]
+
* SMBO: [https://www.automl.org/automated-algorithm-design/algorithm-configuration/smac/ SMAC]
* Tree Parzen Estimators: [https://hyperopt.github.io/hyperopt/#algorithms Hyperopt]
+
* TPE: [https://hyperopt.github.io/hyperopt/#algorithms Hyperopt]
* Gaussian Processes: [https://devhub.io/repos/automl-spearmint Spearmint], [https://scikit-optimize.github.io/stable/modules/classes.html#module-skopt.optimizer Scikit-optimize]
+
* Гауссовские процессы: [https://devhub.io/repos/automl-spearmint Spearmint], [https://scikit-optimize.github.io/stable/modules/classes.html#module-skopt.optimizer Scikit-optimize]
  
 +
==См. также==
 +
*[[Автоматическое машинное обучение]]
 +
*[[Бустинг, AdaBoost]]
 +
*[[Кросс-валидация]]
 +
*[[Поиск архитектуры нейронной сети]]
 +
== Примечания ==
 +
<references/>
 
== Источники ==
 
== Источники ==
 
   
 
   
Строка 201: Строка 204:
 
* [https://www.youtube.com/watch?v=PgJMLpIfIc8 Гауссовские процессы и байесовская оптимизация]
 
* [https://www.youtube.com/watch?v=PgJMLpIfIc8 Гауссовские процессы и байесовская оптимизация]
 
* [https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html GridSearchCV sklearn]
 
* [https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html GridSearchCV sklearn]
 +
 +
[[Категория: Машинное обучение]] [[Категория: Автоматическое машинное обучение]]

Текущая версия на 19:24, 4 сентября 2022

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

Гиперпараметр (англ. 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]. И уже среди них производится новый поиск и выбирается лучшая конфигурация.

Реализация

См. также

Примечания

Источники