Изменения

Перейти к: навигация, поиск

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

8591 байт добавлено, 19:24, 4 сентября 2022
м
rollbackEdits.php mass rollback
== Гиперпараметры Гиперпараметр ==
Гиперпараметры - параметры'''Гиперпараметр''' (англ. ''hyperparameter'') — параметр, которые который не настраивается во время обучения модели. Пример гиперпараметра — шаг градиентного спуска, он задается перед обучением. Пример параметров — веса градиентного спуска, они изменяются и настраиваются во время обучения модели.
Пример гиперпараметра - шаг градиентного спускаДля подбора гиперпараметров необходимо разделить датасет на три части:* тренировочный набор данных (англ. ''training set''), он задается перед обучениемдля обучения модели* валидационный набор данных (англ. <br>Пример параметров - веса градиентного спуска''validation set''), они изменяются для расчета ошибки и настраиваются во время обучениявыбора наилучшей модели* тестовый набор данных (англ.''test set''), для тестирования выбранной модели
Для подбора гиперпараметров необходимо разделить датасет на три части:* training set (тренировочный Зачем нам нужен и валидационный, и тестовый набор данных? Дело в том, для обучении модели) * validation set (валидационный набор что модель может переучиться на валидационном наборе данных, для расчета ошибки и выбора наилучшей модели)* test set (. Для выявления переобучения используется тестовый набор данных, для тестирования лучшей модели).
Зачем нам нужен и валидационный, и тестовый набор? Рассмотрим модель <code>KNeighborsClassifier<br/code>Дело в томиз библиотеки sklearn. Все “параметры” данной модели (loss, что модель может переучиться на валидационном наборе данныхpenalty, alpha и т. Для выявления переобучения используется тестовый набор данныхд), с точки зрения машинного обучения, являются гиперпараметрами, так как задаются до начала обучения.
Рассмотрим модель KNeighborsClassifier из библиотеки 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)
[[Файл:KNeighborsClassifier_model.png|800px|thumb|left| Все “параметры” данной модели, с точки зрения машинного обучения, являются гиперпараметрами, так как задаются до начала обучения.]]== Поиск по сетке ==
== Техники настройки гиперпараметров = Общая информация ===
=== '''Поиск по сетке''' (англ. ''Grid search ==='') принимает на вход модель и различные значения гиперпараметров (сетку гиперпараметров). Далее, для каждого возможного сочетания значений гиперпараметров, метод считает ошибку и в конце выбирает сочетание, при котором ошибка минимальна.
Принимает на вход модель и различные значения гиперпараметров (сетку гиперпараметров). Далее, для каждого возможного сочетания значений гиперпараметров, метод считает ошибку и === Поиск по сетке в конце выбирает сочетание, при котором ошибка минимальна.Sklearn: использование ===
Пример использования Grid search <code>GridSearch</code> из библиотеки scikit-learn:
# Создание экземпляра класса <code>SGDClassifier </code> (из sklearn)
# Создание сетки гиперпараметров. В данном случае будем подбирать коэффициент регуляризации, шаг градиентного спуска, количество итераций и параметр скорости обучения.
# Создание экземпляра класса кросс-валидации.# Создание экземпляра <code>GridSearch </code> (из 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: важные атрибуты GridSearch===
* <code>best_estimator_ </code> - лучшая модель* <code>best_score_ </code> - ошибка, полученная на лучшей модели.* <code>best_params_ - </code> — гиперпараметры лучшей модели<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)
* cv_results_ - результаты всех моделей print(grid_cv.best_score_) <br> Out: 0.9099999999999999
картинка print(grid_cv.best_params_) <br> Out: {'alpha': 4.857142857142857e-05, 'eta0': 1e-05, 'learning_rate': 'optimal', 'max_iter': 6}
* доступ к массиву определенного параметра:<code>cv_results_</code> — результаты всех моделей. <br>
картинка print(grid_cv.cv_results_) <br> 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) <br> Out: array([5, 6, 7, ..., 7, 8, 9], dtype=object) === Реализация =поиска по сетке в библиотеках ===* Katib* 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 ===Grid Search'') вместо полного перебора работает с некоторыми, случайным образом выбранными, комбинациями. На основе полученных результатов, происходит сужение области поиска.
Вместо полного перебора, Random grid search работает с некоторыми, случайным образом выбранными, комбинациями. На основе полученных результатов,происходит сужение области поиска. Random grid search Когда случайный поиск по сетке будет гораздо полезнее, чем grid search в просто поиск по сетке? В ситуации, когда гиперпараметров много, но сильно влияющих на конечную производительность алгоритма - мало.
==== Реализация =случайного поиска по сетке ===
* hyperoptRay<ref>[https://ray.readthedocs.io/en/latest/tune-searchalg.html#variant-generation-grid-search-random-search Ray]</ref>
* Katib
* scikit-learn
* Tune
* Talos
* Hyperopt<ref>[https://hyperopt.github.io/hyperopt/#algorithms Hyperopt]</ref>
== Последовательная оптимизация по модели ==
=== SMBO Основная информация ===SMBO - Sequential Model-Based Optimization (Методы последовательной оптимизации на основе моделей)
'''Последовательная оптимизация по модели''' (англ. ''Sequential Model-Based Optimization, SMBO являются формализацией байесовской оптимизации'') используются когда оптимизация целевой функции будет стоить очень "дорого". Главная идея SMBO — замена целевой функции "суррогатной" функцией.
На каждом шаге работы SMBO: # SMBO выбирает текущий набор гиперпараметров на основе предыдущих результатов и Байесовский рассужденийСтроится вероятностная модель (суррогатная функция) целевой функции. Делается это # Подбираются гиперпараметры, которые лучше всего подходят для тоговероятностной модели.# Подобранные гиперпараметры применяются к целевой функции.# Вероятностная модель перестраивается (обновляется).# Шаги 2-4 повторяются столько раз, чтобы сузить сколько задал пользователь.  Существует четыре ключевые аспекта SMBO:* Сетка значений гиперпараметров (область поиска и сосредоточиться на том).* Целевая функция (выводит оценку, которую мы хотим минимизировать или максимизировать).* Вероятностная модель целевой функции (суррогатная функция).* Критерий, что наиболее перспективноназываемый функцией выбора (для выбора следующих гиперпараметры по текущей вероятностной модели).# происходит запуск  Методы SMBO отличаются между собой вероятностными моделями и функциями выбора: <br>Популярные вероятностные модели с текущими гиперпараметрами(суррогатные функции):# обновляется вероятностная модель.* Гауссовские процессы* Древовидный парзеновский оценщик* Регрессия случайного леса
Существует пять ключевых аспектов SMBO:* Сетка значений гиперпараметров (область поиска)* Целевая функция, которая принимает гиперпараметры и выводит оценку, которую мы хотим минимизировать (или максимизировать)* Вероятностная модель целевой функции* Критерий, называемый функцией выбора, для оценки того, какие гиперпараметры выбрать следующим из вероятностной модели.* История, состоящая из пар <оценка, гиперпараметр>, используемая алгоритмом для обновления вероятностной модели.=== Древовидный парзеновский оценщик ===
Существует несколько вариантов ==== Основная информация ====Как было написано выше, методы SMBO оптимизацииотличаются тем, которые отличаются между собой в 3 и 4 пунктах: есть различные варианты построения вероятностной модели целевой функции и выбора критериякак они строят вероятностную модель <math> {p(y|x)} </math>.Вероятностные модели В случае '''древовидного парзеновского оценщика''' (3 пункт): Gaussian Processes, Random Forest Regressions, and англ. ''Tree -structured Parzen Estimators (Estimator, TPE'').Популярный критерий (4 пункт), используется следующая функция: Expected Improvement
<math> p(y) = \frac{p(x|y) * p(y)}{p(x)} </math>
=== TPE ===<math> {p(x|y)} </math> — распределение гиперпараметров, <math> y </math> — значение целевой функции, <math> y* </math> — пороговое начение
TPE - Tree-structured Parzen Estimator <math> p(Древовидная структура Парзенаx|y)= \begin{cases} l(x), & \mbox{if } y < y* \\ g(x), & \mbox{if } y \ge y*\end{cases}</math>
Методы SMBO отличаются темВ TPE задается два различных распределения гиперпараметров: первое при значениях целевой функции меньших, как они строят вероятностную модель p (y | x)чем пороговое значение. В случае TPEВторое - при значениях целевой функции больших, используется следующая функция:чем пороговое значение.
формула==== Алгоритм ====
=== SMAC ===# На вход подается список пар (parameters, loss)# По заданному порогу, происходит разбиение списка на 2 части# Для каждого списка строится распределение# Возвращается значение: <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 вычисляет ожидаемое положительное улучшение [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]
* дискретные и условные пространства параметров (с учетомоптимизация параметров категориального алгоритма и параметров, между которыми существуют зависимости);* существенный негауссовский шум (из-за дисперсии враспределение времени выполнения алгоритма по экземплярам задач инесколько независимых запусков на одном экземпляре);* частично цензурированные оценки функций (из-за преждевременногозавершенные запуски алгоритма);* бюджет на общее время, доступное для настройки алгоритма, а не на количество оценок функций;[[Категория: Машинное обучение]] [[Категория: Автоматическое машинное обучение]]
1632
правки

Навигация