Generative Adversarial Nets (GAN) — различия между версиями
(→См. также) |
|||
Строка 1: | Строка 1: | ||
[[File:Арх_ган.png|450px|thumb|Оригинальная архитектура GAN]] | [[File:Арх_ган.png|450px|thumb|Оригинальная архитектура GAN]] | ||
− | '''Порождающие состязательные сети''' (англ. ''Generative Adversarial Nets, GAN'') | + | '''Порождающие состязательные сети''' (англ. ''Generative Adversarial Nets, GAN'') {{---}} алгоритм машинного обучения, входящий в семейство [[:Порождающие модели|порождающих моделей]]<sup>[на 28.01.19 не создан]</sup> и построенный на комбинации из двух нейронных сетей, одна из которых генерирует образцы, другая пытается отличить настоящие образцы от сгенерированных. Впервые такие сети были представлены Иэном Гудфеллоу в 2014 году. |
==Постановка задачи и метод== | ==Постановка задачи и метод== | ||
Строка 12: | Строка 12: | ||
Наша задача выучить распределение <tex>p_{gen}</tex> так, чтобы оно как можно лучше описывало <tex>p_{data}</tex>. Зададим функцию ошибки для получившейся модели. Со стороны дискриминатора мы хотим распознавать образцы из <tex>X</tex> как правильные, т.е в сторону единицы, и образцы из <tex>G</tex> как неправильные, т.е в сторону нуля, таким образом нужно максимизировать следующую величину: | Наша задача выучить распределение <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> | + | <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> играют в так называемую ''минимаксную игру'', решая следующую задачу оптимизации: | Со стороны же генератора требуется научиться "обманывать" дискриминатор, т.е минимизировать по <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> | + | <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> | Теоретическое обоснование того, что такой метод заставляет <tex>p_{gen}</tex> сходится к <tex>p_{data}</tex> описано в исходной статье. <ref> [https://arxiv.org/pdf/1406.2661.pdf Ian J. Goodfellow {{---}} Generative Adversarial Nets]</ref> | ||
Строка 41: | Строка 41: | ||
Большинство GAN'ов подвержено следующим проблемам: | Большинство GAN'ов подвержено следующим проблемам: | ||
− | * Несходимость (non-convergence): параметры модели дестабилизируются и не сходятся | + | * Несходимость (non-convergence): параметры модели дестабилизируются и не сходятся; |
− | * Схлопывание мод распределения (mode collapse): генератор коллапсирует, т.е выдает ограниченное количество разных образцов | + | * Схлопывание мод распределения (mode collapse): генератор коллапсирует, т.е выдает ограниченное количество разных образцов; |
− | * Исчезающий градиент (diminished gradient): дискриминатор становится слишком "сильным", а градиент генератора исчезает и обучение не происходит | + | * Исчезающий градиент (diminished gradient): дискриминатор становится слишком "сильным", а градиент генератора исчезает и обучение не происходит; |
* Высокая чувствительность к гиперпараметрам. | * Высокая чувствительность к гиперпараметрам. | ||
Универсального подхода к их решению нет, но существуют практические советы<ref> [https://github.com/soumith/ganhacks How to Train a GAN? Tips and tricks to make GANs work]</ref>, которые могут помочь. Основными из них являются: | Универсального подхода к их решению нет, но существуют практические советы<ref> [https://github.com/soumith/ganhacks How to Train a GAN? Tips and tricks to make GANs work]</ref>, которые могут помочь. Основными из них являются: | ||
− | # Нормализация данных. Все признаки в диапазоне $[-1; 1]$ | + | # Нормализация данных. Все признаки в диапазоне $[-1; 1]$; |
− | # Замена функции ошибки для $G$ с $\min log (1-D)$ на $\max log D$, потому что исходный вариант имеет маленький градиент на раннем этапе обучения и большой градиент при сходимости, а предложенный наоборот | + | # Замена функции ошибки для $G$ с $\min log (1-D)$ на $\max log D$, потому что исходный вариант имеет маленький градиент на раннем этапе обучения и большой градиент при сходимости, а предложенный наоборот; |
− | # Сэмплирование из многомерного нормального распределения вместо равномерного | + | # Сэмплирование из многомерного нормального распределения вместо равномерного; |
− | # Использовать нормализационные слои (например, batch normalization или layer normalization) в $G$ и $D$ | + | # Использовать нормализационные слои (например, batch normalization или layer normalization) в $G$ и $D$; |
# Использовать метки для данных, если они имеются, т.е обучать дискриминатор еще и классифицировать образцы. | # Использовать метки для данных, если они имеются, т.е обучать дискриминатор еще и классифицировать образцы. | ||
Строка 59: | Строка 59: | ||
Чаще всего GAN'ы используются для генерации реалистичных фотографий. Серьезные улучшения в этом направлении были сделаны следующими работами: | Чаще всего GAN'ы используются для генерации реалистичных фотографий. Серьезные улучшения в этом направлении были сделаны следующими работами: | ||
− | * Auxiliary GAN<ref> [https://arxiv.org/pdf/1610.09585.pdf Augustus Odena {{---}} Conditional Image Synthesis with Auxiliary Classifier GANs]</ref>: вариант 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 с новым подходом решения проблемы нестабильного обучения через спектральную нормализацию | + | * 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, основанный на механизме внимания | + | * 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 с ортогональной регуляризацией, позволившей разрешить проблему коллапсирования при долгом обучении | + | * 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 одного домена на другой, например, лошадей на зебр | + | * 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>: создает изображения с высоким разрешением из более низкого разрешения | + | * 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>: создает изображения по семантической окраске | + | * 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>: создает изображения по заданному тексту | + | * 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>: генерирует последовательность нот, таким образом, создает мелодию. | * MidiNet<ref> [https://arxiv.org/abs/1703.10847 Li-Chia Yang {{---}} MIDINET: A CONVOLUTIONAL GENERATIVE ADVERSARIAL NETWORK FOR SYMBOLIC-DOMAIN MUSIC GENERATION]</ref>: генерирует последовательность нот, таким образом, создает мелодию. | ||
Строка 93: | Строка 93: | ||
'''DCGAN''' $-$ модификация алгоритма ''GAN'', основными архитектурными изменениями которой являются: | '''DCGAN''' $-$ модификация алгоритма ''GAN'', основными архитектурными изменениями которой являются: | ||
* Замена всех пулинговых слоев на страйдинговые свертки (''strided convolutions'') в дискриминаторе и частично-страйдинговые свертки (''fractional-strided'' | * Замена всех пулинговых слоев на страйдинговые свертки (''strided convolutions'') в дискриминаторе и частично-страйдинговые свертки (''fractional-strided'' | ||
− | ''convolutions'') в генераторе | + | ''convolutions'') в генераторе; |
− | * Использование батчинговой нормализации для генератора и дискриминатора | + | * Использование батчинговой нормализации для генератора и дискриминатора; |
− | * Удаление всех полносвязных скрытых уровней для более глубоких архитектур | + | * Удаление всех полносвязных скрытых уровней для более глубоких архитектур; |
− | * Использование ''ReLU'' в качестве функции активации в генераторе для всех слоев, кроме последнего, где используется ''tanh'' | + | * Использование ''ReLU'' в качестве функции активации в генераторе для всех слоев, кроме последнего, где используется ''tanh''; |
* Использование ''LeakyReLU'' в качестве функции активации в дискриминаторе для всех слоев. | * Использование ''LeakyReLU'' в качестве функции активации в дискриминаторе для всех слоев. | ||
Версия 23:29, 30 января 2019
Порождающие состязательные сети (англ. Generative Adversarial Nets, GAN) — алгоритм машинного обучения, входящий в семейство порождающих моделей[на 28.01.19 не создан] и построенный на комбинации из двух нейронных сетей, одна из которых генерирует образцы, другая пытается отличить настоящие образцы от сгенерированных. Впервые такие сети были представлены Иэном Гудфеллоу в 2014 году.
Содержание
Постановка задачи и метод
Имеется множество образцов
из распределения , заданного на , а также некоторое пространство латентных факторов из распределения , например, случайные вектора из равномерного распределения .Рассмотрим две нейронные сети: первая $-$ генератор
с параметрами , цель которой сгенерировать похожий образец из , и вторая $-$ дискриминатор с параметрами , цель которой выдавать максимальную оценку на образцах из и минимальную на сгенерированных образцах из . Распределение, порождаемое генератором будем обозначать . Так же заметим, что в текущем изложении не принципиальны архитектуры нейронных сетей, поэтому можно считать, что параметры и являются просто параметрами многослойных персептронов.В качестве примера можно рассматривать генерацию реалистичных фотографий: в этом случае, входом для генератора может быть случайный многомерный шум, а выходом генератора (и входом для дискриминатора) RGB-изображение; выходом же для дискриминатора будет вероятность, что фотография настоящая, т.е число от 0 до 1.
Наша задача выучить распределение
так, чтобы оно как можно лучше описывало . Зададим функцию ошибки для получившейся модели. Со стороны дискриминатора мы хотим распознавать образцы из как правильные, т.е в сторону единицы, и образцы из как неправильные, т.е в сторону нуля, таким образом нужно максимизировать следующую величину:Со стороны же генератора требуется научиться "обманывать" дискриминатор, т.е минимизировать по
второе слагаемое предыдущего выражения. Другими словами, и играют в так называемую минимаксную игру, решая следующую задачу оптимизации:Теоретическое обоснование того, что такой метод заставляет [1]
сходится к описано в исходной статье.Оригинальный алгоритм обучения GAN
В процессе обучения требуется делать два шага оптимизации поочередно: сначала обновлять веса генератора
при фиксированном , а затем веса дискриминатора при фиксированном . На практике дискриминатор обновляется раз вместо одного; является гиперпараметром.// num_iteration — число итераций обучения function GAN: for i = 1..num_iteration do for j = 1..k do $z$ = getBatchFromNoisePrior($p_z$) //Получаем мини-батч $\{z_1, . . . , z_m\}$ из распределения $p_z$ $x$ = getBatchFromDataGeneratingDistibution($p_{data}$) //Получаем мини-батч $\{x_1, . . . , x_m\}$ из распределения $p_{data}$//Обновляем дискриминатор в сторону возрастания его градиента end for $z$ = getBatchFromNoisePrior($p_z$) //Получаем мини-батч $\{z_1, . . . , z_m\}$ из распределения $p_z$ //Обновляем генератор в сторону убывания его градиента end for
Обновления на основе градиента могут быть сделаны любым стандартным способом, например, в оригинальной статье использовался стохастический градиентный спуск[на 28.01.19 не создан] с импульсом.
Улучшение обучения GAN
Большинство GAN'ов подвержено следующим проблемам:
- Несходимость (non-convergence): параметры модели дестабилизируются и не сходятся;
- Схлопывание мод распределения (mode collapse): генератор коллапсирует, т.е выдает ограниченное количество разных образцов;
- Исчезающий градиент (diminished gradient): дискриминатор становится слишком "сильным", а градиент генератора исчезает и обучение не происходит;
- Высокая чувствительность к гиперпараметрам.
Универсального подхода к их решению нет, но существуют практические советы[2], которые могут помочь. Основными из них являются:
- Нормализация данных. Все признаки в диапазоне $[-1; 1]$;
- Замена функции ошибки для $G$ с $\min log (1-D)$ на $\max log D$, потому что исходный вариант имеет маленький градиент на раннем этапе обучения и большой градиент при сходимости, а предложенный наоборот;
- Сэмплирование из многомерного нормального распределения вместо равномерного;
- Использовать нормализационные слои (например, batch normalization или layer normalization) в $G$ и $D$;
- Использовать метки для данных, если они имеются, т.е обучать дискриминатор еще и классифицировать образцы.
Применение
Чаще всего GAN'ы используются для генерации реалистичных фотографий. Серьезные улучшения в этом направлении были сделаны следующими работами:
- Auxiliary GAN[3]: вариант GAN-архитектуры, использующий метки данных;
- SN-GAN[4]: GAN с новым подходом решения проблемы нестабильного обучения через спектральную нормализацию;
- SAGAN[5]: GAN, основанный на механизме внимания;
- BigGAN[6]: GAN с ортогональной регуляризацией, позволившей разрешить проблему коллапсирования при долгом обучении;
Кроме простой генерации изображений, существуют достаточно необычные применения, дающие впечатляющие результаты не только на картинках, но и на звуке:
- CycleGAN[7]: меняет изображения c одного домена на другой, например, лошадей на зебр;
- SRGAN[8]: создает изображения с высоким разрешением из более низкого разрешения;
- Pix2Pix[9]: создает изображения по семантической окраске;
- StackGAN[10]: создает изображения по заданному тексту;
- MidiNet[11]: генерирует последовательность нот, таким образом, создает мелодию.
CGAN (Conditional Generative Adversarial Nets)
Условные порождающие состязательные сети (англ. Conditional Generative Adversarial Nets, CGAN) $-$ это модифицированная версия алгоритма GAN, которая позволяет генерировать объекты с дополнительными условиями y. y может быть любой дополнительной информацией, например, меткой класса или данными из других моделей. Добавление данных условий в существующую архитектуру осуществляется с помощью расширения вектором y входных данных генератора и дискриминатора.
В таком случае задача оптимизации будет выглядеть следующим образом:
В качестве примера использования данного алгоритма можно рассмотреть задачу генерации рукописных цифр. CGAN был натренирован на датасете MNIST с метками классов представленных в виде one-hot векторов.
DCGAN (Deep Convolutional Generative Adversarial Nets)
DCGAN $-$ модификация алгоритма GAN, основными архитектурными изменениями которой являются:
- Замена всех пулинговых слоев на страйдинговые свертки (strided convolutions) в дискриминаторе и частично-страйдинговые свертки (fractional-strided
convolutions) в генераторе;
- Использование батчинговой нормализации для генератора и дискриминатора;
- Удаление всех полносвязных скрытых уровней для более глубоких архитектур;
- Использование ReLU в качестве функции активации в генераторе для всех слоев, кроме последнего, где используется tanh;
- Использование LeakyReLU в качестве функции активации в дискриминаторе для всех слоев.
Помимо задачи генерации объектов, данный алгоритм хорошо показывает себя в качестве feature extractor'а. Данный алгоритм был натренирован на датасете Imagenet-1k, после чего были использованы значения со сверточных слоев дискриминатора, подвергнутые max-pooling'у, чтобы образовать матрицы [12]
и получить общий вектор признаков на их основе. L2-SVM с данным feature extractor'ом на датасете CIFAR-10 превосходит по точности решения, основанные на алгоритме K-Means. Более подробно об этом вы можете прочитать в статье.
См. также
- Порождающие модели[на 28.01.19 не создан]
- Variational autoencoder (VAE)[на 28.01.19 не создан]
Примечания
- ↑ Ian J. Goodfellow — Generative Adversarial Nets
- ↑ How to Train a GAN? Tips and tricks to make GANs work
- ↑ Augustus Odena — Conditional Image Synthesis with Auxiliary Classifier GANs
- ↑ Takeru Miyato — SPECTRAL NORMALIZATION FOR GENERATIVE ADVERSARIAL NETWORKS
- ↑ Han Zhang — Self-Attention Generative Adversarial Networks
- ↑ Andrew Brock — LARGE SCALE GAN TRAINING FOR HIGH FIDELITY NATURAL IMAGE SYNTHESIS
- ↑ Jun-Yan Zhu & Taesung Park — Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks
- ↑ Christian Ledig — Photo-Realistic Single Image Super-Resolution Using a Generative Adversarial Network
- ↑ Phillip Isola — Image-to-Image Translation with Conditional Adversarial Nets
- ↑ Han Zhang — StackGAN: Text to Photo-realistic Image Synthesis with Stacked Generative Adversarial Networks
- ↑ Li-Chia Yang — MIDINET: A CONVOLUTIONAL GENERATIVE ADVERSARIAL NETWORK FOR SYMBOLIC-DOMAIN MUSIC GENERATION
- ↑ Alec Radford, Luke Metz, Soumith Chintala — Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks
Источники информации
- Сергей Николенко, Артур Кадурин, Екатерина Архангельская. Глубокое обучение. Погружение в мир нейронных сетей. — «Питер», 2018. — С. 348-360.
- Medium | GAN — Why it is so hard to train Generative Adversarial Networks!
- CGAN Paper
- DCGAN Paper