Редактирование: Настройка гиперпараметров

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

Внимание! Вы не авторизовались на сайте. Ваш IP-адрес будет публично видимым, если вы будете вносить любые правки. Если вы войдёте или создадите учётную запись, правки вместо этого будут связаны с вашим именем пользователя, а также у вас появятся другие преимущества.

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия Ваш текст
Строка 1: Строка 1:
 
== Гиперпараметры ==
 
== Гиперпараметры ==
  
Гиперпараметры параметры, которые не настраиваются во время обучения модели. Пример гиперпараметра шаг градиентного спуска, он задается перед обучением. Пример параметров веса градиентного спуска, они изменяются и настраиваются во время обучения.
+
Гиперпараметры - параметры, которые не настраиваются во время обучения модели.  
 +
 
 +
Пример гиперпараметра - шаг градиентного спуска, он задается перед обучением. <br>
 +
Пример параметров - веса градиентного спуска, они изменяются и настраиваются во время обучения.
  
 
Для подбора гиперпараметров необходимо разделить датасет на три части:
 
Для подбора гиперпараметров необходимо разделить датасет на три части:
Строка 8: Строка 11:
 
* test set (тестовый набор данных, для тестирования лучшей модели)
 
* test set (тестовый набор данных, для тестирования лучшей модели)
  
Зачем нам нужен и валидационный, и тестовый набор? Дело в том, что модель может переучиться на валидационном наборе данных. Для выявления переобучения используется тестовый набор данных.
+
Зачем нам нужен и валидационный, и тестовый набор? <br>
 +
Дело в том, что модель может переучиться на валидационном наборе данных. Для выявления переобучения используется тестовый набор данных.
  
Рассмотрим модель <code>KNeighborsClassifier</code> из библиотеки sklearn. Все “параметры” данной модели (loss, penalty, alpha и т.д), с точки зрения машинного обучения, являются гиперпараметрами, так как задаются до начала обучения.
+
Рассмотрим модель KNeighborsClassifier из библиотеки sklearn. Все “параметры” данной модели, с точки зрения машинного обучения, являются гиперпараметрами, так как задаются до начала обучения.
  
    class sklearn.linear_model.SGDClassifier(loss='hinge', penalty='l2', alpha=0.0001, l1_ratio=0.15, fit_intercept=True, max_iter=1000,
+
[[Файл:KNeighborsClassifier_model.png|center|1000px]]
                                        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 Grid search: использование ===
+
Grid search принимает на вход модель и различные значения гиперпараметров (сетку гиперпараметров).
 +
Далее, для каждого возможного сочетания значений гиперпараметров, метод считает ошибку и в конце выбирает сочетание, при котором ошибка минимальна.
  
Пример использования <code>GridSearch</code> из библиотеки scikit-learn:
+
==== Sklearn Grid search: использование ====
  
# Создание экземпляра класса  <code>SGDClassifier</code> (из sklearn)
+
Пример использования Grid search из библиотеки scikit-learn:
 +
 
 +
# Создание экземпляра класса  SGDClassifier (из sklearn)
 
# Создание сетки гиперпараметров. В данном случае будем подбирать коэффициент регуляризации, шаг градиентного спуска, количество итераций и параметр скорости обучения.
 
# Создание сетки гиперпараметров. В данном случае будем подбирать коэффициент регуляризации, шаг градиентного спуска, количество итераций и параметр скорости обучения.
 
# Создание экземпляра класса кросс-валидации
 
# Создание экземпляра класса кросс-валидации
# Создание экземпляра <code>GridSearch</code> (из sklearn). Первый параметр модель, второй сетка гиперпараметров, третий функционал ошибки (используемый для контроля качества моделей по технике кросс-валидации), четвертый кросс-валидация (можно задать количество фолдов, а можно передать экземпляр класса кросс - валидации)
+
# Создание экземпляра GridSearch (из sklearn). Первый параметр - модель, второй - сетка гиперпараметров, третий - функционал ошибки (используемый для контроля качества моделей по технике кросс-валидации), четвертый - кросс-валидация (можно задать количество фолдов, а можно передать экземпляр класса кросс - валидации)
 
# Запуск поиска по сетке.
 
# Запуск поиска по сетке.
  
    classifier = linear_model.SGDClassifier(random_state = 0, tol=1e-3)
+
[[Файл:KNeighborsClassifier_exmpl.png|center|1000px]]
  
    parameters_grid = {
+
==== Sklearn Grid search: важные атрибуты ====
        '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)
+
* best_estimator_  - лучшая модель
    grid_cv = model_selection.GridSearchCV(classifier, parameters_grid, scoring = 'accuracy', cv = cv)
+
* best_score_  - ошибка, полученная на лучшей модели.
    grid_cv.fit(train_data, test_data)
+
* best_params_  - гиперпараметры лучшей модели <br>
  
    Out:
+
[[Файл:KNeighborsClassifier_bestest.png|center|1000px]] <br>
    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 Grid search: важные атрибуты ===
+
* cv_results_  - результаты всех моделей. <br>
  
* <code>best_estimator_</code>  — лучшая модель
+
[[Файл:KNeighborsClassifier_results.png|center|1000px]] <br>
* <code>best_score_</code>  — ошибка, полученная на лучшей модели.
 
* <code>best_params_</code> — гиперпараметры лучшей модели <br>
 
  
    print(grid_cv.best_estimator_) <br>
+
* доступ к массиву определенного параметра: <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)
 
  
    print(grid_cv.best_score_) <br>
+
[[Файл:KNeighborsClassifier_param_array.png|center|1000px]] <br>
    Out: 0.9099999999999999
 
  
    print(grid_cv.best_params_) <br>
+
==== Реализация Grid search в библеотеках====
    Out: {'alpha': 4.857142857142857e-05, 'eta0': 1e-05, 'learning_rate': 'optimal', 'max_iter': 6}
+
* Katib
 +
* scikit-learn
 +
* Tune
 +
* Talos
  
* <code>cv_results_</code>  — результаты всех моделей. <br>
 
  
    print(grid_cv.cv_results_) <br>
+
=== Random grid search ===
    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)
 
 
 
