Недавно я участвовал в конкурсе по Kaggle, в котором стояла задача обучить генеративную состязательную сеть (GAN) на наборе данных Stanford Dogs для создания новых невидимых изображений собак. Это был первый онлайн-конкурс, в котором я когда-либо участвовал.

Сети GAN были в тренде с момента их внедрения, а также дали потрясающие результаты. Я читал о них, а также реализовал несколько простых архитектур на наборе данных MNIST, чтобы проверить свои знания, но у меня никогда не было возможности глубоко погрузиться в них и лучше понять. Поэтому, когда я наткнулся на этот конкурс, я знал, что должен участвовать, и после участия в конкурсе я многое узнал о GAN.

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

Повышающая дискретизация против транспонированной свертки:

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

Входной шум:

Генератор принимает шум на входе, и, к моему удивлению, размер вектора шума также повлиял на результаты. Первоначально я использовал 100 в качестве размера вектора шума, но когда я изменил его на 128 и 256, мои результаты стали лучше, а также увеличилась скорость обучения.

Размер партии:

Самая большая ошибка, которую я делал изначально, когда начинал, заключалась в использовании очень большого значения для размера партии. Во время обучения GAN используйте размер пакета, меньший или равный 64. Использование большего размера пакета может снизить производительность, потому что во время начального обучения дискриминатор может получить много примеров для обучения, и он может перегрузить генератор, который будет иметь отрицательно сказывается на тренировках. Для меня лучше всего сработало использование партий размером 8 и 16 штук.

Функции потерь:

Функция потерь играет огромную роль в процессе обучения, и исследователи экспериментируют с различными настраиваемыми функциями потерь, которые будут использоваться при обучении GAN. Я начал с простой функции binary_crossentropy loss, которая дала неплохие результаты. Затем я опробовал функцию потерь Вассерштейна, которая используется в статье WGAN, и это немного улучшило результаты. Во время конкурса большинство участников, казалось, использовали функцию потерь RaLS (Relativistic Average Least Square), но, несмотря на многие усилия, мне не удалось заставить ее работать в Tensorflow. Вывод из этого момента: попробуйте различные функции потерь, которые могут помочь.

Излишняя тренировка может повредить:

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

Свернуть режим:

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

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

Другие советы:

Существует также репозиторий GAN Hacks, в котором собрано множество других техник, которые вы можете использовать, и большинство из них помогли мне быстрее сойтись и достичь лучших результатов. Еще несколько компонентов, с которыми вы можете поэкспериментировать:

  1. Архитектура вашей GAN - это самое главное. Вы можете почерпнуть вдохновение из различных известных сетей GAN и реализовать свою собственную версию.
  2. Хотя большинство GAN используют оптимизатор ADAM для обучения, не бойтесь попробовать старый добрый оптимизатор градиентного спуска.
  3. Для функций активации вместо простого ReLU вы можете опробовать другие его варианты, такие как Leaky ReLU, ELU (экспоненциальная линейная единица) или PReLU (параметрическая выпрямленная линейная единица).
  4. Вы также можете использовать различные техники увеличения изображения во время тренировки.

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