Generative Adversarial Nets (GAN)
Порождающие состязательные сети (англ. Generative Adversarial Nets, GAN) — это алгоритм машинного обучения, входящий в семейство порождающих моделей и построенный на комбинации из двух нейронных сетей, одна из которых генерирует образцы, а другая же пытается отличить настоящие образцы от сгенерированных. Впервые такие сети были представлены Иэном Гудфеллоу в 2014 году.
Содержание
Постановка задачи и метод
Имеется множество образцов
из распределения , заданного на , а также некоторое пространство латентных факторов из распределения , например, случайные вектора из равномерного распределения .Рассмотрим две нейронные сети: первая — генератор
с параметрами , цель которой сгенерировать похожий образец из , и вторая — дискриминатор с параметрами , цель которой выдавать максимальную оценку на образцах из и минимальную на сгенерированных образцах из . Распределение, порождаемое генератором будем обозначать . Так же заметим, что в текущем изложении не принципиальны архитектуры нейронных сетей, поэтому можно считать, что параметры и являются просто параметрами многослойных персептронов.В качестве примера можно рассматривать генерацию реалистичных фотографий: в этом случае, входом для генератора может быть случайный многомерный шум, а выходом генератора (и входом для дискриминатора) RGB-изображение; выходом же для дискриминатора будет вероятность, что фотография настоящая, т.е число от 0 до 1.
Наша задача выучить распределение
так, чтобы оно как можно лучше описывало . Зададим функцию ошибки для получившейся модели. Со стороны дискриминатора мы хотим распознавать образцы из как правильные, т.е в сторону единицы, и образцы из как неправильные, т.е в сторону нуля, таким образом нужно максимизировать следующую величину:Со стороны же генератора требуется научиться "обманывать" дискриминатор, т.е минимизировать по
второе слагаемое предыдущего выражения. Другими словами, и играют в так называемую минимаксную игру, решая следующую задачу оптимизации:Теоретическое обоснование того, что такой метод заставляет [1]
сходится к описано в исходной статье.Оригинальный алгоритм обучения GAN
В процессе обучения требуется делать два шага оптимизации поочередно: сначала обновлять веса генератора
при фиксированном , а затем веса дискриминатора при фиксированном . На практике дискриминатор обновляется раз вместо одного; является гиперпараметром.// num_iteration — число итераций обучения for i = 1..num_iteration do for j = 1..k do Сэмплируем мини-батч $\{z_1, . . . , z_m\}$ из распределения $p_z$. Сэмплируем мини-батч $\{x_1, . . . , x_m\}$ из распределения $p_{data}$. Обновляем дискриминатор в сторону возрастания его градиента:end for Сэмплируем мини-батч $\{z_1, . . . , z_m\}$ из распределения $p_z$. Обновляем генератор в сторону убывания его градиента: end for
Обновления на основе градиента могут быть сделаны любым стандартным способом, например, стохастическим градиентным спуском (SGD). В оригинальной статье использовался SGD с импульсом.
Улучшение обучения GAN
Большинство GAN'ов подвержено следующим проблемам:
- Несходимость (non-convergence): параметры модели дестабилизируются и не сходятся,
- Схлопывание мод распределения (mode collapse): генератор коллапсирует, т.е выдает ограниченное количество разных образцов,
- Исчезающий градиент (diminished gradient): дискриминатор становится слишком "сильным", а градиент генератора исчезает и обучение не происходит,
- Высокая чувствительность к гиперпараметрам.
Универсального подхода к их решению нет, но существуют практические советы[2], которые могут помочь. Основными из них являются:
- Нормализация данных. Все признаки в диапазоне $[-1; 1]$.
- Замена функции ошибки для $G$ с $\min log (1-D)$ на $\max log D$, потому что исходный вариант имеет маленький градиент на раннем этапе обучения и большой градиент при сходимости, а предложенный наоборот.
- Сэмплирование из многомерного нормального распределения вместо равномерного.
- Использовать нормализационные слои (например, batch normalization или layer normalization) в $G$ и $D$.
- Использовать метки для данных, если они имеются, т.е обучать дискриминатор еще и классифицировать образцы.[3]
Применение
Чаще всего GAN'ы используются для генерации реалистичных изображений, однако существуют достаточно необычные применения, дающие впечатляющие результаты. Рассмотрим несколько из них:
- CycleGAN[4]: меняет изображения из одного домена в другой. Например, меняет на фотографии лошадей на зебр,
- SRGAN[5]: создает изображения с высоким разрешением из более низкого разрешения,
- Pix2Pix[6]: создает изображения по семантической окраске,
- StackGAN[7]: создает изображения по заданному тексту,
- MidiNet[8]: генерирует последовательность нот, таким образом, создает мелодию.
См. также
Примечания
- ↑ Ian J. Goodfellow — Generative Adversarial Nets
- ↑ How to Train a GAN? Tips and tricks to make GANs work
- ↑ Augustus Odena — Conditional Image Synthesis with Auxiliary Classifier GANs
- ↑ Jun-Yan Zhu & Taesung Park — Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks
- ↑ Christian Ledig — Photo-Realistic Single Image Super-Resolution Using a Generative Adversarial Network
- ↑ Phillip Isola — Image-to-Image Translation with Conditional Adversarial Nets
- ↑ Han Zhang — StackGAN: Text to Photo-realistic Image Synthesis with Stacked Generative Adversarial Networks
- ↑ Li-Chia Yang — MIDINET: A CONVOLUTIONAL GENERATIVE ADVERSARIAL NETWORK FOR SYMBOLIC-DOMAIN MUSIC GENERATION
Источники информации
- Сергей Николенко, Артур Кадурин, Екатерина Архангельская. Глубокое обучение. Погружение в мир нейронных сетей. — «Питер», 2018. — С. 348-360.
- Medium | GAN — Why it is so hard to train Generative Adversarial Networks!