Введение в интеграцию Optuna для AllenNLP.
TL; DR
- Интеграция AllenNLP,
AllenNLPExecutor
, была добавлена в Optuna, что позволяет пользователям повторно использовать файл конфигурации AllenNLP Jsonnet для оптимизации гиперпараметров. - Мы продолжим улучшать интеграцию AllenNLP (например, поддержку Optuna Pruning API). Это позволяет пользователям обучать модель с помощью некоторых сложных алгоритмов, таких как Hyperband.
- Образец, который я сделал для демонстрации в этой статье, доступен на GitHub. Пожалуйста, проверьте это!
Вступление
В этой статье я расскажу, как использовать Optuna, библиотеку оптимизации гиперпараметров, для оценки гиперпараметров модели, реализованной с помощью AllenNLP, библиотеки нейронной сети для обработки естественного языка.
Optuna
Optuna - это библиотека для оптимизации гиперпараметров, обеспечивающая гибкость в оптимизации гиперпараметров в машинном обучении. В Optuna есть множество алгоритмов поиска гиперпараметров, в том числе Древовидная оценка Parzen (TPE) [1], Стратегия развития CMA (CMA-ES) [2] и Многоцелевая оптимизация [3].
В Optuna мы определяем целевую функцию для оптимизации гиперпараметров. Ниже показан простой пример.
Пространства поиска параметров определяются с помощью предлагаемых API. Передача целевой функции методу study.optimize
заставляет Optuna начать оптимизацию гиперпараметров. Для получения дополнительной информации ознакомьтесь с руководством:
AllenNLP
AllenNLP - это библиотека для обработки естественного языка с использованием нейронных сетей. Он разработан Институтом искусственного интеллекта Аллена. Они представили доклад и учебник на ведущих конференциях по НЛП, которые полезны для исследования НЛП. Кроме того, в Интернете доступны различные учебные пособия и демонстрации, позволяющие новичкам испытать передовые методы НЛП.
Существует два способа реализации модели с использованием AllenNLP: (а) написание скрипта Python и его непосредственное выполнение и (б) подготовка файла конфигурации, написанного на Jsonnet и запускаемого с помощью интерфейса командной строки allennlp. В этой статье рассказывается о последнем. Если вы хотите использовать Optuna в своих скриптах Python, см. Официальный образец на GitHub.
Используя файл конфигурации Jsonnet, пользователи могут обучать модели, только записывая конфигурации для экспериментов. Это избавляет от необходимости писать сценарий для обучения модели и позволяет пользователям сосредоточиться на архитектуре своей модели, гиперпараметрах и конфигурации обучения.
Одним из самых известных инструментов оптимизации гиперпараметров для AllenNLP является AllenTune. AllenTune поддерживает оптимизацию с использованием файла конфигурации в стиле Jsonnet. AllenTune поддерживает простые алгоритмы случайного поиска и поиска по сетке для параметров поиска. Пользователь может оптимизировать, внеся несколько изменений строки в существующий файл Jsonnet, чтобы определить пространство поиска.
Optuna + AllenNLP
Для AllenNLP обычно гиперпараметры определяются с помощью файла Jsonnet, тогда как Optuna определяет гиперпараметры, которые необходимо оптимизировать, написав скрипт Python. Чтобы восполнить этот пробел, мы создали AllenNLPExecutor
, позволяющий определять диапазоны гиперпараметров Optuna в файле AllenNLP Jsonnet.
AllenNLPExecutor
выполняет оптимизацию параметров следующим образом.
- Отредактируйте файл конфигурации в формате Jsonnet и замаскируйте гиперпараметры с помощью
std.extVar
. - Примеры параметров из области поиска, определенной с помощью API подсказок Optuna и настройки файлов Jsonnet для создания объекта Params для AllenNLP.
- Передайте объект
Params
вallennlp.commands.train.train_model
и выполните обучение модели.
Подробные сведения о реализации см. В запросе на вытягивание.
Раньше было бы необходимо создать модуль для каждого проекта, чтобы сделать вышеупомянутое. Но теперь, с AllenNLPExecutor
, вы можете оптимизировать гиперпараметры с меньшими усилиями. PR был объединен и доступен с версии 1.4.0, выпущенной 11 мая.
AllenNLPExecutor Демонстрация
Задача: IMDb
Чтобы продемонстрировать интеграцию с AllenNLP компании Optuna, мы проанализируем эмоциональный анализ данных обзора IMDb [3]. Набор данных IMDb содержит 20000 обучающих данных и 5000 тестовых данных, каждая запись содержит отзыв для фильма или телешоу и метку, указывающую, был ли отзыв положительным или отрицательным. В этом случае задача состоит в том, чтобы предсказать, будет ли отзыв положительным или отрицательным, на основе текстовой информации в теле обзора.
Подготовка
Если вы создаете файл конфигурации в формате Jsonnet с помощью AllenNLP, он будет выглядеть следующим образом. Конфигурационный файл и параметры основаны на официальном образце AllenTune. Значение параметра по умолчанию - это медианное значение каждого пространства параметров, определенного в официальном образце. Мы называем эту модель базовой.
Во-первых, замаскируйте значения гиперпараметров в конфигурации Jsonnet с помощью метода Jsonnet, вызывающего std.extVar('{param_name}')
с std.parseInt
для целых чисел или std.parseJson
для чисел с плавающей запятой. [отредактировано в 2020/07/28: используйте std.parseInt
или std.parseJson
для преобразования параметров в требуемые типы значений.]
Итоговая конфигурация будет следующей:
Теперь, когда вы создали конфигурацию, вы можете определить пространство поиска в Optuna. Обратите внимание, что имена параметров такие же, как те, что были определены ранее в конфигурации. Целевая функция выглядит следующим образом.
Как только мы определили область поиска, мы передаем пробный объект AllenNLPExecutor
. Пора создавать executor
! AllenNLPExecutor
принимает trial
, путь к конфигурации, путь к моментальному снимку и целевую метрику для оптимизации в качестве входных аргументов (executor = AllenNLPExecutor(trial, config, snapshot, metric)
). Затем давайте запустим executor.run
, чтобы начать оптимизацию. На каждом пробном этапе оптимизации вызывается objective
, который выполняет следующие шаги: (1) обучает модель (2) получает целевую метрику по данным проверки (3) возвращает целевую метрику.
В конце концов, создание study
и study.optimize
запускает оптимизацию параметров.
Полученные результаты
Результаты оптимизации гиперпараметров показаны ниже. Метрика оценки - это процент правильных ответов в данных проверки. Baseline
- это та модель, которую я описал в разделе подготовки. Optuna+AllenNLP
- результат оптимизации с AllenNLPExecutor
. Мы провели оптимизацию пять раз с изменением начальных значений и рассчитали среднюю точность. Поскольку базовая линия обучается с фиксированными гиперпараметрами, средняя точность остается постоянной при повторных испытаниях. В результате оптимизации с использованием Optuna мы видим, что средняя точность улучшается с увеличением количества попыток. В итоге точность улучшилась в среднем примерно на 2,7 балла по сравнению с использованием исходных гиперпараметров.
В Optuna также есть функция дампа файла конфигурации с оптимизированными гиперпараметрами. Вызов dump_best_config
, указав путь к конфигурации, путь к выходной конфигурации и study
уже оптимизированный.
Пример вывода dump_best_config
выглядит следующим образом. Вы можете видеть, что значения параметров, таких как dropout
и embedding_dim
, замаскированные с помощью std.extVar
, перезаписываются фактическими значениями. Кроме того, выходной файл можно передать непосредственно команде. Это позволяет пользователю заново изучить модель с оптимизированными параметрами.
Заключение
В этой статье я представил, как объединить AllenNLP и Optuna, библиотеку нейронной сети для обработки естественного языка, для оптимизации гиперпараметров, что легко использовать с несколькими модификациями файла Jsonnet AllenNLP. В качестве демонстрации я работал над анализом полярности данных обзора IMDb.
Образец, который я сделал для этой демонстрации, доступен на GitHub. Если вы хотите запустить образец, попробуйте его!
использованная литература
[1] Алгоритмы оптимизации гиперпараметров
[2] Стратегия развития CMA: Учебное пособие
[3] Изучение векторов слов для анализа настроений
[4] Hyperband: новый бандитский подход к оптимизации гиперпараметров n