Фон

Генеративно-состязательные сети (GAN) способны генерировать высококачественные изображения; однако разрешение сгенерированных изображений остается относительно небольшим. Было много попыток решить эту проблему. Например, ProGAN обучает GAN с высоким разрешением в настройках одного класса путем итеративного обучения на наборе возрастающих разрешений. Тем не менее, обучение модели по-прежнему нестабильно, несмотря на большое количество исследований, в которых изучались и предлагались улучшения.

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

Крупномасштабное обучение GAN для высокоточного синтеза естественного изображения, 2018.

Большинство улучшений было сделано за счет изменения целевой функции или ограничения модели дискриминатора во время обучения.

Совсем недавно было обнаружено, что масштабирование моделей GAN довольно хорошо работает для создания как высококачественных, так и больших изображений.

Выводы из масштабирования GAN

Авторы предоставляют информацию о классе Генератору с условным классом BatchNorm, как показано на изображении (подрисунки (a) и (b)) выше, и Дискриминатору с проекцией.

Они также используют ортогональную инициализацию вместо классической инициализации Xavier или N(0, 0,02I). Статистика BatchNorm в G вычисляется для всех устройств, а не для каждого устройства, что является типичным сценарием. Они отмечают, что прогрессивный рост, как ProGAN, не нужен.

  1. Простое увеличение размера пакета в 8 раз повысило их производительность с точки зрения начальной оценки (IS) на 46 %. Они объясняют это тем, что он обеспечивает лучшие градиенты для обеих сетей. Кроме того, они достигли лучшей конечной производительности за меньшее количество итераций.
  2. Затем они увеличивают количество каналов в CNN в каждом слое на 50% (что означает, что количество параметров почти удваивается). Это привело к улучшению IS на 21%.
  3. Обратите внимание на приведенный выше рисунок, что вложения классов являются общими и используют отдельные линейные слои для соответствия каждому слою BatchNorm. Это значительно снижает стоимость вычислений и повышает скорость обучения на 37%.
  4. Обратите внимание, что вектор шума z разбивается на один фрагмент для каждого ResBlock и объединяется с встраиванием класса c. Это дало небольшое улучшение на 4%.

Кроме того, если вам интересно, что такое нелокальный блок, вот схема

Трюк с усечением

Авторы обнаружили, что использование моделей, обученных с z~N(0, I), и выборка из усеченной нормали повышают IS и FID. Трюк с усечением: усечение вектора z путем повторной выборки значений, величина которых превышает выбранный порог. Это приводит к лучшему качеству изображений за счет общего разнообразия образцов. Чем меньше порог, тем меньше разнообразие выборки.

где W — весовая матрица, а бета — гиперпараметр, равный 1e-4.

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

АРХИТЕКТУРНЫЕ ДЕТАЛИ

Есть две версии модели, описанные BigGAN и BigGAN-deep, последняя включает более глубокие модули ResNet и не требует разделения по оси z.

Я снова привожу этот рисунок, чтобы лучше понять архитектуру. Как мы видим, ResBlocks изменены, но отдельные модули должны быть вам знакомы. Также обратите внимание, что ResBlock для D отличается от G тем, что количество фильтров в первом сверточном слое каждого блока равно количеству выходных фильтров. Вектор шума z разбивается по размерности канала на фрагменты одинакового размера. Мы видим, что каждый фрагмент объединяется с встраиванием класса.

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

Говорящий код

Я взял коды из следующего репо:



Также все коды написаны на Pytorch.

Мы видим, что вектор шума z сначала разбивается на фрагменты одинакового размера. Сначала мы берем самый первый фрагмент (zs[0]) в качестве входных данных, а остальные фрагменты используются для конкатенации с условным вектором нашего класса y. После этого мы перебираем наш ResBlock (self.blocks), а также конкатенированные векторы и передаем наши параметры. Конечный результат получается путем прохождения через batchnorm-relu-conv и tanh. Выглядит довольно просто, правда?

Это прямая функция ResBlock для Генератора. Это выглядит довольно ясно. Посмотрите, как мы передаем объединенный вектор y в наши блоки BatchNorm.

Теперь давайте посмотрим, что происходит внутри наших блоков BatchNorm. Мы видим, что наш объединенный вектор y передается в self.gain и self.bias, которые являются просто линейными слоями. Таким образом, вектор y линейно проецируется для получения усиления и смещений для каждой выборки для слоев BatchNorm блока. Проекции смещения центрированы по нулю, а проекции усиления — по центру 1. Поэтому мы добавляем 1 после применения self.gain. Наконец, после того как мы нормализуем входные данные x, мы умножаем их на вычисленное усиление и добавляем смещение.

Несколько последних слов

Надеюсь, я помог кому-то лучше понять концепции BigGAN. В любом случае, мои статьи предназначены только для того, чтобы познакомить вас с концепциями. Вы всегда можете прочитать статью и, конечно же, получить из нее более подробную информацию. Рекомендую изучить статью самостоятельно. Эта статья содержит большое количество информации, так что вам статья покажется немного проще. Спасибо, что уделили время чтению моей работы (: