Авторы: Фредерик Паради, Давид Бошемин, Матьё Годбо, Жан-Самуэль Лебёф, Франсуа Лавиолетт

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

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

Легкая платформа для более быстрого прототипирования

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

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

В основе платформы Poutyne лежит класс модели (выделен голубым цветом), который инкапсулирует сеть PyTorch вместе с ее оптимизатором и функцией потерь. Объединяя эти элементы вместе, класс Model теперь позволяет вам приспособить сеть к загрузчику данных или делать прогнозы с помощью одной строчки кода. Более того, модель Poutyne полностью совместима с NumPy: все входные данные и выходные прогнозы могут быть массивами NumPy.

Чтобы избежать потери гибкости, которую может вызвать такая инкапсуляция, Poutyne полагается на систему подключаемых объектов с именем Callbacks (светло-фиолетового цвета). Эти объекты, которые могут быть добавлены и удалены по желанию, вызываются в соответствующий момент в цикле обучения и могут быть настроены по желанию в соответствии с нашими потребностями. Например, обратные вызовы могут использоваться для создания контрольных точек модели после каждой эпохи или для регулировки скорости обучения. Обратные вызовы обсуждаются более подробно позже.

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

Давайте посмотрим, как можно обучить базовую сеть PyTorch на наборе данных MNIST, используя (1) чистый PyTorch, (2) класс Poutyne Model и (3) класс Poutyne Experiment. Здесь мы опускаем код, который используется всеми реализациями, и сосредотачиваемся только на различиях цикла обучения.

Более того, у Poutyne есть забавный побочный эффект автоматической регистрации прогресса в консоли:

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

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

Управление метриками

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

Poutyne декларативно упрощает использование метрик: вы определяете свои метрики, передаете их Poutyne, а он заботится о вычислениях и использовании их в нужные моменты. В самом деле, как вы увидите в следующем разделе, обратные вызовы в Poutyne могут выполнять действия на основе значений показателей. А пока давайте посмотрим, как метрики определяются и используются в Poutyne.

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

Например, в задаче классификации вы можете вычислить точность каждого пакета и усреднить пакеты за эпоху, чтобы получить точность для всей эпохи. Однако этот трюк не работает с такими показателями, как оценка F1, которая вычисляется с помощью комбинации количества истинных / ложных положительных / отрицательных результатов. Таким образом, в Poutyne точность - это пакетный показатель, тогда как F1-оценка - это показатель эпохи.

Именно в классах Model и Experiment, обсуждавшихся в предыдущем разделе, вы сообщаете Poutyne желаемые метрики. Вот пример с метрикой пакетной точности и метрикой эпохи F1, пока мы на ней.

Как видите, вы легко можете получить значение потерь, точность и оценку F1 на тестовом наборе. В примере используются предопределенные строки, но можно определить свои собственные метрики через интерфейс, предложенный Poutyne:

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

Вставка промежуточных шагов в обучающий цикл

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

Допустим, вы хотите обучать большую модель в течение нескольких дней на сервере и хотите контролировать ее, не глядя постоянно, чтобы знать, когда обучение закончено. Вы придумываете «простое» решение: отправить себе сообщение электронной почты после любой эпохи. Вы пытаетесь вручную добавить код в цикл обучения, чтобы отправить это сообщение, но вы не уверены, принадлежит ли он ему или нет, и, что еще хуже, вы возвращаетесь к своему коду через месяц и даже не помните, для чего была эта строка. Ваши намерения были хорошими, но казнь была болезненной. Все, что вам нужно, это предупреждение в начале и в конце тренировки и каждые N шагов.

Обратные вызовы Poutyne - это классы, которые вызываются в определенный момент во время обучения, например, в начале или в конце эпохи. Это означает, что вы можете сосредоточиться на определении нужной логики вместо того, чтобы находить все места, в которых она должна быть вызвана в вашем коде; Путин сделает это за вас. Обратные вызовы делают Poutyne более гибким без необходимости усложнять код. Они также позволяют вам получать доступ к значениям метрик в заданное время (например, после каждого пакета обучения), позволяя вам определять логику с этой информацией (например, ранняя остановка). Давайте посмотрим, как будет выглядеть обратный вызов оповещения о тренировке:

Но не обязательно реализовывать все необходимые обратные вызовы; Poutyne предлагает множество обратных вызовов, таких как контрольные точки, ведение журнала, отсечение градиента, ранняя остановка, отслеживание градиента и многое другое. Более подробный список можно найти в документации.

Заключение

Мы представили некоторые из многочисленных функций Poutyne, которые позволяют писать более качественный и эффективный код PyTorch. Полные примеры можно найти на веб-сайте Poutyne.

Poutyne используют сотни людей по всему миру. Мы активно улучшаем Poutyne и добавляем новые функции. Поскольку это проект с открытым исходным кодом, любой желающий может присоединиться к нам в нашем общедоступном репозитории GitHub.