Что такое поиск по гиперпараметрам?

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

Паттерны, которые изучает алгоритм машинного обучения, закодированы в весах (также называемых параметрами) модели. Однако алгоритм машинного обучения может применяться к разным типам данных, и даже для сценариев, в которых «тип» данных один и тот же, распределение данных может быть другим.

В качестве конкретного примера рассмотрим API классификатора опорных векторов (SVC) из scikit-learn.

Основываясь на изображении выше, вы можете понять, что поиск подходящей комбинации C, ядра, степени, гаммы и Coef0 для различных типов и распределений входного набора данных - нетривиальная задача.

Эти типы параметров (входные данные вашего алгоритма машинного обучения, например, C, ядро ​​и т. Д. В приведенном выше примере) называются гиперпараметрами, а задача их поиска называется поиском или настройкой гиперпараметров.

Что такое Microsoft NNI?

Microsoft NNI ((Neural Network Intelligence) - это набор инструментов AutoML с открытым исходным кодом для поиска нейронной архитектуры и настройки гиперпараметров.

Я понимаю настройку гиперпараметров, но что такое AutoML?

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

Поиск гиперпараметров. Сколько слоев, нейронов, ширины, глубины для моей нейронной сети? Какой должна быть C & гамма для моей SVM?

Поиск сетевой архитектуры (NAS). Какая комбинация слоев в нейронной сети может дать наилучшую производительность. Например. последняя ведущая сеть ImageNet под названием EfficientNet была обнаружена с использованием NAS. Я слишком упростил это определение, но, надеюсь, вы уловили суть!

Облачный AutoML. Облачный провайдер предоставляет услугу и говорит, что предоставьте мне свой набор обучающих данных и укажите задачу (классификация или регрессия), и я построю для вас модель. Иди домой и спи !. Это определение подразумевает, что большинство (если не все) аспекты типичного конвейера машинного обучения (нормализация данных, стандартизация, поиск подходящего алгоритма, оптимизация и т. Д.) Выполняются за вас. Это автоматизированное машинное обучение.

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

Один наивный подход к поиску гиперпараметров и архитектуры - попробовать значительное количество комбинаций и посмотреть, какая из них победит! …. Но ведь это было бы непродуктивно, не так ли? Вот почему проводятся исследования алгоритмов и методов, которые находят гиперпараметры для других алгоритмов машинного обучения.

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

Microsoft NNI называется набором инструментов, потому что

  • В нем уже реализованы многие из известных современных тюнеров, а также предоставляется среда для написания собственных.
  • Он обеспечивает поддержку для написания, выполнения, записи и визуализации ваших экспериментов.
  • Вы можете не только проводить свой эксперимент на локальных машинах, но и хорошо интегрироваться с различными системами оркестровки, такими как Kubeflow, OpenPAI и т. Д. Имеется достаточно точек расширяемости для интеграции с новыми или проприетарными платформами машинного обучения.
  • Он поддерживает большинство фреймворков машинного обучения (Tensorflow, PyTorch, MXNET, Chainer и т. Д.), А также библиотеки (scikit-learn, xgboost, lightgbm и т. Д.).

Таким образом, он предоставляет не только инструменты для запуска и визуализации, но также является расширяемым (и, следовательно, понятием структуры) для настройки.

Написание и проведение простого эксперимента NNI (пробная версия)

Несмотря на то, что в репозитории GitHub перечислены поддерживаемые фреймворки (Tensorflow, scikit-learn и т. Д.), Для большинства случаев использования Microsoft NNI не зависит от используемой вами структуры и даже от модели вашего обучения.

На изображении ниже показаны 3 типа файлов, которые используются при написании типичной пробной версии:

search-space.json файл используется для указания диапазонов гиперпараметров, которые вы ищете!

Вот пример кода, который вы в конечном итоге напишите.

В этом примере у вас есть модель SVC. Запуск пробной версии состоит из 4 шагов:

1) Вы загружаете свои данные.

2) Вы просите NNI предоставить вам параметры испытания.

3) Вы применяете параметры к своей обучаемой модели.

4) Вы возвращаете счет.

Основываясь на файле optimize_mode в config.yml (см. Ниже), тюнер поможет либо максимизировать, либо минимизировать оценку, предлагая попробовать следующий набор гиперпараметров модели.

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

В файле конфигурации вы также указываете путь к search_space.json и main.py.

Пора проводить эксперимент:

nnictl create --config <path_to>/config.yml

После выполнения вышеуказанной команды вы увидите ответ на терминале, который будет выглядеть следующим образом:

INFO: Starting restful server...
INFO: Successfully started Restful server!
INFO: Setting local config...
INFO: Successfully set local config!
INFO: Starting experiment...
INFO: Successfully started experiment!
--------------------------------------------------------------------
The experiment id is egchD4qy
The Web UI urls are: http://223.255.255.1:8080   http://127.0.0.1:8080
--------------------------------------------------------------------
You can use these commands to get more information about the experiment
--------------------------------------------------------------------
         commands                       description
