Введение в интеграцию 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