Настройка гиперпараметров — различия между версиями
AnneKsatn (обсуждение | вклад) м (→Sklearn Grid search: важные атрибуты) |
м (rollbackEdits.php mass rollback) |
||
(не показано 37 промежуточных версий 4 участников) | |||
Строка 1: | Строка 1: | ||
− | == | + | == Гиперпараметр == |
− | + | '''Гиперпараметр''' (англ. ''hyperparameter'') — параметр, который не настраивается во время обучения модели. Пример гиперпараметра — шаг градиентного спуска, он задается перед обучением. Пример параметров — веса градиентного спуска, они изменяются и настраиваются во время обучения. | |
Для подбора гиперпараметров необходимо разделить датасет на три части: | Для подбора гиперпараметров необходимо разделить датасет на три части: | ||
− | * | + | * тренировочный набор данных (англ. ''training set''), для обучения модели |
− | * | + | * валидационный набор данных (англ. ''validation set''), для расчета ошибки и выбора наилучшей модели |
− | * | + | * тестовый набор данных (англ. ''test set''), для тестирования выбранной модели |
Зачем нам нужен и валидационный, и тестовый набор? Дело в том, что модель может переучиться на валидационном наборе данных. Для выявления переобучения используется тестовый набор данных. | Зачем нам нужен и валидационный, и тестовый набор? Дело в том, что модель может переучиться на валидационном наборе данных. Для выявления переобучения используется тестовый набор данных. | ||
Строка 17: | Строка 17: | ||
warm_start=False, average=False) | warm_start=False, average=False) | ||
− | == | + | == Поиск по сетке == |
=== Общая информация === | === Общая информация === | ||
− | Grid search принимает на вход модель и различные значения гиперпараметров (сетку гиперпараметров). Далее, для каждого возможного сочетания значений гиперпараметров, метод считает ошибку и в конце выбирает сочетание, при котором ошибка минимальна. | + | '''Поиск по сетке''' (англ. ''Grid search'') принимает на вход модель и различные значения гиперпараметров (сетку гиперпараметров). Далее, для каждого возможного сочетания значений гиперпараметров, метод считает ошибку и в конце выбирает сочетание, при котором ошибка минимальна. |
− | === Sklearn | + | === Поиск по сетке в Sklearn: использование === |
Пример использования <code>GridSearch</code> из библиотеки scikit-learn: | Пример использования <code>GridSearch</code> из библиотеки scikit-learn: | ||
Строка 47: | Строка 47: | ||
Out: | Out: | ||
− | GridSearchCV(cv=StratifiedShuffleSplit(n_splits=10, random_state=0, test_size=0.2, train_size=None), | + | 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, | |
− | estimator=SGDClassifier(alpha=0.0001, average=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, | |
− | epsilon=0.1, eta0=0.0, fit_intercept=True, | ||
− | |||
− | loss='hinge', max_iter=1000, | ||
− | |||
penalty='l2... | penalty='l2... | ||
− | 'eta0': array([1.00000000e-05, 1.64285714e-05, 2.28571429e-05, 2.92857143e-05, | + | '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'], | 'learning_rate': ['optimal', 'constant', 'invscaling'], | ||
'max_iter': array([5, 6, 7, 8, 9])}, | 'max_iter': array([5, 6, 7, 8, 9])}, | ||
Строка 65: | Строка 59: | ||
scoring='accuracy', verbose=0) | scoring='accuracy', verbose=0) | ||
− | === Sklearn | + | === Поиск по сетке в Sklearn: важные атрибуты === |
* <code>best_estimator_</code> — лучшая модель | * <code>best_estimator_</code> — лучшая модель | ||
Строка 99: | Строка 93: | ||
Out: array([5, 6, 7, ..., 7, 8, 9], dtype=object) | 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 | + | * Tune<ref>[https://tidymodels.github.io/tune/articles/grid.html Tune]</ref> |
− | * Talos | + | * Talos<ref>[https://autonomio.github.io/docs_talos/#grid-search Talos]</ref> |
− | |||
− | == | + | == Случайный поиск по сетке == |
=== Основная информация === | === Основная информация === | ||
− | + | '''Случайный поиск по сетке''' (англ. ''Random Grid Search'') вместо полного перебора работает с некоторыми, случайным образом выбранными, комбинациями. На основе полученных результатов, происходит сужение области поиска. | |
− | Когда | + | Когда случайный поиск по сетке будет гораздо полезнее, чем просто поиск по сетке? В ситуации, когда гиперпараметров много, но сильно влияющих на конечную производительность алгоритма — мало. |
− | === Реализация | + | === Реализация случайного поиска по сетке === |
− | * | + | * 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> | ||
− | + | == Последовательная оптимизация по модели == | |
− | == | ||
=== Основная информация === | === Основная информация === | ||
− | + | '''Последовательная оптимизация по модели''' (англ. ''Sequential Model-Based Optimization, SMBO'') используются когда оптимизация целевой функции будет стоить очень "дорого". Главная идея SMBO — замена целевой функции "суррогатной" функцией. | |
− | |||
− | |||
На каждом шаге работы SMBO: | На каждом шаге работы SMBO: | ||
Строка 149: | Строка 140: | ||
Методы SMBO отличаются между собой вероятностными моделями и функциями выбора: <br> | Методы SMBO отличаются между собой вероятностными моделями и функциями выбора: <br> | ||
Популярные вероятностные модели (суррогатные функции): | Популярные вероятностные модели (суррогатные функции): | ||
− | * | + | * Гауссовские процессы |
− | * | + | * Древовидный парзеновский оценщик |
− | * | + | * Регрессия случайного леса |
− | === | + | === Древовидный парзеновский оценщик === |
− | |||
− | |||
− | |||
− | == | + | ==== Основная информация ==== |
+ | Как было написано выше, методы 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(y) = \ | + | <math> p(x|y) = \begin{cases} |
+ | l(x), & \mbox{if } y < y* \\ | ||
+ | g(x), & \mbox{if } y \ge y* | ||
+ | \end{cases} | ||
+ | </math> | ||
− | + | В TPE задается два различных распределения гиперпараметров: первое при значениях целевой функции меньших, чем пороговое значение. Второе - при значениях целевой функции больших, чем пороговое значение. | |
− | === | + | ==== Алгоритм ==== |
− | + | # На вход подается список пар (parameters, loss) | |
+ | # По заданному порогу, происходит разбиение списка на 2 части | ||
+ | # Для каждого списка строится распределение | ||
+ | # Возвращается значение: <math> argmin_{param} \frac{g(param)}{l(param)} </math> | ||
− | == | + | === Последовательная конфигурация алгоритма на основе модели === |
− | === Основная информация === | + | ==== Основная информация ==== |
− | SMAC | + | '''Последовательная конфигурация алгоритма на основе модели''' (англ. ''Sequential Model-based Algorithm Configuration, SMAC'') расширяет подходы SMBO: |
* Использует дискретные и условные пространства параметров. | * Использует дискретные и условные пространства параметров. | ||
* Обрабатывает негауссовский шум. | * Обрабатывает негауссовский шум. | ||
* Выделяет бюджет на общее время, доступное для настройки алгоритма, а не на количество оценок функций. | * Выделяет бюджет на общее время, доступное для настройки алгоритма, а не на количество оценок функций. | ||
+ | |||
+ | Кроме того, SMAC использует переданную ему модель для формирования списка перспективных конфигураций (сочетаний) параметров. Чтобы оценить перспективность конфигурация <math> \theta </math>, SMAC строит распределение результатов модели для <math> \theta </math>. | ||
+ | С помощью этого распределения, а также информации, о текущей лучшей конфигурации, 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:// | + | * [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=u6MG_UTwiIQ Bayesian optimization] | ||
* [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:
- Создание экземпляра класса
SGDClassifier
(из sklearn) - Создание сетки гиперпараметров. В данном случае будем подбирать коэффициент регуляризации, шаг градиентного спуска, количество итераций и параметр скорости обучения.
- Создание экземпляра класса кросс-валидации
- Создание экземпляра
GridSearch
(из sklearn). Первый параметр — модель, второй — сетка гиперпараметров, третий — функционал ошибки (используемый для контроля качества моделей по технике кросс-валидации), четвертый — кросс-валидация (можно задать количество фолдов, а можно передать экземпляр класса кросс - валидации) - Запуск поиска по сетке.
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) вместо полного перебора работает с некоторыми, случайным образом выбранными, комбинациями. На основе полученных результатов, происходит сужение области поиска.
Когда случайный поиск по сетке будет гораздо полезнее, чем просто поиск по сетке? В ситуации, когда гиперпараметров много, но сильно влияющих на конечную производительность алгоритма — мало.
Реализация случайного поиска по сетке
Последовательная оптимизация по модели
Основная информация
Последовательная оптимизация по модели (англ. Sequential Model-Based Optimization, SMBO) используются когда оптимизация целевой функции будет стоить очень "дорого". Главная идея SMBO — замена целевой функции "суррогатной" функцией.
На каждом шаге работы SMBO:
- Строится вероятностная модель (суррогатная функция) целевой функции.
- Подбираются гиперпараметры, которые лучше всего подходят для вероятностной модели.
- Подобранные гиперпараметры применяются к целевой функции.
- Вероятностная модель перестраивается (обновляется).
- Шаги 2-4 повторяются столько раз, сколько задал пользователь.
Существует четыре ключевые аспекта SMBO:
- Сетка значений гиперпараметров (область поиска).
- Целевая функция (выводит оценку, которую мы хотим минимизировать или максимизировать).
- Вероятностная модель целевой функции (суррогатная функция).
- Критерий, называемый функцией выбора (для выбора следующих гиперпараметры по текущей вероятностной модели).
Методы SMBO отличаются между собой вероятностными моделями и функциями выбора:
Популярные вероятностные модели (суррогатные функции):
- Гауссовские процессы
- Древовидный парзеновский оценщик
- Регрессия случайного леса
Древовидный парзеновский оценщик
Основная информация
Как было написано выше, методы SMBO отличаются тем, как они строят вероятностную модель
. В случае древовидного парзеновского оценщика (англ. Tree-structured Parzen Estimator, TPE), используется следующая функция:
— распределение гиперпараметров, — значение целевой функции, — пороговое начение
В TPE задается два различных распределения гиперпараметров: первое при значениях целевой функции меньших, чем пороговое значение. Второе - при значениях целевой функции больших, чем пороговое значение.
Алгоритм
- На вход подается список пар (parameters, loss)
- По заданному порогу, происходит разбиение списка на 2 части
- Для каждого списка строится распределение
- Возвращается значение:
Последовательная конфигурация алгоритма на основе модели
Основная информация
Последовательная конфигурация алгоритма на основе модели (англ. Sequential Model-based Algorithm Configuration, SMAC) расширяет подходы SMBO:
- Использует дискретные и условные пространства параметров.
- Обрабатывает негауссовский шум.
- Выделяет бюджет на общее время, доступное для настройки алгоритма, а не на количество оценок функций.
Кроме того, SMAC использует переданную ему модель для формирования списка перспективных конфигураций (сочетаний) параметров. Чтобы оценить перспективность конфигурация . После нахождения необходимо найти конфигурацию с наибольшим значением . Эта задача приводит к проблеме максимизация значения на всем пространстве конфигураций. Другие методы SMBO максимизируют значения а случайной выборке из пространства конфигураций, что достаточно плохо работает в случае высокомерного пространства. SMAC применяет немного другой подход: выполняется несколько локальных и поисков и среди них выбираются все конфигурации с максимальным . И уже среди них производится новый поиск и выбирается лучшая конфигурация.
, SMAC строит распределение результатов модели для . С помощью этого распределения, а также информации, о текущей лучшей конфигурации, SMAC вычисляет ожидаемое положительное улучшениеРеализация
- SMBO: SMAC
- TPE: Hyperopt
- Гауссовские процессы: Spearmint, Scikit-optimize