Адаптированный перевод статьи Jason Brownlee от 19 июня 2019г. в Generative Adversarial Networks
Эмпирическая эвристика, советы и хитрости, которые полезно знать для обучения стабильных генеративно-состязательных сетей (GAN).
Генеративные состязательные сети , или сокращенно GAN, представляют собой подход к генеративному моделированию с использованием методов глубокого обучения, таких как глубокие сверточные нейронные сети.
Несмотря на то, что результаты, генерируемые GAN, могут быть исключительно значимыми, обучение стабильной модели может оказаться сложной задачей. Причина в том, что тренировочный процесс GAN по своей природе нестабилен, что связано с одновременной динамической тренировкой двух конкурирующих моделей.
Тем не менее, учитывая большое количество уже имеющихся эмпирических проб и ошибок, многие практики и исследователи выработали некоторое количество архитектур моделей и обучающих конфигураций, которые приводят к надежному обучению стабильной модели GAN.
В этом посте вы познакомитесь с эмпирической эвристикой для настройки и обучения стабильных моделей состязательных сетей.
Прочитав этот пост, вы узнаете:
- Одновременное обучение моделей генератора и дискриминатора в GAN по своей природе нестабильно.
- Выработанные с большим трудом эмпирические конфигурации для DCGAN обеспечивают надежную отправную точку для большинства приложений GAN.
- Стабильное обучение GAN остается открытой проблемой, даже с учетом многих эмпирически полученных советов и приемов, которые могут использоваться на практике.
Давайте начнем.
Как обучить стабильные генеративные состязательные сети
Снято Крисом Стерном-Джонсоном , права защищены.
Обзор
Этот пост разделен на три части:
- Сложности обучения GAN
- Глубокий сверточный GAN
- Дополнительные советы и подсказки
Задача обучения генеративных состязательных сетей
GAN трудно тренировать.
Причина, по которой их трудно обучать, заключается в том, что и модель генератора, и модель дискриминатора одновременно обучаются в антагонистической игре. Это означает, что улучшения одной модели происходят за счет другой модели.
Цель обучения двух моделей заключается в нахождении точки равновесия между двумя конкурирующими задачами.
Обучение GAN состоит в нахождении равновесия Нэша для антагонистической игры двух игроков. […] К сожалению, найти равновесия по Нэшу очень сложно. Алгоритмы существуют для специализированных случаев, но мы не знаем ни одного, который можно применить к игре GAN, где функции стоимости невыпуклы, параметры непрерывны, и пространство параметров чрезвычайно многомерно
– Улучшенные методики обучения GAN , 2016.
Это также означает, что каждый раз, когда параметры одной из моделей обновляются, характер решаемой задачи оптимизации изменяется.
Это означает, что система являктся динамической.
Каждый шаг вниз по склону с GAN немного меняет весь ландшафт. Это динамическая система, в которой процесс оптимизации стремится не к минимуму, а к равновесию между двумя силами.
– Страница 306, Глубокое обучение с Python , 2017.
В терминах нейронных сетей техническая сложность обучения двух конкурирующих моделей одновременно заключается в том, что они могут не сойтись.
Самая большая проблема, стоящая перед GAN, которую исследователи должны решить, – это проблема неконвергенции.
– Учебное пособие NIPS 2016: Генеративные состязательные сети , 2016.
Вместо того, чтобы сходиться, процесс обучения GAN может приводить к одной из небольшого числа ошибок (режиму отказа).
Обычно, режим отказа состоит в том, что вместо нахождения точки равновесия генератор зацикливается в генерации конкретных примеров из области данных задачи.
На практике GAN часто, кажется, циклятся, […] это означает, что они переходят от генерации выборки одного типа к генерации выборки другого типа, не достигая в конечном итоге равновесия.
– Учебное пособие NIPS 2016: Генеративные состязательные сети , 2016.
Возможно, самая сложная ошибка модели – это случай, когда несколько вводов в модель генератора приводят к генерации одного и того же выхода.
Это называется «режимом коллапса» и может представлять одну из самых сложных проблем при обучении GAN.
Режим коллапса, также известный как сценарий, представляет собой проблему, которая возникает, когда генератор учится отображать несколько разных входных значений z в одну и ту же выходную точку.
– Учебное пособие NIPS 2016: Генеративные состязательные сети , 2016.
Наконец, нет хороших объективных показателей для оценки того, хорошо ли работает GAN во время обучения. В частности, использование функции потерь не является достаточным.
Вместо этого лучший подход заключается в визуальной проверке сгенерированных примеров и использовании субъективной оценки.
В порождающих противоборствующих сетях отсутствует целевая функция, что затрудняет сравнение производительности разных моделей. Один интуитивно понятный показатель производительности может быть получен благодаря тому, что люди-эксперты судят о визуальном качестве образцов.
– Улучшенные методики обучения GAN , 2016.
На момент написания статьи не было хорошего теоретического обоснования того, как проектировать и обучать модели GAN, но есть устоявшаяся литература по эвристике, или « взломам », которая эмпирически продемонстрировала, что она хорошо работает на практике.
Глубокие сверточные генеративные состязательные сети
Возможно, одним из наиболее важных шагов в разработке и обучении стабильных моделей GAN стала статья Алек Рэдфорд и соавторов, опубликованная в 2015 году под названием «Репрезентативное обучение с использованием неконтролируемых генеративных состязательных сетей».
В этой статье авторы описывают подход Deep Convolutional GAN, или DCGAN, к разработке GAN, который стал стандартом де-факто.
Стабилизация обучения GAN остается открытой проблемой. К счастью, GAN-обучение хорошо работает, если тщательно подобрать архитектуру модели и гиперпараметры. Рэдфорд и соавторы (2015г) создали глубокую сверточную GAN (DCGAN), которая очень хорошо справляется с задачами синтеза изображений …
– Страница 701, Глубокое Обучение , 2016.
Пример архитектуры модели генератора для DCGAN. Взято из презентации неконтролируемого обучения с помощью глубоких сверточных порождающих состязательных сетей, 2015.
Выводы, приведенные в этой статье, были с трудом разработаны после обширных эмпирических испытаний и ошибок с использованием различных моделей архитектуры, конфигураций и схем обучения. Их подход по-прежнему настоятельно рекомендуется в качестве отправной точки при разработке новых GAN, по крайней мере, для задач на основе синтеза изображений.
… После обширных исследований моделей мы определили семейство архитектур, которые привели к стабильному обучению по ряду наборов данных и позволили обучать модели с более высоким разрешением и более глубокие генеративные модели.
Ниже приводится резюме рекомендаций по архитектуре GAN, взятое из статьи.
Краткое изложение рекомендаций для устойчивого обучения глубоких сверточных генеративно-состязательных сетей. Выдержка из “Репрезентативное неконтролируемое обучение с использованием глубоких сверточных генеративно-состязательных сетей“, 2015.
Давайте внимательнее рассмотрим эти рекомендации.
1. Используйте пошаговую свертку
Обычно в CNN используются уровни пулинга, чаще всего максимального пулинга, для понижения размерности изображения.
В GAN рекомендуется не использовать уровни пулинга, а вместо этого использовать шаг в сверточных уровнях для понижения размерности в модели дискриминатора.
Точно так же фракционный шаг (деконволюционные слои) может использоваться в генераторе для повышения размерности.
[заменить] детерминистические пространственные функции пулинга (например, максимального пулинга) пошаговыми свертками, позволяющими сети изучать собственное пространственное понижение размерности. Мы используем этот подход в нашем генераторе, что позволяет ему изучать собственное пространственное повышение размерности, и в дискриминаторе.
2. Удалите полностью связанные слои
Общепринято в сверточных слоях использовать полностью связанные слои после слоев извлечения признаков в качестве интерпретации извлеченных элементов до выходных слоев модели.
Вместо этого в GAN полностью связанные слои не используются, в дискриминаторе и сверточных слоях признаки передаются непосредственно на выходной слой.
Кроме того, случайный гауссовский входной вектор, переданный в модель генератора, преобразуется непосредственно в многомерный тензор, который может быть передан в первый сверточный слой, готовый для масштабирования.
Первый слой GAN, который принимает равномерное распределение шума Z в качестве входных данных, можно назвать полностью связанным, поскольку это всего лишь матричное умножение, но результат преобразуется в 4-мерный тензор и используется в качестве начала стека свертки. Для дискриминатора последний сверточный слой выравнивается и затем подается на один сигмоидный выход.
3. Используйте пакетную нормализацию
Пакетная нормализация стандартизирует активацию из предыдущего уровня, чтобы иметь нулевое среднее и единичную дисперсию. Это стабилизирует процесс обучения.
Пакетная нормализация стала основной при обучении глубоких сверточных нейронных сетей, и GAN ничем не отличаются. Уровни пакетной нормализации рекомендуются для использования как в модели дискриминатора, так и в модели генератора, за исключением выходных сигналов генератора и входа в дискриминатор.
Однако непосредственное применение пакетной нормализации во всех слоях привело к колебаниям и нестабильности модели. Этого удалось избежать, не применяя пакетную нормализацию к выходному слою генератора и входному слою дискриминатора.
4. Используйте ReLU , Leaky ReLU и Tanh
Функции активации, такие как ReLU , используются для решения проблемы исчезающего градиента в глубоких сверточных нейронных сетях и разреженной активации (например, множество нулевых значений).
ReLU рекомендуется для генератора, но не для модели дискриминатора. Вместо этого в дискриминаторе предпочтительнее вариант ReLU, который допускает значения меньше нуля, называемый Leaky ReLU .
Активации ReLU используется в генераторе, за исключением выходного слоя , который использует функцию Tanh. […] В дискриминаторе мы обнаружили, что Leaky ReLU работает хорошо…
Кроме того, генератор использует функцию активации гиперболического тангенса (tanh) в выходном слое, а входы генератора и дискриминатора масштабируются до диапазона [-1, 1].
Для тренировочных изображений не применялась предварительная обработка, кроме масштабирования до диапазона [-1, 1] функции активации tanh.
Веса модели были инициализированы для малых гауссовских случайных значений, а наклон Leaky ReLU в дискриминаторе был инициализирован до значения 0,2.
Все веса были инициализированы из нормального распределения с нулевым средним со стандартным отклонением 0,02. В Leaky ReLU наклон был установлен на 0,2 во всех моделях.
5. Используйте Адам Оптимизацию
И генератор, и дискриминатор обучаются со стохастическим градиентным спуском на небольшом пакете из 128 изображений.
Все модели были обучены с использованием мини-пакетного стохастического градиентного спуска (SGD) с размером мини-партии 128
В частности, версия стохастического градиентного спуска по Адаму использовалась для обучения моделей со скоростью обучения 0,0002 и импульсом (бета1) 0,5.
Мы использовали оптимизатор Adam с настроенными гиперпараметрами. Мы обнаружили, что предлагаемая скорость обучения 0,001 слишком высока, вместо этого мы использовали 0,0002. Кроме того, мы обнаружили, что оставление импульса β 1 при предлагаемом значении 0,9 привело к колебаниям и нестабильности, а снижение до 0,5 помогло стабилизировать обучение.
Дополнительные советы и подсказки
Документ DCGAN является отличной отправной точкой для настройки и обучения моделей генератора и дискриминатора.
Кроме того, было подготовлено несколько обзорных презентаций и документов, обобщающих эти и дополнительные эвристические методы для настройки и обучения GAN.
В этом разделе мы рассмотрим некоторые из них и приведем дополнительные советы и рекомендации.
Статья Тима Салиманса 2016 года с соавторами из OpenAI под названием « Улучшенные методы для обучения GAN » перечисляет пять методов, которые необходимо учитывать, как утверждают авторы, для улучшения конвергенции при обучении GAN.
- Сопоставление признаков. Разрабатывайте GAN, используя полу-контролируемое обучение.
- Мини-пакетная дискриминация. Разрабатывайте признаки для нескольких образцов в мини-пакетах.
- Историческое усреднение. Обновляйте функцию потерь, используя предыдущие результаты.
- Одностороннее сглаживание метки. Масштабируйте целевые значения для дискриминатора, далекие от 1.0.
- Виртуальная пакетная нормализация. Рассчитывайте пакетные статистики с использованием эталонной партии реальных изображений.
В своем учебнике 2016 года по GAN на конференции NIPS Ян Гудфеллоу подробно останавливается на некоторых из наиболее успешных из этих предложений, написанных в сопроводительном документе под названием « Учебник. Генеративные состязательные сети» . В частности, в разделе 4 под названием « Советы и хитрости » описаны четыре метода.
1. Обучение с метками. Использование меток в GAN улучшает качество изображения.
Любое использование меток, форм или объемов почти всегда приводит к значительному улучшению качества образцов, сгенерированных моделью.
– Учебное пособие NIPS 2016: Генеративные состязательные сети , 2016.
2. Одностороннее сглаживание меток. Использование меток для реальных примеров в дискриминаторе со значением 0,9 или меток со стохастическим диапазоном дает лучшие результаты.
Идея одностороннего сглаживания меток заключается в замене меток для реальных примеров значением, немного меньшим единицы, например 0,9 […]. Это предотвращает экстремальное поведение при экстраполяции в дискриминаторе…
– Учебное пособие NIPS 2016: Генеративные состязательные сети , 2016.
3. Виртуальная пакетная нормализация . Лучше рассчитывать статистику партии на реальных изображениях или реальных изображениях с одним сгенерированным изображением.
… Вместо этого можно использовать нормализацию виртуального пакета, в которой статистика нормализации для каждого примера вычисляется с использованием объединения этого примера и эталонного пакета
– Учебное пособие NIPS 2016: Генеративные состязательные сети , 2016.
4. Можно ли уравновесить G и D? Планирование обучения генератора или дискриминатора на основе относительных изменений функции потерь является интуитивно понятным, но ненадежным.
На практике дискриминатор обычно глубже и иногда имеет больше фильтров на слой, чем генератор.
– Учебное пособие NIPS 2016: Генеративные состязательные сети , 2016.
Soumith Чинтала , один из соавторов статьи DCGAN, выступил с презентацией на NIPS 2016 под названием «Как обучать GAN?», обобщив множество советов и подсказок.
Видео доступно на YouTube и настоятельно рекомендуется. Сводка советов также доступна в виде репозитория GitHub под названием «How to Train a GAN? Tips and tricks to make GANs work».
Советы основаны на предложениях из документа DCGAN, а также из других источников.
Краткое изложение некоторых наиболее действенных советов приведено ниже.
- Нормализуйте входные данные в диапазоне [-1, 1] и используйте tanh на выходе генератора.
- Поменяйте метки при обучении и функции потерь при люучении генератора.
- Образец гауссовских случайных чисел в качестве входных данных для генератора.
- Используйте мини-пакеты всех реальных или всех поддельных образцов для расчета пакетных норм статистики.
- Используйте Leaky ReLU в генераторе и дискриминаторе.
- Используйте средний пулинг и шаг для понижения размерности; используйте ConvTranspose2D и шаг для повышения размерности.
- Используйте сглаживание меток в дискриминаторе с небольшим случайным шумом.
- Добавьте случайный шум к меткам в дискриминаторе.
- Используйте архитектуру DCGAN, если у вас нет веских причин для обратного.
- Значение функции потерь = 0.0 в дискриминаторе является режимом сбоя.
- Если функция потерь генератора неуклонно снижается, это, вероятно, означает, что дискриминатор обманывается изображениями мусора.
- Используйте метки, если они у вас есть.
- Добавьте шум к входам дискриминатора и уменьшите шум с течением времени.
- Используйте отсев 50 процентов во время обучения и генерации.
И, наконец, книга Deep Learning with Python по Keras предоставляет ряд практических советов, которые следует учитывать при обучении GAN, основываясь в основном на предложениях из документа DCGAN.
Еще один совет предлагает использовать размер ядра, разделенный на размер шага в модели генератора, чтобы избежать так называемого артефакта « шахматной доски » ( ошибка ).
… Часто встречаются артефакты шахматной доски, вызванные неравномерным покрытием пространства пикселей в генераторе. Чтобы исправить это, мы используем размер ядра, который делится на размер шага всякий раз, когда мы используем расширенный Conv2DTranpose или Conv2D как в генераторе, так и в дискриминаторе.
– Страница 308, Углубленное изучение с Python , 2017.
Это то же самое предложение, представленное в статье 2016 года на distill под названием «Артефакты деконволюции и шахматной доски».
Дальнейшее чтение
Books
- Chapter 20. Deep Generative Models, Deep Learning, 2016.
- Chapter 8. Generative Deep Learning, Deep Learning with Python, 2017.
Papers
- Generative Adversarial Networks, 2014.
- Tutorial: Generative Adversarial Networks, NIPS, 2016.
- Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks, 2015
- Improved Techniques for Training GANs, 2016.
Articles
- How to Train a GAN? Tips and tricks to make GANs work
- Deconvolution and Checkerboard Artifacts, 2016.
Videos
- Ian Goodfellow, Introduction to GANs, NIPS 2016.
- Soumith Chintala, How to train a GAN, NIPS 2016 Workshop on Adversarial Training.
Резюме
В этом посте вы познакомились с эмпирической эвристикой для настройки и обучения устойчивых моделей генеративно-состязательных сетей.
В частности , вы узнали:
- Одновременное обучение моделей генератора и дискриминатора в GAN по своей природе нестабильно.
- Выработанные с большим трудом эмпирические конфигурации для DCGAN обеспечивают надежную отправную точку для большинства приложений GAN.
- Стабильное обучение GAN остается открытой проблемой, даже с учетом многих эмпирически полученных советов и приемов, которые могут использоваться на практике.