=== Реализация Grid search в библеотеках ===
 
* [https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html scikit-learn]
 
* [https://github.com/kubeflow/katib Katib]
 
* [https://tidymodels.github.io/tune/articles/grid.html Tune]
 
* [https://autonomio.github.io/docs_talos/#grid-search Talos]
 
 
 
== Random grid search ==
 
 
 
=== Основная информация ===
 
 
 
Вместо полного перебора, Random grid search работает с некоторыми, случайным образом выбранными, комбинациями. На основе полученных результатов, происходит сужение области поиска.
 
  
Когда random grid search будет гораздо полезнее, чем  grid search? В ситуации,  когда гиперпараметров много, но сильно влияющих на конечную производительность алгоритма мало.
+
Вместо полного перебора, Random grid search работает с некоторыми, случайным образом выбранными, комбинациями. На основе полученных результатов,происходит сужение области поиска. Random grid search будет гораздо полезнее, чем  grid search в ситуации,  когда гиперпараметров много, но сильно влияющих на конечную производительность алгоритма - мало.
  
=== Реализация Random grid ===
+
==== Реализация Random grid ====
  
* [https://ray.readthedocs.io/en/latest/tune-searchalg.html#variant-generation-grid-search-random-search Ray]
+
* hyperopt
* [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]
 
  
== SMBO  ==
 
  
=== Основная информация ===
+
=== SMBO  ===
 +
SMBO - Sequential Model-Based Optimization (Методы последовательной оптимизации на основе моделей)
  
SMBO (Sequential Model-Based Optimization) — методы, основанные на байесовской оптимизации
+
SMBO являются формализацией байесовской оптимизации.
 
 
Когда используют SMBO? Когда оптимизация целевой функции будет стоить очень "дорого". Главная идея SMBO — замена целевой функции "суррогатной" функцией.
 
 
   
 
   
На каждом шаге работы SMBO:
+
На каждом шаге SMBO:
 
+
# SMBO выбирает текущий набор гиперпараметров на основе предыдущих результатов и Байесовский рассуждений. Делается это для того, чтобы сузить область поиска и сосредоточиться на том, что наиболее перспективно.
# Строится вероятностная модель (суррогатная функция) целевой функции.
+
# происходит запуск модели с текущими гиперпараметрами
# Подбираются гиперпараметры, которые лучше всего подходят для вероятностной модели.
+
# обновляется вероятностная модель.
# Подобранные гиперпараметры применяются к целевой функции.
 
# Вероятностная модель перестраивается (обновляется).
 
# Шаги 2-4 повторяются столько раз, сколько задал пользователь.
 
 
 
  
Существует четыре ключевые аспекта SMBO:
+
Существует пять ключевых аспектов SMBO:
* Сетка значений гиперпараметров (область поиска).
+
* Сетка значений гиперпараметров (область поиска)
* Целевая функция (выводит оценку, которую мы хотим минимизировать или максимизировать).
+
* Целевая функция, которая принимает гиперпараметры и выводит оценку, которую мы хотим минимизировать (или максимизировать)
* Вероятностная модель целевой функции (суррогатная функция).
+
* Вероятностная модель целевой функции
* Критерий, называемый функцией выбора (для выбора следующих гиперпараметры по текущей вероятностной модели).
+
* Критерий, называемый функцией выбора, для оценки того, какие гиперпараметры выбрать следующим из  вероятностной модели.
 +
* История, состоящая из пар <оценка, гиперпараметр>, используемая алгоритмом для обновления вероятностной модели.
  
 +
Существует несколько вариантов SMBO оптимизации, которые отличаются между собой в 3 и 4 пунктах: есть различные варианты построения вероятностной модели целевой функции и выбора критерия.
 +
Вероятностные модели (3 пункт): Gaussian Processes, Random Forest Regressions, and Tree Parzen Estimators (TPE).
 +
Популярный критерий (4 пункт): Expected Improvement
  
Методы SMBO отличаются между собой вероятностными моделями и функциями выбора: <br>
 
Популярные вероятностные модели (суррогатные функции):
 
* Gaussian Processes
 
* Tree Parzen Estimators (TPE)
 
* Random Forest Regressions
 
  
 
=== TPE ===
 
=== TPE ===
  
==== Основная информация ====
+
TPE - Tree-structured Parzen Estimator (Древовидная структура Парзена)
TPE Tree-structured Parzen Estimator (Древовидная структура Парзена)
 
  
Как было написано выше, методы SMBO отличаются тем, как они строят вероятностную модель <math> {p(y|x)} </math>. В случае TPE, используется следующая функция:
+
Методы SMBO отличаются тем, как они строят вероятностную модель p (y | x). В случае 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 < 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 ===
 
=== SMAC ===
  
==== Основная информация ====
+
расширяет подходы SMBO
  
SMAC использует Random Forest regression и расширяет подходы 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>. И уже среди них производится новый поиск и выбирается лучшая конфигурация.
 
 
 
=== Реализация ===
 
* Random Forest Regressions: [https://www.automl.org/automated-algorithm-design/algorithm-configuration/smac/ SMAC]
 
* Tree Parzen Estimators: [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]
 
 
 
== См. также ==
 
[http://neerc.ifmo.ru/wiki/index.php?title=Машинное_обучение Викиконспекты: Машинное обучение]
 
 
 
== Источники ==
 
 
  
* [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]
+
несколько независимых запусков на одном экземпляре);
 +
* частично цензурированные оценки функций (из-за преждевременного
 +
завершенные запуски алгоритма);
 +
* бюджет на общее время, доступное для настройки алгоритма, а не на количество оценок функций;

Пожалуйста, учтите, что любой ваш вклад в проект «Викиконспекты» может быть отредактирован или удалён другими участниками. Если вы не хотите, чтобы кто-либо изменял ваши тексты, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений, или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого (см. Викиконспекты:Авторские права). НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ МАТЕРИАЛЫ!

Чтобы изменить эту страницу, пожалуйста, ответьте на приведённый ниже вопрос (подробнее):

Отменить | Справка по редактированию (в новом окне)