Изменения

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

Generative Adversarial Nets (GAN)

4 байта добавлено, 00:56, 24 января 2021
м
Номера рисунков fixed
===Проблема стабильности обучения===
[[File:Unstable_X_Y.png|650px600px|thumb|right|Рисунок 5. Симуляция изменения $x$ и $y$ с помощью градиентного спуска, где изменяя $x$ мы пытается минимизировать $x*y$, а при изменении $y$, наоборот, максимизировать. Шаг градиентного спуска <tex>\alpha = 0.1</tex>. Источник: https://lilianweng.github.io/lil-log/2017/08/20/from-GAN-to-WGAN.html]]
Задача обучения двух состязательных сетей не является задачей поиска локального или глобального минимума функции, а является задачей поиска точки равновесия двух игроков. В теории игр это точка называется точкой равновесия Нэша (англ. Nash equilibrium) в которой оба игрока больше не получают выгоды, хотя следуют оптимальной стратегии.
<tex>f(g(z)) = \lambda d(n, z)</tex>.
[[File:SubspaceManipulation.png|200px|thumb|right|Рисунок 166. Манипулирование подпространством. Источник:<tex>\href{https://arxiv.org/pdf/1907.10786.pdf}{\text{[x]}}</tex>]]
В таком случае выраженность характеристики зависит от "расстояния" до этой гиперплоскости.
Аналогично происходит и в случае нескольких характеристик:
В случае если <tex>\Lambda</tex> {{---}} диагональная, то проблемы запутывания нет.
В противном случае проделаем манипуляции в скрытом подпространстве (рис. 166). Проецируя, можно найти такое направление <tex>n_1 - (n_1^{T} - n_2)n_2</tex> в скрытом подспространстве, что вдоль этих направлений у сгенерированных изображений будем изменяться характеристика $1$ в независимости от характеристики $2$.
При слишком большом "расстоянии" от гиперплоскости соответствующая характеристика слишком сильно делает лицо непохожим на изначальное, но это объяснимо нормальным распределением вектора шума.
==Применение==
[[File:прогресс_ганов.jpg|450px|thumb|right|Рисунок 47. Прогресс в генерации фотографий с помощью GAN. Источник: https://twitter.com/goodfellow_ian]]
Чаще всего GAN'ы используются для генерации реалистичных фотографий (рис. 47). Серьезные улучшения в этом направлении были сделаны следующими работами:
* Auxiliary GAN<ref> [https://arxiv.org/pdf/1610.09585.pdf Augustus Odena {{---}} Conditional Image Synthesis with Auxiliary Classifier GANs]</ref>: вариант GAN-архитектуры, использующий метки данных;
==CGAN (Conditional Generative Adversarial Nets)==
[[File:CGAN_architecture.png|450px|thumb|Рисунок 68. Архитектура CGAN. Источник: https://arxiv.org/pdf/1411.1784.pdf]]
'''Условные порождающие состязательные сети''' (англ. ''Conditional Generative Adversarial Nets, CGAN'') $-$ это модифицированная версия алгоритма GAN, которая может быть сконструирована при помощи передачи дополнительных данных '''y''', являющихся условием для генератора и дискриминатора. '''y''' может быть любой дополнительной информацией, например, меткой класса, изображением или данными из других моделей, что может позволить контролировать процесс генерации данных. Например, можно подавать параметр '''y''', как условие на класс для генерации чисел, похожих на MNIST. Создание таких картинок, в случае передачи картинки в качетсве '''y''' является [[:Задача трансляции изображений|задачей трансляции изображений]]. Пример работы ''CGAN'' на датасете ''MNIST'' с метками классов представленных в виде [[:Векторное представление слов|''one-hot'']] векторов <ref>[https://arxiv.org/pdf/1411.1784.pdf CGAN]</ref> (рис. 59).
[[File:CGAN_generated.png|450px|thumb|center|Рисунок 59. Цифры, сгенерированные с помощью CGAN. Источник: https://arxiv.org/pdf/1411.1784.pdf]]
[[File:CGAN_generated_tags.PNG|450px|thumb|right|Рисунок 810. Описание картинки. Источник: https://arxiv.org/pdf/1411.1784.pdf]]
Как уже было упомянуто на вход генератора и дискримантора из GAN подается дополнительная информация '''y''', например в случае с многослойными перецептронами условие может быть представлено дополнительным входным слоем. (рис. 68)
В генераторе априорная вероятность шума <tex>p_{z}(z)</tex> и условие <tex>y</tex> комбинируются в объединённое скрытое представление, а состязательная тренирующая модель (Обе сети пытаются оптимизировать целевую функцию или функцию потерь. Когда дискриминатор меняет свое поведение, то и генератор меняет, и наоборот) предоставляет достаточно свободы в том как это представление составляется.<ref>[https://arxiv.org/pdf/1207.4404.pdf Yoshua Bengio, Gre ́goire Mesnil, Yann Dauphin and Salah Rifai {{---}} Better Mixing via Deep Representations ]</ref>
В дискриминаторе '''x''' и '''y''' представлены как входные параметры.
В качестве примера использования данного алгоритма можно рассмотреть задачу генерации рукописных цифр.
При создании изображения в генератор поступает скомбинированная информация двух параметров: '''y''' и вектора шума. В случае ''MNIST'' это может быть, например, просто метка класса (от 0 до 9). На выходе из генератора поступает изображение, полученное с помощью транспонированной свертки (происходит деконволюция). Затем полученное изображение комбинируется с '''y''' и поступает в дискриминатор, который в свою очередь применяет свертку, чтобы получить полносвязный слой. Наконец, анализируя полученную информацию (полносвязный слой) дискриминатор принимает решение, является ли изображение сгенерированным. (рис. 711)[[File:CGAN_gen_disc_v2.png|450px|thumb|center|Рисунок 711. Генерация при использовании CGAN]]
Также, используя условные порождающие состязательные сети, можно научить такую сеть генерировать текст по картинке и наоборот. В качестве параметра '''y''' в данном случае передается изображение, которое будет описано (рис. 812).
Более того, для такого типа нейронных сетей, принимающих в качестве параметра '''у''' некоротое изображение местности, в результате может быть получено аналогичное изображение этого места зимой или летом, днем или ночью. Такая задача является [[:Задача трансляции изображений|задачей трансляции изображений]].
==DCGAN (Deep Convolutional Generative Adversarial Nets)==
[[File:DCGAN_generator.png|450px|thumb|right|Рисунок 913. Архитектура генератора в DCGAN. Источник: https://arxiv.org/pdf/1511.06434.pdf]]
'''DCGAN''' $-$ модификация алгоритма ''GAN'', в основе которых лежат сверточные нейронные сети (''CNN''). Задача поиска удобного представления признаков на больших объемах не размеченных данных является одной из наибольнее активных сфер исследований, в частности представление изображений и видио. Одним из удобных способов поиска представлений может быть '''DCGAN''' (рис. 913). Использование сверточных нейронных сетей напрямую не давало хороших результатов, поэтому было внесены ограничения на слои сверток. Эти ограничения и лежат в основе '''DCGAN''':
* Замена всех пулинговых слоев на страйдинговые свертки (''strided convolutions'') в дискриминаторе и частично-страйдинговые свертки (''fractional-strided-convolutions'') в генераторе, что позволяет сетям находить подходящие понижения и повышения размерностей;
==StackGAN (Text to Photo-realistic Image Synthesis with Stacked Generative Adversarial Networks)==
[[File:StackGANexample.jpg|400px|thumb|right|Рисунок 1114. Пример работы порождающей состязателной сети для генерации фото-реалистичных изображений StackGAN. Источник: https://arxiv.org/pdf/1612.03242.pdf]]
'''StackGAN''' $-$ порождающая состязательная сеть для генерации фото-реалистичных изображений (256x256) исходя из текстового описания. Генерировать фото-реалистичные изображения на обычных GAN сложно, поэтому была придумана двух-этапная модель генерации. Stage-I GAN рисует скетчи с примитивными формами и цветами, основанные на текстовом описании, в низком разрешении. Stage-II GAN принимает на вход изображения с первого этапа и текстовое описание и генерирует изображение в высоком разрешении с фото-реалистичными деталями. Чтобы улучшить разнообразие синтезированных изображений и стабилизировать обучение, вместо CGAN использовался метод Conditioning Augmentation.
Раннее использовались CGAN, поскольку на вход им можно было подавать условия, но просто добавляя слои, увеличивающие размер изображения, достичь хороших результатов не удалось. Поэтому основной задачей было повысить разрешение изображений.
Одной из ключевых особенностей StackGAN является Conditioning Augmentation, так как оно позволило расширить количество примеров тренировочного сета, путем небольших случайных изменений в исходных изображениях, что увеличивало многообразие данных. Как показано на картинке, текстовое описание <tex>t</tex> кодировщиком переводится в векторное представление <tex>\varphi_{t}</tex> (рис. 1015). Раннее векторное представление нелинейно трансформировалось, чтобы получить скрытые условные переменные, которые подавались на вход генератору, однако простарнство значений скрытых переменных имеет большую размерность, что приводило к разрывам в многообразии данных, что не выгодно для генератора. Чтобы избавиться от этого как раз нужно 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|1000px|thumb|center|Рисунок 1015. Процесс обучения 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}}</tex>, как указано в уравенинях:
<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_{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 имеют разные полно-связные слои, чтобы отличаться по среднему значению и стандартному отклонению, таким образом на разных этапах фокусируюемся на разных деталях исходного текста (рис. 1114).
==LAPGAN (Laplacian Pyramid of Adversarial Networks)==
'''LAPGAN''' $-$ генеративная параметрическая модель, представленная пирамидой лапласианов с каскадом сверточных нейронных сетей внутри, которая генерирует изображения постепенно от исходного изображения с низким разрешением к изображению с высоким. На каждом уровне пирамиды обучается сверточная генеративная модель, используя подход порождающих состязательных сетей. Такая стратегия позволяет декомпозировать задачу генерации изображений на последовательность уровней, что упрощает ее решение.
[[File:LAPGANtest.jpg|500px|thumb|right|Рисунок 1216. Процедура семплинга для модели LAPGAN. Источник: https://arxiv.org/pdf/1506.05751.pdf]]
Пирамида лапласианов $-$ это линейное обратимое представление изображений, состоящее из набора частотных полос изображений. Пусть <tex>d(\cdot)</tex> - это операция сжатия изображения размера <tex>j \times j</tex> так, что новое изображение <tex>d(I)</tex> имеет размеры <tex>j/2 \times j/2</tex>, также <tex>u(\cdot)</tex> - операция расширения такой, что <tex>u(I)</tex> имеет размеры <tex>2j \times 2j</tex>. Тогда пирамида гаусианов имеет вид <tex>\mathcal{G}(I) = [I_0, I_1,..., I_k]</tex>, где <tex>I_0 = I</tex> и <tex>I_k</tex> представляет собой <tex>k</tex> раз выполненное применение <tex>d(\cdot)</tex>. Коэффициенты <tex>h_k</tex> на каждом уровне пирамиды лапласианов считаются так:
<center><tex>I_k = u(I_{k + 1}) + h_k</tex></center>
[[File:LAPGANtrain.jpg|500px|thumb|right|Рисунок 1317. Процедура обучения модели LAPGAN. Источник: https://arxiv.org/pdf/1506.05751.pdf]]
Подход представленный в '''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>
Процедура семплинга для нашей модели '''LAPGAN''' (рис. 1216). Начинаем с шума <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>.
Процедура обучения '''LAPGAN''' (рис. 1317). Начинаем с изображения <tex>I</tex> размера <tex>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</tex> и <tex>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.
==ControlGAN (Controllable Generative Adversarial Networks)==
[[File:ControlGANConcept.png|350px|thumb|right|Рисунок 1418. Концепт модели ControlGAN. Источник: <tex>\href{https://arxiv.org/pdf/1708.00598.pdf}{\text{[x]}}</tex>]]
Контролируемые порождающие состязательные сети (англ. Controllable Generative Adversarial Nets, '''ControlGAN''') $-$ модифицированная версия алгоритма GAN, состоящая из трех нейронных сетей: генератор, дискриминатор, классификатор. Концепт модели ControlGAN (рис. 1418). Как и в обычной версии алгоритма, генератор пытается обмануть дискриминатор, и одновременно с этим пытается быть классифицированным как нужный класс в классификаторе.
Хоть CGAN и являются самыми популярными моделями для генерации образцов, зависимых от внешних данных, но лучше они умеют генерировать образцы с заданными ярко отличительными чертами (цвет волос, веснушки), но менее явные детали (форма бровей, сережки) вызывают затруднения (Но более поздний StyleGAN2 справляется и с этой задачей). C помощью отделения классификатора от дискриминатора, ControlGAN позволяет контролировать черты образцов. К тому же и само качество сгенерированных изображений может быть улучшено засчет того, что такое разделение на три составляющие дает возможность дискриминатору лучше выполнять свою главную задачу.
Более того, аугменатция данных может помешать некоторым сетям, например, Auxiliary Classifier GAN (ACGAN) обучаться, хотя сам способ может улучшить качество классификации.
[[File:ControlGANPrinciple.png|200px|thumb|right|Рисунок 1519.
Принцип работы. Источник:<tex>\href{https://arxiv.org/pdf/1708.00598.pdf}{\text{[x]}}</tex>]]
Иллюстрация принципа работы сети (рис. 1519). Зеленые линии $-$ результат работы классификатора; оранжевые $-$ дискриминатора. Серые фигуры $-$ образцы из разных классов. Результат генератора обозначается голубыми участками, которыми он показывает распределение образцов, как и пытается быть классифицированным верно.
ControlGAN минимизирует следующие уравнения:
20
правок

Навигация