что такое гиперпараметр в машинном обучении
В чем разница между параметром и гиперпараметром?
Дата публикации 2017-07-26
Это может сбивать с толку, когда вы начинаете в прикладном машинном обучении.
Есть так много терминов, которые можно использовать, и многие из этих терминов могут не использоваться последовательно. Это особенно верно, если вы пришли из другой области обучения, в которой могут использоваться те же термины, что и машинное обучение, но они используются по-разному.
Например: термины «параметр модели» а также «модельный гиперпараметр«.
Отсутствие четкого определения этих терминов является обычной борьбой для начинающих, особенно тех, которые пришли из области статистики или экономики.
В этом посте мы подробнее рассмотрим эти термины.
Что такое параметр модели?
Параметры являются ключевыми для алгоритмов машинного обучения. Они являются частью модели, которая извлекается из исторических данных обучения.
Часто параметры модели оцениваются с использованием алгоритма оптимизации, который является типом эффективного поиска по возможным значениям параметров.
Имеет ли модель фиксированное или переменное число параметров, определяет, можно ли ее назвать «параметрический» или же «непараметрический«.
Некоторые примеры параметров модели включают в себя:
Что такое модельный гиперпараметр?
Мы не можем знать лучшее значение для гиперпараметра модели в данной задаче. Мы можем использовать практические правила, копировать значения, используемые для других задач, или искать лучшее значение методом проб и ошибок.
Когда алгоритм машинного обучения настроен на конкретную проблему, например, когда вы используете поиск по сетке или случайный поиск, вы настраиваете гиперпараметры модели или порядок, чтобы обнаружить параметры модели, которые приводят к наиболее умелому прогнозы.
Многие модели имеют важные параметры, которые не могут быть непосредственно оценены по данным. Например, в модели классификации K-ближайшего соседа… Этот тип параметра модели называется параметром настройки, поскольку для расчета подходящего значения нет аналитической формулы.
Гиперпараметры модели часто называют параметрами модели, которые могут привести к путанице. Хорошее практическое правило для преодоления этой путаницы заключается в следующем:
Если вам нужно указать параметр модели вручную, то
это, вероятно, гиперпараметр модели.
Некоторые примеры гиперпараметров модели включают в себя:
Дальнейшее чтение
Резюме
В этом посте вы обнаружили четкие определения и разницу между параметрами модели и гиперпараметрами модели.
Таким образом, параметры модели оцениваются на основе данных автоматически, а гиперпараметры модели устанавливаются вручную и используются в процессах для оценки параметров модели.
Гиперпараметры модели часто называют параметрами, потому что они являются частями машинного обучения, которые должны быть установлены вручную и настроены.
Помог ли этот пост разобраться в путанице?
Позвольте мне знать в комментариях ниже.
Существуют ли параметры модели или гиперпараметры, в которых вы все еще не уверены?
Опубликуйте их в комментариях, и я сделаю все возможное, чтобы прояснить ситуацию дальше.
Настройка гиперпараметров
Содержание
Гиперпараметр [ править ]
Гиперпараметр (англ. hyperparameter) — параметр, который не настраивается во время обучения модели. Пример гиперпараметра — шаг градиентного спуска, он задается перед обучением. Пример параметров — веса градиентного спуска, они изменяются и настраиваются во время обучения.
Для подбора гиперпараметров необходимо разделить датасет на три части:
Зачем нам нужен и валидационный, и тестовый набор? Дело в том, что модель может переучиться на валидационном наборе данных. Для выявления переобучения используется тестовый набор данных.
Рассмотрим модель KNeighborsClassifier из библиотеки sklearn. Все “параметры” данной модели (loss, penalty, alpha и т.д), с точки зрения машинного обучения, являются гиперпараметрами, так как задаются до начала обучения.
Поиск по сетке [ править ]
Общая информация [ править ]
Поиск по сетке (англ. Grid search) принимает на вход модель и различные значения гиперпараметров (сетку гиперпараметров). Далее, для каждого возможного сочетания значений гиперпараметров, метод считает ошибку и в конце выбирает сочетание, при котором ошибка минимальна.
Поиск по сетке в Sklearn: использование [ править ]
Пример использования GridSearch из библиотеки scikit-learn:
Поиск по сетке в Sklearn: важные атрибуты [ править ]
Реализация поиска по сетке в библиотеках [ править ]
Случайный поиск по сетке [ править ]
Основная информация [ править ]
Случайный поиск по сетке (англ. Random Grid Search) вместо полного перебора работает с некоторыми, случайным образом выбранными, комбинациями. На основе полученных результатов, происходит сужение области поиска.
Когда случайный поиск по сетке будет гораздо полезнее, чем просто поиск по сетке? В ситуации, когда гиперпараметров много, но сильно влияющих на конечную производительность алгоритма — мало.
Реализация случайного поиска по сетке [ править ]
Последовательная оптимизация по модели [ править ]
Основная информация [ править ]
Последовательная оптимизация по модели (англ. Sequential Model-Based Optimization, SMBO) используются когда оптимизация целевой функции будет стоить очень «дорого». Главная идея SMBO — замена целевой функции «суррогатной» функцией.
На каждом шаге работы SMBO:
Существует четыре ключевые аспекта SMBO:
Методы SMBO отличаются между собой вероятностными моделями и функциями выбора:
Популярные вероятностные модели (суррогатные функции):
Древовидный парзеновский оценщик [ править ]
Основная информация [ править ]
[math]
[/math] — распределение гиперпараметров, [math] y [/math] — значение целевой функции, [math] y* [/math] — пороговое начение
[math] p(x|y) = \begin
Алгоритм [ править ]
Последовательная конфигурация алгоритма на основе модели [ править ]
Основная информация [ править ]
Последовательная конфигурация алгоритма на основе модели (англ. Sequential Model-based Algorithm Configuration, SMAC) расширяет подходы SMBO:
Гиперпараметры: как перестать беспокоиться и начать их оптимизировать
«Подбор гиперпараметров». Если у вас в голове при произнесении этой фразы прокатились несколько панических атак и непроизвольно задергался глаз, а, возможно, и рука в инстинктивном желании перевернуть стол с криками «Да ну его, этот ваш дата сайнс» (нецензурную брань оставим за скобками), значит вы, как и я, хоть раз пытались обучить наивный байес мало-мальски тяжелую модель на большом объеме данных.
Размер батча, learning rate, размер того слоя, размер сего слоя, вероятность dropout-a. Страшно? Уже представляете часы (дни) ожидания? А это я еще про количество голов у трансформеров не говорил…
Короче говоря, подбор гиперпараметров – это всегда боль любого датасаентолога. При этом известно, что пренебрежение этой процедурой может привести к большой потере в качестве или в производительности при решении любой задачи анализа данных, а в случае если вы предлагаете какой-то инновационный подход, то к построению слабого бейзлайна (this).
Процедуры RandomSearch и GridSearch известны нам всем из любого начального курса по машинному обучению. Однако немногие знают, или, по крайней мере, немногие используют при решении своих задач более изощренные методы оптимизации гиперпараметров. Мне давно было интересно разобраться, как работают подобные методы и действительно ли они дают существенный выигрыш во времени по сравнению с классикой. В данной статье я быстренько пройдусь по вышеупомянутым GridSearch и RandomSearch, постараюсь привести интуитивное объяснение, как работают байесовские алгоритмы оптимизации гиперпараметров, а также протестирую несколько существующих фреймворков (hyperopt, scikit-optimize, optuna) на одной из задач NLP.
Постановка задачи
Для начала стоит отметить, что алгоритмы оптимизации гиперпараметров работают с моделью, как с черным ящиком (с оракулом, если вам ближе язык оптимизации): им неважно, как работает модель, важно только значение функционала качества модели, обученной с рассматриваемыми гиперпараметрами. Поставим задачу более формально, описав её ДНК (Дано, Найти, Критерий (здравствуйте, Константин Вячеславович)).
Пространство гиперпараметров где
– пространство
-го параметра. Данные
.
Найти
где измеряет функцию потерь модели
, обученной при гиперпараметрах
на
и провалидированной на
[1].
Критерий
GridSearch, RandomSearch
Собственно, смысл этих подходов описан в их названии. «GridSearch» дословно обозначает «поиск по сетке», то есть «тупой экспоненциальный перебор всех узлов сетки параметров». Для RandomSearch всё слегка хитрее: он не просто перебирает все узлы сетки, а семплирует очередную точку на каждом шаге оптимизации.
Думаю, многие видели подобную картинку в доказательство превосходства RandomSearch. Поиск по сетке слишком завязан на координатах, которые вы ему подаете на вход. Случайный поиск же менее зависим от человека и вполне может попасть в точку пространства, которая ближе к оптимуму (конечно, если эти точки распределены не категориально [спойлер: в наших экспериментах они распределены категориально]).
Bayesian optimization
По сути, байесовский подход – это модификация случайного поиска. Подумайте сами: как бы вы могли улучшить RandomSearch? Очевидно, что хочется чаще семплировать в окрестности тех точек, которые дают больший прирост в качестве. Собственно, так же подумали и байесиане байесологи свидетели Байеса исследователи байесовской статистики и байесовской оптимизации. Был предложен подход, основанный на идее, что для выбора лучшей области пространства гиперпараметров следует учитывать историю уже рассмотренных точек, в которых были обучены модели и получены значения целевой функции. Данный метод оптимизации гиперпараметров получил название SMBO (Sequential Model-Based Optimization).
Sequential Model-Based Optimization (SMBO)
Источник изображения: [3]
SMBO включает в себя два ключевых ингредиента: вероятностная суррогатная модель (surrogate model) ( в приведенном выше алгоритме) и функция выбора (acquisition function) следующей точки (
в приведенном выше алгоритме). На каждой итерации суррогатная модель обучается по всем полученным ранее выходам целевой функции. Таким образом, мы стараемся получить более дешевую аппроксимацию целевой функции. Далее функция выбора, используя предсказательное распределение суррогатной модели, оценивает «пользу» различных следующих точек, балансируя между использованием уже имеющейся информации и «разведыванием» новой области пространства (exploration vs exploitation). [1]
Источник изображения: [1]
Если проводить аналогию с обычной задачей машинного обучения, то функция выбора – это функция качества для мета-алгоритма SMBO, а суррогатная модель – это модель, которую мы получаем на выходе этого мета-алгоритма. Примерами функции выбора могут служить Expected Improvement, Probability of Improvement и т.п. Здесь и далее будет использоваться Expected Improvement, если не оговорено иное:
• – некоторый порог значения функционала качества,
• – суррогатная вероятностная модель получения
при выбранных гиперпараметрах
и истории
. [2]
Таким образом, после некоторого количества итераций SMBO мы получаем какую-то аппроксимацию нашей целевой функции
. При этом, значения
стоит получить гораздо дешевле, чем значения
.
Если говорить о суррогатных моделях, одними из наиболее популярных являются гауссовские процессы (Gaussian Processes (GP)) и парзеновские деревья (Tree-Structured Parzen Estimators (TPE)).
Согласен, остановимся на этом чуть подробнее.
Gaussian Processes
При использовании гауссовских процессов целевая функция аппроксимируется в виде апостериорного распределения значений при выбранных параметрах и известной истории (). В качестве априорного распределения выбирается нормальное с константным матожиданием и изменяемой функцией ковариации:
.
Tree Parzen Estimators
В отличие от GP, которые напрямую моделируют , данная стратегия моделирует
и
. Для этого априорные вероятности распределения каждого из гиперпараметров заменяются на их непараметрические аналоги. При этом, подобные замены позволяют использовать все имеющиеся точки пространства, моделируя сразу несколько распределений:
Стоит заметить, что в GP все точки из области y^*$» data-tex=»inline»/> просто отбрасывались при использовании апостериорной вероятности в EI.
Алгоритм выбирает как некоторый
-квантиль среди всех полученных
(в отличие от гауссовских процессов, где
обычно выбирается как наименьшее значение лосса (функционала качества) из всей истории). В итоге можно показать [3], что
Из формулы можно увидеть, что для максимизации EI необходимо с высокой вероятностью брать точки из и с низкой – из
. Подобный компромисс как раз решает проблему «exploration vs. exploitation».
В статье [3], где был впервые представлен TPE, приводилось его сравнение с GP, где TPE показал себя сильно лучше.
Эксперименты
Постановка эксперимента
Данные
Для эксперимента решено было взять задачу sentiment-analysis на датасете Large Movie Reviews Dataset. Датасет представляет собой сбалансированную выборку отрицательных и положительных отзывов о фильмах с imdb. В данном эксперименте нашей целью стояло не получение SOTA (state-of-the-art)-качества на конкретной задаче, а сравнение существующих фреймворков для оптимизации гиперпараметров с точки зрения конечного качества, удобства и скорости работы. Поэтому для преобразования слов в векторные представления мы взяли базовые предобученные 300-мерные fasttext эмбеддинги для английского языка, для 16 миллиардов токенов. При этом токенизация производилась простым TweetTokenizer из nltk без какой-либо дополнительной предобработки слов.
Модель и обучение
Мы выбрали модель на основе LSTM из pytorch со следующими конфигурируемыми гиперпараметрами:
Помимо этого, я также изменял
Изначально еще хотелось покрутить dropout, но для уменьшения мощности пространства гиперпараметров решено было зафиксировать его на значении 0.5. Как уже говорилось, в данной статье мы не гнались за SOTA-качеством. Поэтому распределение каждого из параметров было решено сделать категориальным с одинаковыми вероятностями (проще говоря, представить в виде сетки) для еще большего уменьшения мощности пространства. Вся сетка гиперпараметров выглядит следующим образом:
Чтобы не переобучать все модели для каждого отдельного оптимизатора (а каждый оптимизатор может еще и несколько раз оказываться в одинаковых точках пространства), было решено разбить эксперимент на 3 этапа:
На первом этапе во время обучения кешируется куча всего, в том числе качество модели на валидационной и тестовой выборках и время обучения/теста модели. Обучение происходит в течение 20 эпох.
На втором этапе при попадании в очередную точку пространства мы просто подгружаем уже имеющееся у нас accuracy на валидации, учитывая потраченное на обучение время. Стоит отметить, что часто возникает ситуация, что оптимизатор приходит несколько раз в одну и ту же точку пространства. В таких случаях мы полагаем, что модель бы у нас уже была обучена, и не учитываем время обучения повторно.
На третьем этапе мы получаем уже закешированное качество конечной модели на тесте, учитывая время, потраченное на тест во время 1 этапа.
Рассмотренные фреймворки
В качестве бейзлайнов для сравнения я взял, собственно RandomSearch и GridSearch, написав их оптимизаторы собственноручно (см. github).
Для сравнения всех методов было решено отслеживать:
Помимо этого, я приведу плюсы и минусы каждого из фреймворков, выявленные мной в процессе экспериментирования с каждым из них, именно с точки зрения удобства, не качества решения задачи.
hyperopt
Судя по тому, что работа над фреймворком ведется аж с 2013 года при практически полном отсутствии документации, развивается он не слишком бойко (а, возможно, вообще доживает свой век). Также на сайте документации есть любопытная фраза: «Hyperopt has been designed to accommodate Bayesian optimization algorithms based on Gaussian processes and regression trees, but these are not currently implemented«, то бишь изначально запланированные алгоритмы так и не были реализованы. Также в документации есть про распараллеливание с помощью MongoDB, Apache Spark, но подробно в это не вникал.
Еще при инициализации пространства можно создавать «условные параметры», позволяя это пространства представлять в виде дерева: в зависимости от того, по какой ветви дерева пойдет алгоритм, на выходе будут разные виды гиперпараметров. Так можно, к примеру, перебирать не только гиперпараметры к конкретному классификатору, но и рассматривать разные классификаторы. В зависимости от выбранного классификатора будут перебираться разные группы гиперпараметров.
scikit-optimize
Из байесовских подходов есть только GP, но также реализованы методы на основе решающих деревьев. Хорошая документация (в стиле старшего брата scikit-learn), также есть несколько разобранных примеров и много примеров от других энтузиастов в интернете.
optuna
Наиболее молодой из представленных здесь фреймворков: статью о нем опубликовали в 2019 году. Хорошая документация. Помимо байесовских алгоритмов, есть возможность прунинга пространства гиперпараметров (удаления плохих точек из рассмотрения). По умолчанию удаляет точки, в которых модель дает качество ниже медианы из уже рассмотренных.
Результаты
Как видно, почти все оптимизаторы приходят в одну и ту же точку, в которой accuracy на валидации является максимальным (GridSearch иначе и не мог). При этом лучшее время показывает optuna: он более чем в 3 раза быстрее полного перебора и более, чем в 1.5 раза быстрее, чем hyperopt, несмотря на то, что в обоих случаях используется TPE и EI.
Стоит прокомментировать, почему я включил scikit-optimize дважды. Я экспериментировал со всеми функциями выбора. EIps и PIps, видимо, еще не реализованы ввиду вылетающего exception. Все остальные функции, кроме LCB, приходят в одинаковую точку, в которой качество на тесте выше, а качество на валидации ниже, чем у LCB. Тут следует напомнить, что наш оптимизатор работает с моделью как с черным ящиком. Цель оптимизатора заключается в нахождении точки пространства гиперпараметров, в которой соответствующая модель даст наибольшее качество именно на валидации. Поэтому то, что большинство функций выбора приводят алгоритм в точку пространства, где качество на тесте выше, является, скорее, результатом переобучения нейросети и ошибки оптимизатора scikit-optimize. Функция gp_hedge была выбрана как показавшая наилучшее время среди остальных, приходящих в ту же точку.
Дальше приведу несколько графиков. Под skopt подразумевается scikit-optimize (LCB), если что.
Как видно, все алгоритмы на первых итерациях ведут себя приблизительно одинаково. Поэтому рассмотрим изменение качества после 5 итерации.
Как можно увидеть, hyperopt одним из первых достигает наилучшей точки пространства. Однако посмотрим еще на зависимость общего времени, потраченного на обучение моделей от итерации.
Как видно из таблицы и из приведенного графика, hyperopt сильно проигрывает optuna по времени. Сначала я грешил на прунинг, но без него результат оказался идентичным. Судя по всему, TPE в hyperopt больше «разведывает» неизвестную область пространства, в связи с чем чаще натыкается на неизвестные ранее точки, следовательно, тратит больше времени на обучение. Думаю, можно подкрутить параметры как optuna в сторону exploration, так и hyperopt в сторону exploitation, но из коробки они работают так.
Выводы
Ситуация по результатам эксперимента несколько спорная, хотя перевес явно в сторону optuna. Также, по моим субъективным ощущениям, этот фреймворк явно выигрывает у hyperopt. Но посмотрим на них в сравнении.
Почему optuna?
Почему hyperopt?
Заключение
Надеюсь, мне удалось более-менее простым языком объяснить принцип работы оптимизаторов гиперпараметров. А если и не удалось, то я хотя бы разобрал несколько фреймворков. Код доступен на github.