8
правок
Изменения
Нет описания правки
[[File:Арх_ган.png|450px|thumb|Оригинальная архитектура GAN]]
'''Порождающие состязательные сети''' (англ. ''Generative Adversarial Nets, GAN'') {{---}} алгоритм машинного обучения, входящий в семейство [[:Порождающие модели|порождающих моделей]] и построенный на комбинации из двух нейронных сетей: генеративная модель <tex>G</tex>, одна которая строит приближение распределения данных, и дискриминативная модель <tex>D</tex>, оценивающая вероятность, что образец пришел из которых генерирует образцытренировочных данных, другая пытается отличить настоящие образцы от а не сгенерированныхмоделью <tex>G</tex>. Обучение для модели <tex>G</tex> заключается в максимизации вероятности ошибки дискрминатора <tex>D</tex>. Впервые такие сети были представлены Иэном Гудфеллоу в 2014 году.
==Постановка задачи и метод==
==Оригинальный алгоритм обучения GAN==
[[File:Обучение_ган.png|450px|thumb|right|Визуализация генерирования фотографии с помощью DCGAN по одному и тому же шуму в зависимости от итерации обучения. Источник: https://arxiv.org/pdf/1701.07875.pdf]]
В процессе обучения требуется делать два шага оптимизации поочередно: сначала обновлять веса генератора <tex>\thetagamma_{g}</tex> при фиксированном <tex>\gammagamma_{d}</tex>, а затем веса дискриминатора <tex>\gammagamma_{d}</tex> при фиксированном <tex>\thetagamma_{g}</tex>. На практике дискриминатор обновляется <tex>k</tex> раз вместо одного; , поскольку, полностью оптимизировать дискриминатор вычислительно не выгодно и на конечных сетах он может переобучиться. Таким образом <tex>k</tex> является гиперпараметром.
<font color=green>// num_iteration {{---}} число итераций обучения </font>
$x$ = getBatchFromDataGeneratingDistribution($p_{data}$)
<font color=green>//Обновляем дискриминатор в сторону возрастания его градиента</font>
<tex>d_w \leftarrow \mathop{\nabla}_{\gammagamma_{d}} { \frac{1}{m} \sum_{t = 1}^m \limits} [logD(x_t)] + [log(1-D(G(z_t))] </tex>
'''end''' '''for'''
<font color=green>//Получаем мини-батч $\{z_1, . . . , z_m\}$ из распределения $p_z$ </font>
$z$ = getBatchFromNoisePrior($p_z$)
<font color=green>//Обновляем генератор в сторону убывания его градиента </font>
<tex>g_w \leftarrow \mathop{\nabla}_{\thetagamma_{g}} { \frac{1}{m} \sum_{t = 1}^m \limits} [log(1-D(G(z_t))] </tex>
'''end''' '''for'''
==Улучшение обучения GAN==
[[File:CGAN_architecture.png|450px|thumb|Архитектура CGAN. Источник: https://arxiv.org/pdf/1411.1784.pdf]]
'''Условные порождающие состязательные сети''' (англ. ''Conditional Generative Adversarial Nets, CGAN'') $-$ это модифицированная версия алгоритма GAN, которая позволяет генерировать объекты с дополнительными условиями может быть сконструирована при помощи подачи данных '''y''', являющихся условием для генератора и дискриминатора. '''y''' может быть любой дополнительной информацией, например, меткой класса или данными из других моделей, что может позволить контролировать процесс генерации данных. Добавление данных условий Например, можно подавать параметр '''y''', как условие на класс для генерации чисел, похожих на MNIST. Как уже было упомянуто на вход генератори и дискримантора из GAN подается дополнительная информация '''y''', например в существующую архитектуру осуществляется случае с помощью расширения вектором многослойными перецептронами условие может быть представлено дополнительным входным слоем.В генераторе априорная вероятность шума <tex>p_{z}(z) и условие y</tex> комбинируются в объединённое скрытое представление, а состязательная тренирующая модель предоставляет достаточно свободы в том как это представление составляется.<tex>[https://arxiv.org/pdf/1207.4404.pdf {{---}} Better Mixing via Deep Representations ]</tex>В дискриминаторе '''x''' и '''y''' входных данных генератора и дискриминаторапредставлены как входные параметры.
В таком случае задача оптимизации будет выглядеть следующим образом:
[[File:DCGAN_generator.png|450px|thumb|Архитектура генератора в DCGAN. Источник: https://arxiv.org/pdf/1511.06434.pdf]]
'''DCGAN''' $-$ модификация алгоритма ''GAN'', основными архитектурными изменениями которой являютсяв основе которых лежат сверотчные нейронные сети (''CNN''). Задача поиска удобного представления признаков на больших объемах не размеченных данных является одной из наибольнее активных сфер исследований, в частности представление изображений и видио. Одним из удобных способов поиска представлений может быть '''DCGAN'''. Использование сверточных нейронных сетей напрямую не давало хороших результатов, поэтому было внесены ограничения на слои сверток. Эти ограничения и лежат в основе '''DCGAN''':
* Замена всех пулинговых слоев на страйдинговые свертки (''strided convolutions'') в дискриминаторе и частично-страйдинговые свертки (''fractional-strided''
''convolutions'') в генераторе, что позволяет сетям находить подходящие понижения и повышения размерностей;* Использование батчинговой нормализации для генератора и дискриминатора;, то есть нормализация входа так, чтобы среднее значения было равно нулю и дисперсия была равна единице. Не стоит использовать батч-нормализация для выходного слоя генератора и входного дискриминатор.
* Удаление всех полносвязных скрытых уровней для более глубоких архитектур;
* Использование ''ReLU'' в качестве функции активации в генераторе для всех слоев, кроме последнего, где используется ''tanh'';
''K-Means''. Более подробно об этом вы можете прочитать в статье. <ref> [https://arxiv.org/pdf/1511.06434.pdf Alec Radford, Luke Metz, Soumith Chintala {{---}} Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks]</ref>
==StackGAN(Text to Photo-realistic Image Synthesis with Stacked Generative Adversarial Networks)==
[[File:StackGANexample.jpg|500px|thumb|right| Пример работы порождающей состязателной сети для генерации фото-реалистичных изображений StackGAN. Источник: https://arxiv.org/pdf/1612.03242.pdf]]
'''StackGAN''' $-$ порождающая состязательная сеть для генерации фото-реалистичных изображений(256x256) исходя из текстового описания. Генерировать фото-реалистичные изображения на обычных GAN сложно, поэтому была придумана двух-этапная модель генерации. Stage-I GAN рисует скетчи с примитивными формами и цветами, основанные на текстовом описании, в низком разрешении. Stage-II GAN принимает на вход изображения с первого этапа и текстовое описание и генерирует изображение в высоком разрешении с фото-реалистичными деталями. Чтобы улучшить разнообразие синтезированных изображений и стабилизировать обучение, вместо CGAN использовался метод Conditioning Augmentation.
Раннее использовались CGAN, поскольку на вход им можно было подавать условия, но просто добавляя слои upsampling достичь хороших результатов не удалось. Поэтому основной задачей было повысить разрешение изображений.
Одной из ключевых особенностей StackGAN является Conditioning Augmentation, так как оно позволило расширить количество примеров тренировочного сета, путем небольших случайных изменений в исходных изображениях, что увеличивало многообразие данных. Как показано на картинке, текстовое описание <tex>t</tex> кодировщиком переводится в векторное представление <tex>\varphi_{t}</tex>. Раннее векторное представление нелинейно трансформировалось, чтобы получить скрытые условные переменные, которые подавались на вход генератору, однако простарнство значений скрытых переменных имеет большую размерность, что приводило к разрывам в многообразии данных, что не выгодно для генератора. Чтобы избавиться от этого как раз нужно Conditioning Augmentation, которое в отличии от предоставления фиксированных значений переменных выбирает их из нормального распределения <tex>\mathcal{N}(\mu(\varphi_{t}), \Sigma(\varphi_{t}))</tex>, где среднее значение <tex>\mu(\varphi_{t})</tex> и ковариация <tex>\Sigma(\varphi_{t}))</tex> это функции от входного вектора <tex>\varphi_{t}</tex>. В добавок к уже упомянотому, чтобы сделать многообразие гладким и не переобучиться, нужно добавить регуляризацию, <tex>D_{KL}(\mathcal{N}(\mu(\varphi_{t}), \Sigma(\varphi_{t})) || \mathcal{N}(0, I))</tex> (KL divergence)<ref> [https://ru.wikipedia.org/wiki/Расстояние_Кульбака_—_Лейблера {{--}} Kullback-Leibler divergence]</ref>.
[[File:StackGANProcess.jpg|700px|thumb|Процесс обучения StackGAN. Источник: https://arxiv.org/pdf/1612.03242.pdf]]
Stage-I GAN тренирует дискриминатор <tex>D_{0}</tex> и генератор <tex>G_{0}</tex> поочередной максимизицаии <tex>L_{D_{0}}</tex> и минимизации <tex>L_{G_{0}}, как указано в уравенинях:
<center><tex>L_{D_0} = E_{(I_0, t)\sim p_{data}}[\log D_{0}(I_0, \varphi_t)] + E_{z\sim t, t \sim p_{data}}[\log (1 - D_0(G_{0}(z, \hat{c_0}), \varphi_t))]</tex></center>
<center><tex>L_{G_0} = E_{z\sim t, t \sim p_{data}}[\log (1 - D_0(G_{0}(z, \hat{c_0}), \varphi_t))] + \lambda D_{KL}(\mathcal{N}(\mu(\varphi_{t}), \Sigma(\varphi_{t}) || \mathcal{N}(0, I))</tex></center>
Где реальное изображение <tex>I_0</tex> и описание текста <tex>t</tex> берутся из реального распределения данных <tex>p_{data}</tex>. <tex>z</tex> шумовой вектор взятого случайно из нормального распределения, <tex>\lambda</tex> параметр регуляризации.
В изображениях с низким разрешенеим, сгенерированные Stage-I GAN, обычно недостает ярких деталей и могут быть искривления форм, некоторые детали изображения также могут быть опущены на первом этапе. Stage-II GAN построен над Stage-I GAN и принимает на вход его выход, и текстовое описание, чтобы исправить и дополнить изображение. Его дискриминатор и генератор тренируются путем поочередной макисимизации <tex>L_D</tex> и минимизации <tex>L_G</tex>, как показано в уравнениях:
<center><tex>L_{D} = E_{(I, t)\sim p_{data}}[\log D(I, \varphi_t)] + E_{s_0\sim p_{G_0}, t \sim p_{data}}[\log (1 - D(G(s_0, \hat{c}), \varphi_t))]</tex></center>
<center><tex>L_{G} = E_{s_0\sim p_{G_0}, t \sim p_{data}}[\log (1 - D(G(s_0, \hat{c}), \varphi_t))] + \lambda D_{KL}(\mathcal{N}(\mu(\varphi_{t}), \Sigma(\varphi_{t}) || \mathcal{N}(0, I))</tex></center>
Где <tex>s_0 = G_0(z,\hat{c_0})</tex> результат работы генератора Stage-I GAN и скрытый параметр <tex>hat{c}</tex> подаются на вход дискриминатору и генератору Stage-II GAN, при этом на вход не подается случайное значение, как на первой стадии, поскольку хватает подачи случайного <tex>z</tex> на вход Stage-I GAN. При этом Stage-I GAN и Stage-II GAN имеют разные полно-связные слои, чтобы отличаться по среднему значению и стандартному отклонению, таким образом на разных этапах фокусируюемся на разных деталях исходного текста.
==LAPGAN(Laplacian Pyramid of Adversarial Networks)==
'''LAPGAN''' $$-$$ генеративная параметрическая модель, производящая высоко-качественные изображения. В ее основе лежит каскад сверточных нейронных сетей внутри пирамиды лапласианов, который генерирует изображения в coarse-to-fine стиле. На каждом уровне пирамиды обучается сверточная генеративная модель, используя подход порождающих состязательных сетей. На вход первому слою подается низко-частотное изображение. Такая стратегия позволяет декомпозировать задачу генерации изображений на последовательность уровней, что упрощает ее решение.
Пирамида лапласианов $$-$$ это линейное обратимое представление изображений, состоящее из набора частотных полос изображений. Пусть <tex>d(.)</tex> это операция сжатия изображения размера <tex>j \times j</tex> так, что новое изображение <tex>d(I)</tex> имеет размеры <tex>j/2 \times j/2</tex>, также <tex>u(.)</tex> операция расширения такой, что <tex>u(I)</tex> имеет размеры <tex>2j \times 2j</tex>. Тогда пирамида гаусианов имеет вид <tex>$\mathcal{G}$(I) = [I_0, I_1,..., I_k] где I_0 = I и I_k</tex> представляет собой <tex>k</tex> раз выполненное применение <tex>d(.)</tex>. Коэффициенты <tex>h_k</tex> на каждом уровне пирамиды лапласианов считаются так:
<center><tex>h_k = $\mathcal{L}$_k(I)</tex> = $\mathcal{G}$_k(I) - u($\mathcal{G}$_{k + 1}(I)) = I_k - u(I_{k + 1})</tex></center>
Интуитивно каждый уровень захватывает структуру изображения. Конечный слой пирамиды лапласианов <tex>h_k</tex> это не разница изображений, а низко-частотное представление равное гаусиану <tex>h_k = I_k</tex>. Реконструкция по пирамиде лапласианов происходит обратным проходом по ней:
<center><tex>I_k = u(I_{k + 1}) + h_k</tex></center>
Подход представленный в '''LAPGAN''' работает по такому же принципу, только на каждому шаге вместо коэфициентов <tex>h_k</tex> используются генераторы <tex>\{G_0,G_1,...,G_k\}</tex>, каждый из которых захватывает распределение коэфициентов <tex>h_k</tex> для реальных изображений на разных уровнях пирамиды лапласиана:
<center><tex>\tilde{I_k} = u(\tilde{I_{k + 1}}) + \tilde{h_k} = u(\tilde{I_{k + 1}}) + G_k(z_k, u(\tilde{I_{k + 1}}))</tex></center>
[[File:LAPGANtest.jpg|450px|thumb|right|Процедура семплинга для модели LAPGAN. Источник: https://arxiv.org/pdf/1506.05751.pdf]]
Процедура семплинга для нашей модели '''LAPGAN'''. Начинаем с шума <tex>z_3</tex> и используем генеративную модель <tex>G_3</tex> для создания <tex>\tilde{I_3}</tex>. Потом расширяем изображение до <tex>l_2</tex> для следующиего уровня генерации <tex>G_2</tex>. Вместе с еще одним шумом <tex>z_2</tex> получаем изображение различия <tex>\tilde{I_2}</tex>. Продолжаем процесс, пока не получим <tex>I_0</tex>.
[[File:LAPGANtrain.jpg|450px|thumb|right|Процедура обучения модели LAPGAN. Источник: https://arxiv.org/pdf/1506.05751.pdf]]
Процедура обучения '''LAPGAN'''. Начинаем с изображения <tex>I размера 64 \times 64</tex> из тренировчного набора. Берем <tex>I_0 = I </tex> и сжимаем его(красная стрелка) чтобы получить <tex>I_1</tex>; затем расширяем его(зеленая стрелка), чтобы получить <tex>l_0</tex> низко-частотное изображение <tex>I_0</tex>; с равной вероятностью используем его для создния либо реального, либо сгенерированного примера для дискриминатора <tex>D_0</tex>. В случае реального изображения(синяя стрелка) считаем цветовой контраст <tex>h_0 = I_0 - l_0</tex>, которая подается на вход дискриминатору <tex>D_0</tex>, для опредления реальное изображение или нет. В случае сгенерированного(розовая стрелка), генеративная сеть <tex>G_0</tex> получает на вход шум <tex>z_0 и l_0</tex>. Оно генерирует цветовой контраст <tex>\tilde{h_0} = G_0(z_0,l_0)</tex>, который подается на вход <tex>D_0</tex>. В обоих случаях дискриминатор также получает <tex>l_0</tex> (оранжевая стрелка). Оптимизируя минмакс игру условной порождающей сети <tex>G_0</tex> учится генерировать реалистичную высоко-частотную структуру <tex>\tilde{h_0}</tex> с помощью низко-частотного представления <tex>l_0</tex>. Такая процедура проходит на всех слоях, кроме последнего, где можно уже использовать обычный GAN.
==См. также==
* [https://arxiv.org/pdf/1411.1784.pdf CGAN Paper]
* [https://arxiv.org/pdf/1511.06434.pdf DCGAN Paper]
* [https://arxiv.org/pdf/1612.03242.pdf StackGAN Paper]
* [https://arxiv.org/pdf/1506.05751.pdf LAPGAN Paper]
[[Категория: Машинное обучение]]
[[Категория: Порождающие модели]]