Настройка гиперпараметров является важной частью процесса машинного обучения. Читайте дальше, чтобы узнать о некоторых эффективных и интуитивно понятных методах.

В алгоритмах машинного обучения есть два вида параметров — параметры модели и гиперпараметры. Параметры модели изучаются в процессе обучения, например, веса нейронной сети. Гиперпараметры используются для управления тренировочным процессом; следовательно, они должны быть установлены до начала обучения. Некоторыми примерами гиперпараметров в глубоком обучении являются скорость обучения и размер пакета. Одна проблема, которую упускают из виду многие специалисты по машинному обучению, заключается в том, как именно установить эти гиперпараметры. Неспособность выполнить качественную настройку гиперпараметров может свести на нет всю вашу тяжелую работу по построению модели. К счастью, существует общий эвристический подход к выбору гиперпараметров. Для более сложных ситуаций также существуют методы автоматического выбора гиперпараметров. В этой статье мы обсудим оба.

Общий подход к выбору гиперпараметров

Хороший способ думать о выборе гиперпараметров — думать в контексте емкости модели. Под емкостью модели мы подразумеваем, в широком смысле, количество функций, которые может представлять наша модель. В идеале мы хотим выбрать гиперпараметры так, чтобы мощность нашей модели соответствовала рассматриваемой проблеме. Другими словами, нам нужны гиперпараметры, которые избегают недообучения или переобучения. Это легко увидеть визуально. Если бы вы построили график с ошибкой теста по оси Y и значением одного гиперпараметра по оси X, в большинстве случаев вы бы получили что-то вроде этого:

Слишком маленький или слишком большой гиперпараметр соответствует либо слишком большой, либо слишком маленькой емкости модели, что приводит к высокой ошибке теста. Поэтому, чтобы задать гиперпараметр оптимальным образом, нам нужно понять, какое влияние конкретное значение этого гиперпараметра оказывает на емкость модели.

Давайте посмотрим на пример этого рассуждения в действии. Одним из распространенных гиперпараметров является количество узлов в нейронной сети. Связь между количеством узлов и емкостью модели довольно очевидна — чем больше узлов, тем больше емкость модели, и наоборот. если мы подозреваем, что наша модель переобучается, например, если мы замечаем очень низкую ошибку обучения, но значительную ошибку теста, мы знаем, что емкость модели, вероятно, слишком велика. Поэтому нам нужно уменьшить количество узлов в нейронной сети. Если мы видим недообучение — возможно, если и обучающий, и тестовый набор имеют высокие ошибки — мы знаем, что емкость модели слишком мала, и что нам следует увеличить количество узлов.

Теперь рассмотрим еще один распространенный гиперпараметр — коэффициент снижения веса. Снижение веса — это форма регуляризации нейронных сетей, которая, как следует из названия, уменьшает веса. Влияние коэффициента затухания веса также довольно очевидно — чем выше коэффициент затухания, тем меньше становятся веса и тем меньше будет вместимость модели. Следовательно, если мы подозреваем переоснащение, мы должны увеличить коэффициент затухания, а если мы подозреваем недообучение, мы должны его уменьшить.

Однако бывают ситуации, когда неясно, как гиперпараметр влияет на емкость модели. Скорость обучения в глубоком обучении является одним из таких примеров. В этих ситуациях мы можем использовать методы автоматической настройки гиперпараметров.

Два автоматических метода: поиск по сетке и случайный поиск

Обоснование этих автоматических методов простое. Начнем с простого случая, когда наша модель имеет только один гиперпараметр. Предположим, что мы знаем, что разумные значения этого параметра лежат между 0 и 1 (например, эпсилон в задачах обучения с подкреплением). Мы хотим попробовать некоторые значения, чтобы увидеть, какое из них лучше. Самое очевидное, что нужно сделать, это попробовать что-то вроде [0, 0,2, 0,4, 0,6, 0,8, 1] или [0, 0,33, 0,66, 1]. Эта идея поиска значений через равные промежутки называется поиск по сетке. Если у нас есть несколько гиперпараметров, мы попробуем каждую комбинацию равномерно распределенных отдельных параметров. Например, у нас может быть два параметра, и мы хотим попробовать значения [0, 1, 2] для каждого. Тогда наш поиск по сетке должен будет попробовать (0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2). Поиск по сетке также можно выполнять в логарифмическом, а не в линейном масштабе, например [0, 10^(-3), 10^(-2), 10^(-1), 1].

Одна из проблем с поиском по сетке заключается в том, что количество комбинаций, которые нам нужно попробовать, экспоненциально зависит от количества гиперпараметров. Следовательно, поиск по сетке займет много времени, если у нас будет больше нескольких гиперпараметров. Также возможно, что не все гиперпараметры действительно влияют на модель. Если это так, то поиск по сетке не только занимает вечность, но и тратит много времени на просмотр изменений в гиперпараметрах, которые не влияют на производительность.

Случайный поиск решает обе эти проблемы. Случайный поиск работает в два этапа. Во-первых, мы определяем предельное распределение для каждого гиперпараметра. Затем мы берем случайные значения из комбинированного распределения и выбираем лучшее. Случайный поиск позволяет избежать экспоненциальной проблемы времени выполнения — он исследует одно и то же пространство благодаря своей случайности. Это также позволяет избежать проблемы потери времени — из-за своей случайности случайный поиск не будет тратить время на одно и то же значение конкретного гиперпараметра (что может вообще не повлиять на модель).

На эмпирическом уровне кажется, что эти улучшения дают случайному поиску преимущество перед гирд-поиском. Поэтому, если вы хотите использовать автоматический метод выбора гиперпараметров, я предлагаю случайный поиск вместо поиска по сетке.

Я надеюсь, что эта статья дала вам больше информации о том, как настраивать гиперпараметры. Многие гиперпараметры можно настроить, просто подумав о том, как этот гиперпараметр влияет на емкость модели. Гиперпараметры со сложным влиянием на емкость модели (например, скорость обучения) или большие комбинации гиперпараметров можно настроить с помощью автоматических методов, как указано выше. Моя рекомендация для таких ситуаций — случайный поиск.

Пожалуйста, не стесняйтесь оставлять любые вопросы/комментарии. Спасибо за чтение!