<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=89.106.174.124&amp;*</id>
		<title>Викиконспекты - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=89.106.174.124&amp;*"/>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/89.106.174.124"/>
		<updated>2026-04-08T09:39:02Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=Generative_Adversarial_Nets_(GAN)&amp;diff=71938</id>
		<title>Generative Adversarial Nets (GAN)</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=Generative_Adversarial_Nets_(GAN)&amp;diff=71938"/>
				<updated>2019-11-25T14:16:25Z</updated>
		
		<summary type="html">&lt;p&gt;89.106.174.124: /* Оригинальный алгоритм обучения GAN */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Арх_ган.png|450px|thumb|Оригинальная архитектура GAN]]&lt;br /&gt;
&lt;br /&gt;
'''Порождающие состязательные сети''' (англ. ''Generative Adversarial Nets, GAN'') {{---}} алгоритм машинного обучения, входящий в семейство [[:Порождающие модели|порождающих моделей]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt; и построенный на комбинации из двух нейронных сетей, одна из которых генерирует образцы, другая пытается отличить настоящие образцы от сгенерированных. Впервые такие сети были представлены Иэном Гудфеллоу в 2014 году. &lt;br /&gt;
&lt;br /&gt;
==Постановка задачи и метод==&lt;br /&gt;
Имеется множество образцов &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt; из распределения &amp;lt;tex&amp;gt;p_{data}&amp;lt;/tex&amp;gt;, заданного на &amp;lt;tex&amp;gt; \mathbb R^n &amp;lt;/tex&amp;gt;, а также некоторое пространство латентных факторов &amp;lt;tex&amp;gt;Z&amp;lt;/tex&amp;gt; из распределения &amp;lt;tex&amp;gt;p_{z}&amp;lt;/tex&amp;gt;, например, случайные вектора из равномерного распределения &amp;lt;tex&amp;gt; \mathbb U^t(0,1) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим две нейронные сети: первая $-$ ''генератор'' &amp;lt;tex&amp;gt; G: Z \rightarrow \mathbb R^n &amp;lt;/tex&amp;gt; с параметрами &amp;lt;tex&amp;gt;\theta&amp;lt;/tex&amp;gt;, цель которой сгенерировать похожий образец из &amp;lt;tex&amp;gt;p_{data}&amp;lt;/tex&amp;gt;, и вторая $-$ ''дискриминатор'' &amp;lt;tex&amp;gt;D: \mathbb R^n \rightarrow \mathbb [0,1] &amp;lt;/tex&amp;gt; с параметрами &amp;lt;tex&amp;gt;\gamma&amp;lt;/tex&amp;gt;, цель которой выдавать максимальную оценку на образцах из &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt; и минимальную на сгенерированных образцах из &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Распределение, порождаемое генератором будем обозначать &amp;lt;tex&amp;gt;p_{gen}&amp;lt;/tex&amp;gt;. Так же заметим, что в текущем изложении не принципиальны архитектуры нейронных сетей, поэтому можно считать, что параметры &amp;lt;tex&amp;gt;\theta&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\gamma&amp;lt;/tex&amp;gt; являются просто параметрами многослойных персептронов.&lt;br /&gt;
&lt;br /&gt;
В качестве примера можно рассматривать генерацию реалистичных фотографий: в этом случае, входом для генератора может быть случайный многомерный шум, а выходом генератора (и входом для дискриминатора) RGB-изображение; выходом же для дискриминатора будет вероятность, что фотография настоящая, т.е число от 0 до 1. &lt;br /&gt;
&lt;br /&gt;
Наша задача выучить распределение &amp;lt;tex&amp;gt;p_{gen}&amp;lt;/tex&amp;gt; так, чтобы оно как можно лучше описывало &amp;lt;tex&amp;gt;p_{data}&amp;lt;/tex&amp;gt;. Зададим функцию ошибки для получившейся модели. Со стороны дискриминатора мы хотим распознавать образцы из &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt; как правильные, т.е в сторону единицы, и образцы из &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; как неправильные, т.е в сторону нуля, таким образом нужно максимизировать следующую величину:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt; &amp;lt;tex&amp;gt;\mathop{E}\limits_{x \sim p_{data}}[logD(x)] + \mathop{E}\limits_{x \sim p_{gen}}[log(1-D(x))]&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\mathop{E}\limits_{x \sim p_{gen}}[log(1-D(x))] = \mathop{E}\limits_{z \sim p_{z}}[log(1-D(G(z))]&amp;lt;/tex&amp;gt; &amp;lt;/center&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
Со стороны же генератора требуется научиться &amp;quot;обманывать&amp;quot; дискриминатор, т.е минимизировать по &amp;lt;tex&amp;gt;p_{gen}&amp;lt;/tex&amp;gt; второе слагаемое предыдущего выражения. Другими словами, &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; играют в так называемую ''минимаксную игру'', решая следующую задачу оптимизации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt; &amp;lt;tex&amp;gt; \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))]  &amp;lt;/tex&amp;gt; &amp;lt;/center&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
Теоретическое обоснование того, что такой метод заставляет &amp;lt;tex&amp;gt;p_{gen}&amp;lt;/tex&amp;gt; сходится к &amp;lt;tex&amp;gt;p_{data}&amp;lt;/tex&amp;gt; описано в исходной статье. &amp;lt;ref&amp;gt; [https://arxiv.org/pdf/1406.2661.pdf  Ian J. Goodfellow {{---}} Generative Adversarial Nets]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Оригинальный алгоритм обучения GAN==&lt;br /&gt;
[[File:Обучение_ган.png|450px|thumb|right|Визуализация генерирования фотографии с помощью DCGAN по одному и тому же шуму в зависимости от итерации обучения. Источник: https://arxiv.org/pdf/1701.07875.pdf]]&lt;br /&gt;
&lt;br /&gt;
В процессе обучения требуется делать два шага оптимизации поочередно: сначала обновлять веса генератора &amp;lt;tex&amp;gt;\theta&amp;lt;/tex&amp;gt; при фиксированном &amp;lt;tex&amp;gt;\gamma&amp;lt;/tex&amp;gt;, а затем веса дискриминатора &amp;lt;tex&amp;gt;\gamma&amp;lt;/tex&amp;gt; при фиксированном &amp;lt;tex&amp;gt;\theta&amp;lt;/tex&amp;gt;. На практике дискриминатор обновляется &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; раз вместо одного; &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; является гиперпараметром.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=green&amp;gt;// num_iteration {{---}} число итераций обучения &amp;lt;/font&amp;gt;&lt;br /&gt;
 '''function''' GAN:&lt;br /&gt;
   '''for''' i = 1..num_iteration '''do'''&lt;br /&gt;
     '''for''' j = 1..k '''do'''&lt;br /&gt;
       &amp;lt;font color=green&amp;gt;//Получаем мини-батч $\{z_1, . . . , z_m\}$ из распределения $p_z$&amp;lt;/font&amp;gt;&lt;br /&gt;
       $z$ = getBatchFromNoisePrior($p_z$)  &lt;br /&gt;
       &amp;lt;font color=green&amp;gt;//Получаем мини-батч $\{x_1, . . . , x_m\}$ из распределения $p_{data}$ &amp;lt;/font&amp;gt;&lt;br /&gt;
       $x$ = getBatchFromDataGeneratingDistribution($p_{data}$)&lt;br /&gt;
       &amp;lt;font color=green&amp;gt;//Обновляем дискриминатор в сторону возрастания его градиента&amp;lt;/font&amp;gt;&lt;br /&gt;
       &amp;lt;tex&amp;gt;d_w \leftarrow \mathop{\nabla}_{\gamma} { \frac{1}{m} \sum_{t = 1}^m \limits} [logD(x_t)]  + [log(1-D(G(z_t))] &amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''end''' '''for'''&lt;br /&gt;
     &amp;lt;font color=green&amp;gt;//Получаем мини-батч $\{z_1, . . . , z_m\}$ из распределения $p_z$ &amp;lt;/font&amp;gt;&lt;br /&gt;
     $z$ = getBatchFromNoisePrior($p_z$)&lt;br /&gt;
     &amp;lt;font color=green&amp;gt;//Обновляем генератор в сторону убывания его градиента &amp;lt;/font&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;g_w \leftarrow \mathop{\nabla}_{\theta}  { \frac{1}{m} \sum_{t = 1}^m \limits} [log(1-D(G(z_t))] &amp;lt;/tex&amp;gt;&lt;br /&gt;
   '''end''' '''for'''&lt;br /&gt;
Обновления на основе градиента могут быть сделаны любым стандартным способом, например, в оригинальной статье использовался [[:Cтохастический градиентный спуск|стохастический градиентный спуск]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt; с импульсом.&lt;br /&gt;
&lt;br /&gt;
==Улучшение обучения GAN==&lt;br /&gt;
&lt;br /&gt;
Большинство GAN'ов подвержено следующим проблемам:&lt;br /&gt;
* Несходимость (non-convergence): параметры модели дестабилизируются и не сходятся;&lt;br /&gt;
* Схлопывание мод распределения (mode collapse): генератор коллапсирует, т.е выдает ограниченное количество разных образцов;&lt;br /&gt;
* Исчезающий градиент (diminished gradient): дискриминатор становится слишком &amp;quot;сильным&amp;quot;, а градиент генератора исчезает и обучение не происходит;&lt;br /&gt;
* Высокая чувствительность к гиперпараметрам.&lt;br /&gt;
&lt;br /&gt;
Универсального подхода к их решению нет, но существуют практические советы&amp;lt;ref&amp;gt; [https://github.com/soumith/ganhacks  How to Train a GAN? Tips and tricks to make GANs work]&amp;lt;/ref&amp;gt;, которые могут помочь. Основными из них являются:&lt;br /&gt;
# Нормализация данных. Все признаки в диапазоне $[-1; 1]$;&lt;br /&gt;
# Замена функции ошибки для $G$ с $\min log (1-D)$ на $\max log D$, потому что исходный вариант имеет маленький градиент на раннем этапе обучения и большой градиент при сходимости, а предложенный наоборот;&lt;br /&gt;
# Сэмплирование из многомерного нормального распределения вместо равномерного;  &lt;br /&gt;
# Использовать нормализационные слои (например, batch normalization или layer normalization) в $G$ и $D$;&lt;br /&gt;
# Использовать метки для данных, если они имеются, т.е обучать дискриминатор еще и классифицировать образцы.&lt;br /&gt;
&lt;br /&gt;
==Применение==&lt;br /&gt;
&lt;br /&gt;
[[File:прогресс_ганов.jpg|450px|thumb|right|Прогресс в генерации фотографий с помощью GAN. Источник: https://twitter.com/goodfellow_ian]]&lt;br /&gt;
&lt;br /&gt;
Чаще всего GAN'ы используются для генерации реалистичных фотографий. Серьезные улучшения в этом направлении были сделаны следующими работами:&lt;br /&gt;
&lt;br /&gt;
* Auxiliary GAN&amp;lt;ref&amp;gt; [https://arxiv.org/pdf/1610.09585.pdf Augustus Odena {{---}} Conditional Image Synthesis with Auxiliary Classifier GANs]&amp;lt;/ref&amp;gt;: вариант GAN-архитектуры, использующий метки данных;&lt;br /&gt;
* SN-GAN&amp;lt;ref&amp;gt; [https://arxiv.org/pdf/1802.05957.pdf Takeru Miyato {{---}} SPECTRAL NORMALIZATION FOR GENERATIVE ADVERSARIAL NETWORKS]&amp;lt;/ref&amp;gt;: GAN с новым подходом решения проблемы нестабильного обучения через спектральную нормализацию;&lt;br /&gt;
* SAGAN&amp;lt;ref&amp;gt; [https://arxiv.org/pdf/1805.08318.pdf Han Zhang {{---}} Self-Attention Generative Adversarial Networks]&amp;lt;/ref&amp;gt;: GAN, основанный на механизме внимания;&lt;br /&gt;
* BigGAN&amp;lt;ref&amp;gt; [https://arxiv.org/pdf/1809.11096.pdf Andrew Brock {{---}} LARGE SCALE GAN TRAINING FOR HIGH FIDELITY NATURAL IMAGE SYNTHESIS]&amp;lt;/ref&amp;gt;: GAN с ортогональной регуляризацией, позволившей разрешить проблему коллапсирования при долгом обучении;&lt;br /&gt;
&lt;br /&gt;
Кроме простой генерации изображений, существуют достаточно необычные применения, дающие впечатляющие результаты не только на картинках, но и на звуке:&lt;br /&gt;
&lt;br /&gt;
* CycleGAN&amp;lt;ref&amp;gt; [https://junyanz.github.io/CycleGAN/ Jun-Yan Zhu &amp;amp; Taesung Park {{---}} Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks]&amp;lt;/ref&amp;gt;: меняет изображения c одного домена на другой, например, лошадей на зебр;&lt;br /&gt;
* SRGAN&amp;lt;ref&amp;gt; [https://arxiv.org/abs/1609.04802 Christian Ledig {{---}} Photo-Realistic Single Image Super-Resolution Using a Generative Adversarial Network]&amp;lt;/ref&amp;gt;: создает изображения с высоким разрешением из более низкого разрешения;&lt;br /&gt;
* Pix2Pix&amp;lt;ref&amp;gt; [https://phillipi.github.io/pix2pix/ Phillip Isola {{---}} Image-to-Image Translation with Conditional Adversarial Nets]&amp;lt;/ref&amp;gt;: создает изображения по семантической окраске;&lt;br /&gt;
* StackGAN&amp;lt;ref&amp;gt; [https://arxiv.org/abs/1612.03242 Han Zhang {{---}} StackGAN: Text to Photo-realistic Image Synthesis with Stacked Generative Adversarial Networks]&amp;lt;/ref&amp;gt;: создает изображения по заданному тексту;&lt;br /&gt;
* MidiNet&amp;lt;ref&amp;gt; [https://arxiv.org/abs/1703.10847 Li-Chia Yang {{---}} MIDINET: A CONVOLUTIONAL GENERATIVE ADVERSARIAL NETWORK FOR SYMBOLIC-DOMAIN MUSIC GENERATION]&amp;lt;/ref&amp;gt;: генерирует последовательность нот, таким образом, создает мелодию.&lt;br /&gt;
&lt;br /&gt;
==CGAN (Conditional Generative Adversarial Nets)==&lt;br /&gt;
&lt;br /&gt;
[[File:CGAN_architecture.png|450px|thumb|Архитектура CGAN. Источник: https://arxiv.org/pdf/1411.1784.pdf]]&lt;br /&gt;
&lt;br /&gt;
'''Условные порождающие состязательные сети''' (англ. ''Conditional Generative Adversarial Nets, CGAN'') $-$ это модифицированная версия алгоритма GAN, которая позволяет &lt;br /&gt;
генерировать объекты с дополнительными условиями '''y'''. '''y''' может быть любой дополнительной информацией, например, меткой класса или данными из других моделей. Добавление данных условий в существующую архитектуру осуществляется с помощью расширения вектором '''y''' входных данных генератора и дискриминатора.&lt;br /&gt;
&lt;br /&gt;
В таком случае задача оптимизации будет выглядеть следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt; &amp;lt;tex&amp;gt; \min\limits_{G}\max\limits_{D} \mathop{E}\limits_{x \sim p_{data}}[logD(x|y)]  + \mathop{E}\limits_{z \sim p_{z}}[log(1-D(G(z|y))]  &amp;lt;/tex&amp;gt; &amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В качестве примера использования данного алгоритма можно рассмотреть задачу генерации рукописных цифр. ''CGAN'' был натренирован на датасете ''MNIST'' с метками классов представленных в виде ''one-hot'' векторов.&lt;br /&gt;
&lt;br /&gt;
[[File:CGAN_generated.png|450px|thumb|Цифры, сгенерированные с помощью CGAN. Источник: https://arxiv.org/pdf/1411.1784.pdf]]&lt;br /&gt;
&lt;br /&gt;
==DCGAN (Deep Convolutional Generative Adversarial Nets)==&lt;br /&gt;
&lt;br /&gt;
[[File:DCGAN_generator.png|450px|thumb|Архитектура генератора в DCGAN. Источник: https://arxiv.org/pdf/1511.06434.pdf]]&lt;br /&gt;
&lt;br /&gt;
'''DCGAN''' $-$ модификация алгоритма ''GAN'', основными архитектурными изменениями которой являются:&lt;br /&gt;
* Замена всех пулинговых слоев на страйдинговые свертки (''strided convolutions'') в дискриминаторе и частично-страйдинговые свертки (''fractional-strided''&lt;br /&gt;
''convolutions'') в генераторе;&lt;br /&gt;
* Использование батчинговой нормализации для генератора и дискриминатора;&lt;br /&gt;
* Удаление всех полносвязных скрытых уровней для более глубоких архитектур;&lt;br /&gt;
* Использование ''ReLU'' в качестве функции активации в генераторе для всех слоев, кроме последнего, где используется ''tanh'';&lt;br /&gt;
* Использование ''LeakyReLU'' в качестве функции активации в дискриминаторе для всех слоев.&lt;br /&gt;
&lt;br /&gt;
Помимо задачи генерации объектов, данный алгоритм хорошо показывает себя в качестве ''feature extractor'''а.&lt;br /&gt;
Данный алгоритм был натренирован на датасете ''Imagenet-1k'', после чего были использованы значения со сверточных слоев дискриминатора, подвергнутые ''max-pooling'''у, чтобы образовать матрицы &lt;br /&gt;
&amp;lt;tex&amp;gt; 4 \times 4 &amp;lt;/tex&amp;gt; и получить общий вектор признаков на их основе. ''L2-SVM'' с данным ''feature extractor'''ом на датасете ''CIFAR-10'' превосходит по точности решения, основанные на алгоритме&lt;br /&gt;
''K-Means''. Более подробно об этом вы можете прочитать в статье. &amp;lt;ref&amp;gt; [https://arxiv.org/pdf/1511.06434.pdf  Alec Radford, Luke Metz, Soumith Chintala {{---}} Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
*[[:Порождающие модели|Порождающие модели]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
*[[:Variational autoencoder (VAE)|Variational autoencoder (VAE)]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Примечания==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* Сергей Николенко, Артур Кадурин, Екатерина Архангельская. Глубокое обучение. Погружение в мир нейронных сетей. — «Питер», 2018. — С. 348-360.&lt;br /&gt;
* [https://medium.com/@jonathan_hui/gan-why-it-is-so-hard-to-train-generative-advisory-networks-819a86b3750b Medium | GAN — Why it is so hard to train Generative Adversarial Networks! ]&lt;br /&gt;
* [https://arxiv.org/pdf/1411.1784.pdf CGAN Paper]&lt;br /&gt;
* [https://arxiv.org/pdf/1511.06434.pdf DCGAN Paper]&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;br /&gt;
[[Категория: Порождающие модели]]&lt;/div&gt;</summary>
		<author><name>89.106.174.124</name></author>	</entry>

	</feed>