Изменения

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

Generative Adversarial Nets (GAN)

162 байта добавлено, 15:00, 15 января 2021
Нет описания правки
[[File:Арх_ган.png|450px|thumb|Рисунок 1. Оригинальная архитектура GAN]]
'''Порождающие состязательные сети''' (англ. ''Generative Adversarial Nets, GAN'') {{---}} алгоритм машинного обучения, входящий в семейство [[:Порождающие модели|порождающих моделей]] и построенный на комбинации из двух нейронных сетей: генеративная модель <tex>G</tex>, которая строит приближение распределения данных, и дискриминативная модель <tex>D</tex>, оценивающая вероятность, что образец пришел из тренировочных данных, а не сгенерированных моделью <tex>G</tex>. Обучение для модели <tex>G</tex> заключается в максимизации вероятности ошибки дискрминатора <tex>D</tex>. Впервые такие сети были представлены Иэном Гудфеллоу в 2014 году.
==Интуитивный процесс тренировки==
[[File:GANIntuitive.jpg|500px|thumb|right|Рисунок 2. Иллюстрация процесса тренировки порождающих состязательных сетей GAN. Источник: https://arxiv.org/pdf/1701.07875.pdf]]
Генеративные состязательные сети обучаются путем одновременного обновления дискриминирующего распределения (<tex>D</tex> синяя пунктирная линия), так чтобы дискриминатор мог различать объекты из распределения тренировочного сета(черная пунктирная в точку линия) и из распределения генератора (<tex>G</tex> зеленая сплошная линия). Нижняя горизонтальная линия представляет собой область, из которой составлена выборка <tex>z</tex>, в нашем случае равномерно. Горизонтальная линия над ней является частью области <tex>x</tex>. Стрелками на картинке показано, как отображение <tex>x = G(z)</tex>, накладывает неравномерное распределение <tex>p_{g}</tex> на тренировочное. <tex>G</tex> сжимается в областях с высокой плотностью и расширяется в областях с низкой.
Рассмотрим описанный на картинках процесс. (a) Близкая сходимость состязающейся пары: <tex>p_{g}</tex> похоже на распределение <tex>p_{data} и D</tex> частично-точный классификатор. (b) Во внутреннем цикле алгоритма <tex>D</tex> обучается отличать объекты из тренировочных данных, сходясь к <tex>\frac{p_{data}(x)}{p_{data}(x) + p_{g}(x)}</tex>. (c) После обновления <tex>G</tex> градиент <tex>D</tex> привел <tex>G(z)</tex> к передвижению в область, с большей вероятностью быть классифицированным как данные. (d) После нескольких шагов обучения <tex>G</tex> и <tex>D</tex> придут в состояние, в котором не смогу улучшиться, так как будет выполняться условие <tex>p_{g} = p_{data}</tex> и диксриминатор не сможет различать два распределения и его выход всегда будет <tex>D(x) = \frac{1}{2}</tex>.
==Оригинальный алгоритм обучения GAN==
[[File:Обучение_ган.png|450px|thumb|right|Рисунок 3. Визуализация генерирования фотографии с помощью DCGAN по одному и тому же шуму в зависимости от итерации обучения. Источник: https://arxiv.org/pdf/1701.07875.pdf]]
В процессе обучения требуется делать два шага оптимизации поочередно: сначала обновлять веса генератора <tex>\gamma_{g}</tex> при фиксированном <tex>\gamma_{d}</tex>, а затем веса дискриминатора <tex>\gamma_{d}</tex> при фиксированном <tex>\gamma_{g}</tex>. На практике дискриминатор обновляется <tex>k</tex> раз вместо одного, поскольку, полностью оптимизировать дискриминатор вычислительно не выгодно и на конечных сетах он может переобучиться. Таким образом <tex>k</tex> является гиперпараметром.
==Применение==
[[File:прогресс_ганов.jpg|450px|thumb|right|Рисунок 4. Прогресс в генерации фотографий с помощью GAN. Источник: https://twitter.com/goodfellow_ian]]
Чаще всего GAN'ы используются для генерации реалистичных фотографий. Серьезные улучшения в этом направлении были сделаны следующими работами:
==CGAN (Conditional Generative Adversarial Nets)==
[[File:CGAN_architecture.png|450px|thumb|(Рисунок 1) 5. Архитектура 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>
[[File:CGAN_generated.png|450px|thumb|center|Рисунок 6. Цифры, сгенерированные с помощью CGAN. Источник: https://arxiv.org/pdf/1411.1784.pdf]]
[[File:CGAN_generated_tags.PNG|450px|thumb|right|(Рисунок 2)7. Описание картинки. Источник: https://arxiv.org/pdf/1411.1784.pdf]]
Как уже было упомянуто на вход генератора и дискримантора из GAN подается дополнительная информация '''y''', например в случае с многослойными перецептронами условие может быть представлено дополнительным входным слоем. (Рисунок 1)
При создании изображения в генератор поступает скомбинированная информация двух параметров: '''y''' и вектор шума. В случае ''MNIST'' это может быть, например, просто метка класса (от 0 до 9). На выходе из генератора поступает изображение, полученное с помощью транспонированной свертки (происходит деконволюция). Затем полученное изображение поступает в дискриминатор, который в свою очередь применяет операцию, обратную деконволюции, чтобы получить полносвязный слой. Наконец, анализируя полученную информацию (полносвязный слой) и параметр '''y''' дискриминатор принимает решение, является ли изображение сгенерированным.
[[File:CGAN_gen_disc_v2.png|450px|thumb|center|Рисунок 8. Генерация при использовании CGAN]]
Также, используя условные порождающие состязательные сети, можно научить такую сеть генерировать текст по картинке и наоборот. В качестве параметра '''y''' в данном случае передается изображение, которое будет описано.(Рисунок 2)
==DCGAN (Deep Convolutional Generative Adversarial Nets)==
[[File:DCGAN_generator.png|450px|thumb|right|Рисунок 9. Архитектура генератора в DCGAN. Источник: https://arxiv.org/pdf/1511.06434.pdf]]
'''DCGAN''' $-$ модификация алгоритма ''GAN'', в основе которых лежат сверточные нейронные сети (''CNN''). Задача поиска удобного представления признаков на больших объемах не размеченных данных является одной из наибольнее активных сфер исследований, в частности представление изображений и видио. Одним из удобных способов поиска представлений может быть '''DCGAN'''. Использование сверточных нейронных сетей напрямую не давало хороших результатов, поэтому было внесены ограничения на слои сверток. Эти ограничения и лежат в основе '''DCGAN''':
==StackGAN (Text to Photo-realistic Image Synthesis with Stacked Generative Adversarial Networks)==
[[File:StackGANexample.jpg|400px|thumb|right| Рисунок 10. Пример работы порождающей состязателной сети для генерации фото-реалистичных изображений StackGAN. Источник: https://arxiv.org/pdf/1612.03242.pdf]]
'''StackGAN''' $-$ порождающая состязательная сеть для генерации фото-реалистичных изображений (256x256) исходя из текстового описания. Генерировать фото-реалистичные изображения на обычных GAN сложно, поэтому была придумана двух-этапная модель генерации. Stage-I GAN рисует скетчи с примитивными формами и цветами, основанные на текстовом описании, в низком разрешении. Stage-II GAN принимает на вход изображения с первого этапа и текстовое описание и генерирует изображение в высоком разрешении с фото-реалистичными деталями. Чтобы улучшить разнообразие синтезированных изображений и стабилизировать обучение, вместо CGAN использовался метод Conditioning Augmentation.
Одной из ключевых особенностей 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|1000px|thumb|center|Рисунок 11. Процесс обучения 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>
'''LAPGAN''' $-$ генеративная параметрическая модель, представленная пирамидой лапласианов с каскадом сверточных нейронных сетей внутри, которая генерирует изображения постепенно от исходного изображения с низким разрешением к изображению с высоким. На каждом уровне пирамиды обучается сверточная генеративная модель, используя подход порождающих состязательных сетей. Такая стратегия позволяет декомпозировать задачу генерации изображений на последовательность уровней, что упрощает ее решение.
[[File:LAPGANtest.jpg|500px|thumb|right|(Рисунок 1) 12. Процедура семплинга для модели 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|(Рисунок 2) 13. Процедура обучения модели 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>
100
правок

Навигация