1. nnictl experiment show        show the information of experiments
2. nnictl trial ls               list all of trial jobs
3. nnictl top                    monitor the status of running experiments
4. nnictl log stderr             show stderr log content
5. nnictl log stdout             show stdout log content
6. nnictl stop                   stop an experiment
7. nnictl trial kill             kill a trial job by id
8. nnictl --help                 get help information about nnictl
--------------------------------------------------------------------

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

Также есть возможность использовать команды (показанные выше) для получения статуса эксперимента и испытаний в самом терминале. Команды должны быть понятными.

scikit-learn конвейеры

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

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

На приведенной выше диаграмме компонентами являются масштабирование, уменьшение размерности, алгоритм обучения и прогнозная модель. Посмотрите, как эти компоненты реализуют fit, transform and predict методы.

Вы также можете реализовать собственный преобразователь или оценщик, если вы совместимы с интерфейсом.

Вот пример написания конвейеров с использованием Python:

На изображении выше показаны 2 конвейера -

а) make_svc_pipeline - нормализует данные и затем применяет SVC

б) make_pca_svc_pipeline - нормализует, PCA (для уменьшения яркости) и, наконец, SVC

Обратите внимание, как в обоих конвейерах я передаю все гиперпараметры (pca_components & svc_hparams) as входные параметры функции. Таким образом, я мог теперь получить их от NNI Tuners и передать их функциям.

Вот снимок экрана одной из вкладок веб-интерфейса пользователя NNI, на котором показаны различные комбинации, которые в конечном итоге пытался использовать тюнер.

Довольно крутая визуализация! Теперь я хотел написать конвейеры, которые состоят из других классификаторов, например, для вместо использования SVC я подумал о том, чтобы попробовать xgboost, lightgbm и т. д., однако я начал видеть, что для моей задачи процесс был довольно повторяющимся, т.е. для каждого эксперимента напишите config.yml, search-space.json and pipelines + entrypoint script to get the parameters from NNI Tuner, return the score and invoke the pipelines.

Разве не было бы замечательно еще больше упростить задачу поиска гиперпараметров для конвейеров scikit-learn с помощью Microsoft NNI?

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

Если вам интересно, как использовать этот пакет, продолжайте читать оставшуюся часть статьи.

scikit-nni: небольшой пакет python для автоматизации поиска гиперпараметров для конвейеров scikit-learn.

pip install scikit-nni

scikit-nni (https://github.com/ksachdeva/scikit-nni) - вспомогательный инструмент (и пакет), который:

  • Создает конфигурацию (config.yml и search-space.json), необходимую для NNI
  • Автоматически создает конвейеры scikit-learn на основе вашей спецификации и становится экспериментальным / пробным кодом для запуска Microsoft NNI

Особенности scikit-nni

  • Поиск гиперпараметров для конвейеров scikit-learn с помощью Microsoft NNI
  • Код для определения конвейеров не требуется
  • Встроенный считыватель источников данных для чтения файлов npz для классификации
  • Поддержка использования настраиваемых считывателей источников данных
  • Единый файл конфигурации для определения конфигурации NNI и пространства поиска

Пакет и то, как его использовать, очень хорошо документированы по адресу - https://github.com/ksachdeva/scikit-nni, так что ознакомьтесь с подробной документацией и примерами.

Вкратце, вот что вы в конечном итоге сделаете -

Вместо записи 3 (или более) файлов при использовании Microsoft NNI вы просто пишете один файл конфигурации. Пример этого -

Посмотрите, как search-space.json и config.yaml встроены в этот файл конфигурации. Они следуют тому же синтаксису и соглашению, что и Microsoft NNI, поэтому я не изобретаю новый синтаксис. Самая большая разница в том, что вместо написания кода на Python вы указываете конвейер scikit-learn в самом файле конфигурации. Прочтите комментарии в приведенном выше файле YAML.

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

После того, как вы написали этот файл конфигурации, выполните следующую команду:

sknni generate-experiment --spec example/pca_svc.nni.yml --output-dir experiments

и запустите свой эксперимент NNI, как обычно, т.е. теперь выполните следующую команду

nnictl create --config experiments/pca-svc-classification/config.yml

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

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

Заключительные замечания

  • Microsoft AutoML - действительно хорошо разработанное, расширяемое и документированное решение для AutoML (поиск по NAS и гиперпараметрам)
  • Благодаря NNI использование современных тюнеров теперь просто вопрос настройки, и вам не нужно искать и изучать, как использовать различные алгоритмы тюнера.
  • scikit-nni использует Microsoft NNI для автоматизации задачи поиска гиперпараметров без необходимости определения конвейеров и экспериментов в коде Python. Это также упрощает файл конфигурации, уменьшая количество файлов до 1 с согласованным синтаксисом.

scikit-nni очень новый, поэтому не стесняйтесь сообщать о любых проблемах (https://github.com/ksachdeva/scikit-nni), с которыми вы можете столкнуться, и идеях по его дальнейшему улучшению. Взносы всегда приветствуются!