Изменения

Перейти к: навигация, поиск

Generative Adversarial Nets (GAN)

109 байт добавлено, 12:30, 23 февраля 2019
м
Переместил комментарии выше соответствующих строчек для большей читаемости псевдокода
[[File:Арх_ган.png|450px|thumb|Оригинальная архитектура GAN]]
'''Порождающие состязательные сети''' (англ. ''Generative Adversarial Nets, GAN'') ${{-$ это --}} алгоритм машинного обучения, входящий в семейство [[:Порождающие модели|порождающих моделей]]<sup>[на 28.01.19 не создан]</sup> и построенный на комбинации из двух нейронных сетей, одна из которых генерирует образцы, другая пытается отличить настоящие образцы от сгенерированных. Впервые такие сети были представлены Иэном Гудфеллоу в 2014 году.
==Постановка задачи и метод==
Наша задача выучить распределение <tex>p_{gen}</tex> так, чтобы оно как можно лучше описывало <tex>p_{data}</tex>. Зададим функцию ошибки для получившейся модели. Со стороны дискриминатора мы хотим распознавать образцы из <tex>X</tex> как правильные, т.е в сторону единицы, и образцы из <tex>G</tex> как неправильные, т.е в сторону нуля, таким образом нужно максимизировать следующую величину:
<center> <tex>\mathop{E}\limits_{x \sim p_{data}}[logD(x)] + \mathop{E}\limits_{x \sim p_{gen}}[log(1-D(x))]</tex>, где <tex>\mathop{E}\limits_{x \sim p_{gen}}[log(1-D(x))] = \mathop{E}\limits_{z \sim p_{z}}[log(1-D(G(z))]</tex> </center>,
Со стороны же генератора требуется научиться "обманывать" дискриминатор, т.е минимизировать по <tex>p_{gen}</tex> второе слагаемое предыдущего выражения. Другими словами, <tex>G</tex> и <tex>D</tex> играют в так называемую ''минимаксную игру'', решая следующую задачу оптимизации:
<center> <tex> \min\limits_{G}\max\limits_{D} \mathop{E}\limits_{x \sim p_{data}}[logD(x)] + \mathop{E}\limits_{z \sim p_{z}}[log(1-D(G(z))] </tex> </center> ,
Теоретическое обоснование того, что такой метод заставляет <tex>p_{gen}</tex> сходится к <tex>p_{data}</tex> описано в исходной статье. <ref> [https://arxiv.org/pdf/1406.2661.pdf Ian J. Goodfellow {{---}} Generative Adversarial Nets]</ref>
'''for''' i = 1..num_iteration '''do'''
'''for''' j = 1..k '''do'''
$z$ = getBatchFromNoisePrior($p_z$) <font color=green>//Получаем мини-батч $\{z_1, . . . , z_m\}$ из распределения $p_z$ </font> $xz$ = getBatchFromDataGeneratingDistibutiongetBatchFromNoisePrior($p_{data}p_z$) <font color=green>//Получаем мини-батч $\{x_1, . . . , x_m\}$ из распределения $p_{data}$ </font> $x$ = getBatchFromDataGeneratingDistibution($p_{data}$) <font color=green>//Обновляем дискриминатор в сторону возрастания его градиента</font> <tex>d_w \leftarrow \mathop{\nabla}_{\gamma} { \frac{1}{m} \sum_{t = 1}^m \limits} [logD(x_t)] + [log(1-D(G(z_t))] </tex> <font color=green>//Обновляем дискриминатор в сторону возрастания его градиента </font>
'''end''' '''for'''
$z$ = getBatchFromNoisePrior($p_z$) <font color=green>//Получаем мини-батч $\{z_1, . . . , z_m\}$ из распределения $p_z$ </font> $z$ = getBatchFromNoisePrior($p_z$) <font color=green>//Обновляем генератор в сторону убывания его градиента </font> <tex>g_w \leftarrow \mathop{\nabla}_{\theta} { \frac{1}{m} \sum_{t = 1}^m \limits} [log(1-D(G(z_t))] </tex> <font color=green>//Обновляем генератор в сторону убывания его градиента </font>
'''end''' '''for'''
Обновления на основе градиента могут быть сделаны любым стандартным способом, например, в оригинальной статье использовался [[:Cтохастический градиентный спуск|стохастический градиентный спуск]]<sup>[на 28.01.19 не создан]</sup> с импульсом.
Большинство GAN'ов подвержено следующим проблемам:
* Несходимость (non-convergence): параметры модели дестабилизируются и не сходятся,;* Схлопывание мод распределения (mode collapse): генератор коллапсирует, т.е выдает ограниченное количество разных образцов,;* Исчезающий градиент (diminished gradient): дискриминатор становится слишком "сильным", а градиент генератора исчезает и обучение не происходит,;
* Высокая чувствительность к гиперпараметрам.
Универсального подхода к их решению нет, но существуют практические советы<ref> [https://github.com/soumith/ganhacks How to Train a GAN? Tips and tricks to make GANs work]</ref>, которые могут помочь. Основными из них являются:
# Нормализация данных. Все признаки в диапазоне $[-1; 1]$.;# Замена функции ошибки для $G$ с $\min log (1-D)$ на $\max log D$, потому что исходный вариант имеет маленький градиент на раннем этапе обучения и большой градиент при сходимости, а предложенный наоборот.;# Сэмплирование из многомерного нормального распределения вместо равномерного. ; # Использовать нормализационные слои (например, batch normalization или layer normalization) в $G$ и $D$.;
# Использовать метки для данных, если они имеются, т.е обучать дискриминатор еще и классифицировать образцы.
Чаще всего GAN'ы используются для генерации реалистичных фотографий. Серьезные улучшения в этом направлении были сделаны следующими работами:
* Auxiliary GAN<ref> [https://arxiv.org/pdf/1610.09585.pdf Augustus Odena {{---}} Conditional Image Synthesis with Auxiliary Classifier GANs]</ref>: вариант GAN-архитектуры, использующий метки данных.;* SN-GAN<ref> [https://arxiv.org/pdf/1802.05957.pdf Takeru Miyato {{---}} SPECTRAL NORMALIZATION FOR GENERATIVE ADVERSARIAL NETWORKS]</ref>: GAN с новым подходом решения проблемы нестабильного обучения через спектральную нормализацию.;* SAGAN<ref> [https://arxiv.org/pdf/1805.08318.pdf Han Zhang {{---}} Self-Attention Generative Adversarial Networks]</ref>: GAN, основанный на механизме внимания.;* BigGAN<ref> [https://arxiv.org/pdf/1809.11096.pdf Andrew Brock {{---}} LARGE SCALE GAN TRAINING FOR HIGH FIDELITY NATURAL IMAGE SYNTHESIS]</ref>: GAN с ортогональной регуляризацией, позволившей разрешить проблему коллапсирования при долгом обучении.;
Кроме простой генерации изображений, существуют достаточно необычные применения, дающие впечатляющие результаты не только на картинках, но и на звуке:
* CycleGAN<ref> [https://junyanz.github.io/CycleGAN/ Jun-Yan Zhu & Taesung Park {{---}} Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks]</ref>: меняет изображения c одного домена на другой, например, лошадей на зебр,;* SRGAN<ref> [https://arxiv.org/abs/1609.04802 Christian Ledig {{---}} Photo-Realistic Single Image Super-Resolution Using a Generative Adversarial Network]</ref>: создает изображения с высоким разрешением из более низкого разрешения,;* Pix2Pix<ref> [https://phillipi.github.io/pix2pix/ Phillip Isola {{---}} Image-to-Image Translation with Conditional Adversarial Nets]</ref>: создает изображения по семантической окраске,;* StackGAN<ref> [https://arxiv.org/abs/1612.03242 Han Zhang {{---}} StackGAN: Text to Photo-realistic Image Synthesis with Stacked Generative Adversarial Networks]</ref>: создает изображения по заданному тексту,;
* MidiNet<ref> [https://arxiv.org/abs/1703.10847 Li-Chia Yang {{---}} MIDINET: A CONVOLUTIONAL GENERATIVE ADVERSARIAL NETWORK FOR SYMBOLIC-DOMAIN MUSIC GENERATION]</ref>: генерирует последовательность нот, таким образом, создает мелодию.
'''DCGAN''' $-$ модификация алгоритма ''GAN'', основными архитектурными изменениями которой являются:
* Замена всех пулинговых слоев на страйдинговые свертки (''strided convolutions'') в дискриминаторе и частично-страйдинговые свертки (''fractional-strided''
''convolutions'') в генераторе.;* Использование батчинговой нормализации для генератора и дискриминатора.;* Удаление всех полносвязных скрытых уровней для более глубоких архитектур.;* Использование ''ReLU'' в качестве функции активации в генераторе для всех слоев, кроме последнего, где используется ''tanh''.;
* Использование ''LeakyReLU'' в качестве функции активации в дискриминаторе для всех слоев.
==См. также==
*[[:Порождающие модели|Порождающие модели]]<sup>[на 28.01.19 не создан]</sup>*[[:Variational autoencoder (VAE)|Variational autoencoder (VAE)]]<sup>[на 28.01.19 не создан]</sup> 
==Примечания==
<references/>
61
правка

Навигация