MXNet + Optuna!

Optuna - это среда оптимизации гиперпараметров, применимая к средам машинного обучения и решателям оптимизации черного ящика. MXNet - это среда машинного обучения с открытым исходным кодом для гибкого исследовательского прототипирования и производства. Посмотрим, как они могут работать вместе!

Создание целевой функции

Optuna - это оптимизатор черного ящика, что означает, что ему нужна функция objective, которая возвращает числовое значение для оценки производительности гиперпараметров и принятия решения о том, где проводить выборку в предстоящих испытаниях.

В нашем примере мы будем делать это для идентификации символов MNIST. В этом случае функция objective выглядит так:

Обратите внимание, что функции objective передается специальный аргумент Optuna trial. Этот объект передается в функцию objective, чтобы указать, какие гиперпараметры следует настроить. Это возвращает accuracy модели, которая используется Optuna в качестве обратной связи о производительности испытания.

Определение гиперпараметров для настройки

Optuna позволяет вам определять виды и диапазоны гиперпараметров, которые вы хотите настроить, непосредственно в вашем коде с помощью объекта trial. Это экономит усилия на изучении специализированного синтаксиса для гиперпараметров, а также означает, что вы можете использовать обычный код Python для циклического перебора или определения гиперпараметров.

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

Для определения самой модели Optuna использует активный режим, чтобы позволить обычному циклу Python определять количество слоев и узлов в каждом слое с trial.suggest_int(“n_layers”, 1, 3) для слоев и num_hidden = int(trial.suggest_loguniform(“n_units_1{}”.format(i), 4, 128)) для количества скрытых узлов в каждом слое. suggest_loguniform используется для изменения числа на порядки.

Оптимизатор выбирается из optimizer_name = trial.suggest_categorical(“optimizer”, [“Adam”, “MomentumSGD”]), который выбирает среди оптимизаторов Adam и Momentum Stochastic Gradient Descent.

Скорость обучения для этих оптимизаторов различается на порядки, поэтому используется weight_decay = trial.suggest_loguniform(“weight_decay”, 1e-10, 1e-3), который изменяет значения логарифмически от 10 ^ -10 до 0,001.

Проведение испытаний

Сэмплер по умолчанию в программе оценки Parzen с древовидной структурой Optuna (TPE), которая является формой байесовской оптимизации. Optuna использует TPE для более эффективного поиска, чем случайный поиск, выбирая точки, близкие к предыдущим хорошим результатам.

Чтобы запустить испытания, создайте объект study, чтобы задать направление оптимизации (maximize или minimize). Затем запустите объект study с study.optimize(objective, n_trials=100, timeout=600), чтобы выполнить сто испытаний с таймаутом в десять минут.

Каждое испытание выбирается после оценки всех испытаний, которые были выполнены ранее, с использованием TPEsampler, чтобы делать умные предположения, где можно найти лучшие значения гиперпараметров. Лучшие значения из испытаний можно получить через study.best_trial. Также доступны другие методы просмотра испытаний, такие как форматирование во фрейме данных.

Обрезка - раннее прекращение плохих испытаний

Сокращение проб - это форма ранней остановки, которая завершает бесперспективные испытания, чтобы время вычислений можно было использовать для испытаний, которые показывают больший потенциал. Чтобы выполнить обрезку, необходимо еще немного открыть черный ящик функции Objective, чтобы периодически получать информацию о том, как испытание продвигается в Optuna, чтобы он мог сравнивать прогресс с ходом других испытаний и решать, нужно ли чтобы остановить испытание на раннем этапе и предоставить метод получения метода от Optuna, когда испытание должно быть прекращено, а также разрешить завершение испытания во время сеанса без ошибок после записи результатов. К счастью, Optuna обеспечивает интеграцию для MXNet (MXNetPruningCallback) обрезки, которая предоставляет все эти функции.

Эта интеграция передается как eval_end_callback во время подгонки модели для обрезки. Аргумент eval_metric функции MXNetPruningCallback может ссылаться на MXNet, например, accuracy или loss.

В будущее и за его пределы!

Для тех, кому интересно, Optuna имеет множество других функций, включая визуализацию, альтернативные семплеры, оптимизаторы и алгоритмы сокращения, а также возможность создавать пользовательские версии. Если у вас есть дополнительные вычислительные ресурсы, Optuna предоставляет простой интерфейс для параллельных испытаний, чтобы увеличить скорость настройки.

Попробуйте Оптуна!

В этом сообщении используются MXNet v1.6.0 и optuna v1.3.0.