Десять паттернов и антипаттернов в экспериментах с глубоким обучением

Идеальные и неудачные эксперименты с глубоким обучением 10 паттернов и антипаттернов

Изображение, созданное DALL-E 3 на основе указаний автора.

Введение

В этой статье я представляю список паттернов и антипаттернов, которые я собрал за 10 лет опыта в качестве инженера глубокого обучения. Разработка глубокого обучения – это всё об экспериментах. Создание первой минимально жизнеспособной продукции обычно происходит очень быстро. В то же время, основная часть жизненного цикла проекта по глубокому обучению занимает итеративное улучшение кода и метрик/показателей. Большинство улучшений оказываются незначительными и выясняются только благодаря обширным экспериментам. В моей практике только один из пяти или даже один из десяти экспериментов позволяет повысить показатель. Важно оптимизировать процесс экспериментирования, особенно при работе в команде.

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

Паттерны и антипаттерны

#1 Надёжность результатов

Изображение, созданное DALL-E 3 на основе указаний автора.

Антипаттерн:

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

Паттерн:

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

#2 Желаемое мышление

Изображение, созданное DALL-E 3 на основе указаний автора.

Антипаттерн:

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

Паттерн:

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

#3 Затенение регрессии

Изображение, созданное DALL-E 3 на основе указаний автора.

Антипаттерн:

Внесение нескольких изменений набором, которые, по мнению исследователя, все улучшают метрику. Может проявиться затенение регрессии, то есть изменение А приводит к незначительной регрессии, тогда как изменение Б приводит к значительному прогрессу. В совокупности два изменения могут показать улучшение метрики. В этом случае незначительная регрессия будет скрыта значительным улучшением. Однако вы хотите изменения, которые приводят к улучшению, а не изменения, которые ухудшают метрику.

Шаблон:

Измеряйте изменения отдельно. Если у вас есть два потенциальных улучшения в уме, выполняйте их отдельно:

  1. Изменение A
  2. Изменение B
  3. Изменения A и B вместе

Это избавит от возможности регрессии.

#4 Условия

изображение сгенерировано DALL-E 3 по запросу автора.

Антипаттерн:

Запуск обучения из рабочей копии Git. В этом случае не будет возможности повторить эксперимент в будущем или проанализировать точные различия между экспериментами.

Шаблон:

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

#5 Быстрый цикл

изображение сгенерировано DALL-E 3 по запросу автора.

Антипаттерн:

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

Шаблон:

Поддержание быстрой версии цикла обучения. Быстрая версия должна быть в 2-10 раз быстрее и способна отражать эффект изменений, находящихся под оценкой. Часто быстрая версия имеет меньшее количество итераций для обучения и более быструю нейронную сеть меньшего размера. Быстрая версия может выступать как интеграционное тестирование и быстрый способ оценки потенциала изменений.

#6 Без веток

изображение сгенерировано DALL-E 3 по запросу автора.

Антипаттерн:

Не использовать ветки для отдельных функций и сохранять все изменения в основной ветке.

Шаблон:

Иметь отдельную ветку для каждого изменения. Хранение изменений в разных ветках позволит избежать слияния кода, который показывает регрессию, чтобы код не был перегружен опциями, режимами и блоками if-else. Иногда требуется усилие разума, чтобы удалить много кода, поддерживающего эксперимент, который, к сожалению, не показывает прогресса.

#7 Привычки при написании кода

изображение сгенерировано DALL-E 3 по запросу автора.

Антипаттерн:

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

Шаблон:

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

#8 Неинвазивный

Изображение, созданное DALlog 3 по соображениям автора.

Антипаттерн:

Внесение “инвазивных” изменений и их слияние. Под инвазивными изменениями я понимаю изменения, которые влияют на поведение других режимов, даже если они улучшают целевой режим. Рассмотрим следующий пример. В коде поддерживается обучение двух нейронных сетей: сети X и сети Y. Обучение на каждой сети является отдельным режимом. Вы хотите изменить коэффициент обучения для сети X, чтобы улучшить ее показатель. Вы меняете коэффициент обучения для обоих режимов, запускаете эксперимент для сети X и наблюдаете улучшение показателя. Слияние кода “как есть” является антипаттерном, так как коэффициент обучения меняется и для сети Y, для которой эксперимент не был проведен, и может привести к регрессии.

Паттерн:

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

#9 Повторный запуск базового уровня

Изображение, созданное DALlog 3 по соображениям автора.

Антипаттерн:

Использование старого исторического значения базового показателя и сравнение новых результатов эксперимента с ним.

Паттерн:

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

  1. Проведение экспериментов на разных компьютерах
  2. Обновление программного обеспечения: CUDA-инструменты, пакеты conda
  3. Базовый уровень и эксперименты запускались разными участниками команды, у которых могут быть разные неофициальные способы запуска экспериментов.

#10 Версионирование метрик

Изображение, созданное DALlog 3 по соображениям автора.

Антипаттерн

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

Паттерн

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

Заключение

Изображение, созданное DALlog 3 по соображениям автора.

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