[PYTHON] GAN: DCGAN Part3 - Comprendre Wasserstein GAN

Cible

Il s'agit d'une continuation de DCGAN utilisant le Microsoft Cognitive Toolkit (CNTK).

Dans la partie 3, nous formerons WassersteinGAN par CNTK en utilisant les données d'image préparées dans la partie 1. On suppose que CNTK et NVIDIA GPU CUDA sont installés.

introduction

GAN: DCGAN Part2-Training DCGAN model traitait du modèle de génération de visage par Deep Convolutional Generative Adversarial Network (DCGAN), nous avons donc créé Wasserstein GAN dans la troisième partie. Et former.

Wasserstein GAN La structure de réseau de Wasserstein GAN [1] implémentée cette fois est la même que Part2.

Cependant, Wasserstein GAN n'utilise pas la fonction sigmoïde dans la couche de sortie de Discriminator, donc Discriminator est appelé Critic. Cette implémentation remplace également toutes les normalisations de lots critiques par la normalisation de couche [2].

La différence entre le GAN original [3] (appelons-le Vanilla GAN (VGAN)) et Wasserstein GAN (WGAN) sera expliquée plus tard.

Paramètres en formation

La valeur initiale des paramètres de la couche convolution / convolution de translocation a été fixée à la distribution normale [4] avec une variance de 0,02.

La fonction de perte implémentée cette fois est illustrée dans l'équation suivante. [5]

\max_{C} \mathbb{E}_{x \sim p_{r}(x)}[C(x)] - \mathbb{E}_{z \sim p_z(z)}[C(G(z))] + \lambda \mathbb{E}_{x' \sim p_{x'}(x')}(||\nabla_{x'} C(x')||_2 - 1)^2 \\
\min_{G} -\mathbb{E}_{z \sim p_z(z)}[C(G(z))] \\
x' = \epsilon x + (1 - \epsilon) G(z), \epsilon \sim U[0, 1]

Où $ C $ et $ G $ représentent respectivement Critic et Generator, $ x $ est l'image d'entrée, $ z $ est la variable latente, $ p_r $ est la distribution des données d'image réelles et $ p_z $ est la fausse image. La distribution antérieure qui produit les données, $ U $, représente une distribution uniforme. Cette fois, j'ai implémenté Wasserstein GAN avec une pénalité de gradient [5] et mis $ \ lambda $ à 10.

Adam [6] a été utilisé comme algorithme d'optimisation pour Generator et Discriminator. Le taux d'apprentissage a été fixé à 1e-4, l'hyperparamètre d'Adam $ β_1 $ a été défini sur 0,0 et $ β_2 $ a été défini sur la valeur par défaut de CNTK.

La formation du modèle a effectué 50000 itérations avec une formation en mini-lot de taille mini-lot 16.

la mise en oeuvre

Environnement d'exécution

Matériel

・ Processeur Intel (R) Core (TM) i7-6700K 4,00 GHz ・ GPU NVIDIA GeForce GTX 1060 6 Go

Logiciel

・ Windows 10 Professionnel 1909 ・ CUDA 10.0 ・ CuDNN 7.6 ・ Python 3.6.6 ・ Cntk-gpu 2.7 ・ Opencv-contrib-python 4.1.1.26 ・ Numpy 1.17.3 ・ Pandas 0.25.0

Programme à exécuter

Le programme de formation est disponible sur GitHub.

wgan_training.py


Commentaire

Bien que cela manque de preuves et de rigueur à certains endroits, je voudrais approfondir ma compréhension des mathématiques du GAN.

Pour ce faire, nous partons des échelles probabilistes de divergence Kullback-Leibler et de divergence Jensen-Shannon.

Kullback-Leibler divergence and Jensen-Shannon divergence

** La divergence de Kullback-Leibler ** est une mesure des deux distributions de probabilité $ P (x) et Q (x) $. $ H $ représente l'entropie.

\begin{align}
D_{KL} (P || Q) &= \sum_x P(x) \log \frac{P(x)}{Q(x)}  \\
&= H(P, Q) - H(P)
\end{align}

Cependant, la divergence KL n'a pas de symétrie, c'est-à-direD_{KL} (P || Q) \neq D_{KL} (Q || P)est.

L'entropie $ H $ est exprimée par la formule suivante.

H(P, Q) = \mathbb{E}_{x \sim P(x)} [- \log Q(x)] \\
H(P) = \mathbb{E}_{x \sim P(x)} [- \log P(x)]

Si la notation est légèrement modifiée en utilisant ceci, elle peut être exprimée comme suit.

\begin{align}
D_{KL} (P || Q) &= H(P, Q) - H(P) \\
&= \mathbb{E}_{x \sim P(x)} [- \log Q(x)] - \mathbb{E}_{x \sim P(x)} [- \log P(x)] \\
&= \mathbb{E}_{x \sim P(x)} [- \log Q(x) - (- \log P(x))] \\
&= \mathbb{E}_{x \sim P(x)} [\log P(x) - \log Q(x)] \\
\end{align}

En revanche, la ** divergence Jensen-Shannon **, qui est une version dérivée de la divergence KL, est définie comme suit.

D_{JS} (P || Q) = \frac{1}{2} D_{KL} (P || M) + \frac{1}{2} D_{KL} (Q || M) \\
M = \frac{P + Q}{2}

La divergence JS a une symétrie et est $ 0 \ leq D_ {JS} \ leq 1 $. Par conséquent, une grande divergence JS signifie que les deux distributions ne sont pas similaires, et une petite divergence JS signifie que les deux distributions sont similaires.

Vanilla GAN Le modèle de génération incluant GAN vise à acquérir un tel modèle de génération basé sur l'hypothèse que les données réellement observées ont un modèle de génération.

Tout d'abord, soit $ D et G $ Discriminator, Generator, $ p_r $ la distribution de données réelles et $ p_z $ la distribution précédente pour générer de fausses données. Aussi, laissez les fonctions d'évaluation de Discriminator et Generator être $ V_D et V_G $.

Considérant que Discriminator est un problème de distinction entre les données authentiques et les fausses données, la fonction d'évaluation de Discriminator peut être exprimée par la formule suivante.

V_D = \mathbb{E}_{x \sim p_r(x)}[\log D(x)] + \mathbb{E}_{z \sim p_z(z)}[\log (1 - D(G(z)))]

De plus, si nous introduisons un jeu à somme nulle dans lequel la somme des gains des fonctions d'évaluation Discriminator et Generator est 0, il est naturel de définir la fonction d'évaluation Generator comme suit.

V_G = - V_D

Ici, le solde de Nash du jeu à somme nulle (la solution qui est le minimum local pour $ V_D $ et le minimum local pour $ V_G $) est connu pour être la solution minimax, donc la fonction de perte de VGAN est définie.

\min_G \max_D V(G, D) = \mathbb{E}_{x \sim p_r(x)}[\log D(x)] + \mathbb{E}_{z \sim p_z(z)}[\log (1 - D(G(z)))]

Nous devons maintenant montrer que le problème d'optimisation dans l'équation ci-dessus a une solution unique $ G ^ * $, qui est $ p_g = p_r $. À ce moment-là, la formule suivante est utilisée comme une compréhension implicite.

\mathbb{E}_{z \sim p_z(z)}[\log (1 - D(G(z)))] = \mathbb{E}_{x \sim p_g(x)}[\log (1 - D(x))]

Considérant la fonction de perte de VGAN comme une fonction continue,

\begin{align}
V(G, D) &= \int_x p_r(x) \log(D(x))dx + \int_z p_z(z) \log(1 - D(G(z)))dz \\
&= \int_x p_r(x) \log(D(x)) + p_g(x) \log(1 - D(x))dx
\end{align}

Ici, en considérant le point critique de la fonction $ f (y) = a \ log y + b \ log (1-y) $, il est différencié à 0, donc

f'(y) = 0 \Rightarrow \frac{a}{y} - \frac{b}{1 - y} = 0 \Rightarrow y = \frac{a}{a + b}

Aussi, en considérant la double différenciation dans $ \ frac {a} {a + b} $, on peut voir qu'elle est convexe vers le haut car elle est $ a, b \ in (0, 1) $.

f'' \left( \frac{a}{a + b} \right) = - \frac{a}{(\frac{a}{a + b})^2} - \frac{b}{(1 - \frac{a}{a + b})^2} < 0

Par conséquent, $ \ frac {a} {a + b} $ est le maximum. Donc,

\begin{align}
V(G, D) &= \int_x p_r(x) \log(D(x))dx + \int_z p_z(z) \log(1 - D(G(z)))dz \\
&\leq \int_x \max_y p_r(x) \log(D(x)) + p_g(x) \log(1 - D(x))dx
\end{align}

Il s'avère que la valeur maximale est quand $ D_ {G} (x) = \ frac {p_r} {p_r + p_g} $, ce qui est une solution suffisamment unique. Cependant, il n'est pas possible de trouver réellement la solution optimale pour $ D $. Parce qu'il n'y a aucun moyen de connaître la vraie distribution réelle des données $ p_r $. Cependant, il s'avère que $ p_r $ indique l'existence d'une solution optimale pour $ G $, et que l'entraînement devrait se concentrer sur l'approximation de $ D $.

Ensuite, en considérant la solution optimale pour Generator, je voudrais réitérer que l'objectif final de GAN est $ p_g = p_r $. À l'heure actuelle, $ D_ {G} ^ {*} $ est

D_{G}^{*} = \frac{p_r}{p_r + p_g} = \frac{1}{2}

Ce sera. Étant donné le problème de minimisation du générateur lorsque $ D_ {G} ^ {*} $ est obtenu,

\begin{align}
\max_D V(G, D_{G}^{*}) &= \mathbb{E}_{x \sim p_r(x)}[\log D_{G}^{*}(x)] + \mathbb{E}_{z \sim p_z(z)}[\log (1 - D_{G}^{*}(G(z)))] \\
&= \mathbb{E}_{x \sim p_r(x)}[\log D_{G}^{*}(x)] + \mathbb{E}_{x \sim p_g(x)}[\log (1 - D_{G}^{*}(x))] \\
&= \mathbb{E}_{x \sim p_r(x)} \left[\log \frac{p_r}{p_r + p_g} \right] + \mathbb{E}_{x \sim p_g(x)} \left[\log \frac{p_g}{p_r + p_g} \right] \\
&= \mathbb{E}_{x \sim p_r(x)} [\log p_r - \log (p_r + p_g)] + \mathbb{E}_{x \sim p_g(x)} [\log p_g - \log (p_r + p_g)] \\
&= \mathbb{E}_{x \sim p_r(x)} \left[\log p_r - \log \left(\frac{p_r + p_g}{2} \cdot 2 \right) \right] + \mathbb{E}_{x \sim p_g(x)} \left[\log p_g - \log \left(\frac{p_r + p_g}{2} \cdot 2 \right) \right] \\
&= \mathbb{E}_{x \sim p_r(x)} \left[\log p_r - \log \left(\frac{p_r + p_g}{2} \right) - \log 2 \right] + \mathbb{E}_{x \sim p_g(x)} \left[\log p_g - \log \left(\frac{p_r + p_g}{2} \right) - \log 2 \right] \\
&= \mathbb{E}_{x \sim p_r(x)} \left[\log p_r - \log \left(\frac{p_r + p_g}{2} \right) \right] + \mathbb{E}_{x \sim p_r(x)} [- \log 2] + \mathbb{E}_{x \sim p_g(x)} \left[\log p_g - \log \left(\frac{p_r + p_g}{2} \right) \right] + \mathbb{E}_{x \sim p_g(x)} [ - \log 2] \\
\end{align}

Ici, en utilisant la divergence KL,

\begin{align}
\max_D V(G, D_{G}^{*}) = D_{KL} \left(p_r \middle| \middle| \frac{p_r + p_g}{2} \right) + D_{KL} \left(p_g \middle| \middle| \frac{p_r + p_g}{2} \right) - \log 4
\end{align}

De plus, si $ \ frac {p_r + p_g} {2} = M $, alors à partir de la divergence JS,

\max_D V(G, D_{G}^{*}) = 2 \cdot D_{JS} (p_r || p_g) - \log 4

Par conséquent, lorsque $ p_g = p_r $, nous trouvons que nous avons $ - \ log 4 $ comme candidat pour le minimum global, et en même temps nous pouvons penser au problème de minimisation du générateur comme minimisant la divergence JS.

À partir du contexte théorique ci-dessus, il est possible d'apprendre le modèle de génération avec une expressivité suffisante et des données réelles, mais il est toujours difficile de former le GAN.

Wasserstein GAN Un article analysant GAN [7] a clarifié la raison pour laquelle la formation VGAN était difficile, et les auteurs de cet article ont proposé WGAN [[1]](# reference) comme solution. #C'est une référence.

Dans VGAN, Generator s'est finalement adapté à la divergence JS, mais dans WGAN, il s'est adapté à la distance de Wasserstein.

La distance de Wasserstein, également connue sous le nom de distance Earth-Mover (EM), est une mesure basée sur des problèmes d'optimisation du transport, où elle représente le coût de rapprochement d'une distribution de probabilité d'une autre.

W(p_r, p_g) = \inf_{\gamma \in \Pi(p_r, p_g)} \mathbb{E}_{(x, y) \sim \gamma} [||x - y||]

La distance de Wasserstein a des propriétés bénéfiques que l'on ne trouve pas dans la divergence KL ou la divergence JS. Si les deux distributions de probabilité ne se chevauchent pas, la divergence KL divergera et la divergence JS sera $ \ log 2 $, ce qui la rendra impossible à distinguer, mais la distance de Wasserstein aura une valeur lisse et donc un gradient. L'optimisation par la loi est stable.

Et la distance de Wasserstein est transformée sur la base de la dualité Kantorovich-Rubinstein pour obtenir une fonction de perte comme celle ci-dessous. Où $ C, G $ signifie Critic, Generator.

\min_G \max_{||C||_L \leq K} \mathbb{E}_{x \sim p_r(x)}[C(x)] - \mathbb{E}_{z \sim p_z(z)}[C(G(z))]

Cependant, la distance de Wasserstein est soumise à une contrainte appelée continuité de Lipshitz, et nous utilisons la méthode d'écrêtage du paramètre de poids pour garantir cela.

Cependant, comme le découpage de poids est une méthode de force brute, l'entraînement peut échouer et la pénalité de gradient [5] a été proposée comme remède.

La pénalité de gradient tire parti du fait que dans Critic optimisé, la norme L2 du gradient pour tout point entre les données réelles et générées est 1, et lorsque la fonction de perte a une norme L2 de gradient autre que 1. C'est un moyen de pénaliser.

\lambda \mathbb{E}_{x' \sim p_{x'}(x')}(||\nabla_{x'} C(x')||_2 - 1)^2

Tout point $ x '$ entre les données réelles et les données générées est représenté par une image qui est un mélange aléatoire des données d'image réelles et des données d'image générées par le générateur.

x' = \epsilon x + (1 - \epsilon) G(z), \epsilon \sim U[0, 1]

De plus, l'écrêtage de poids et la pénalité de gradient sont trop restrictifs et réduisent l'expressivité du générateur, donc DRAGAN [[8]](] utilise un terme de régularisation qui rapproche la norme L2 du gradient de 1 au voisinage des données réelles. #) Est également proposé.

résultat

Fonctions de perte du discriminateur et du générateur

La figure ci-dessous est une visualisation de chaque fonction de perte pendant l'entraînement. L'axe horizontal représente le nombre de répétitions et l'axe vertical représente la valeur de la fonction de perte. Les valeurs de Critic et Generator sont très importantes.

wgan_logging.png

Images générées et transitions pendant la formation

La figure ci-dessous montre l'image du visage générée par le générateur formé. Certaines images ont échoué malgré la fonction de perte importante, mais elles semblent produire une meilleure image du visage que la partie 2.

wgan_image.png

La figure ci-dessous montre la transition de la génération d'image pendant l'entraînement avec animation.

wgan.gif

Évaluation quantitative par score initial

Lorsque j'ai mesuré le score de lancement [10] avec Inception-v3 [9] comme dans la partie 2, les résultats suivants ont été obtenus.

Inception Score 2.14

référence

CNTK 206 Part C: Wasserstein and Loss Sensitive GAN with CIFAR Data

GAN : DCGAN Part1 - Scraping Web images GAN : DCGAN Part2 - Training DCGAN model

  1. Martin Arjovsky, Soumith Chintala, and Leon Bottou, "Wasserstein GAN", arXiv preprint arXiv:1701.07875 (2017).
  2. Jimmy Lei Ba, Jamie Ryan Kiros, and Geoffrey E. Hinton. "Layer Normalization", arXiv preprint arXiv:1607.06450 (2016).
  3. Ian J. Goodfellow, Jean Pouget-Abadie, Mehdi Mira, Bing Xu, David Warde-Farley, Sherjil Ozair, Aaron Courville, and Yoshua Bengio. "Generative Adversarial Nets", Advances in neural information processing systems. 2014, pp 2672-2680.
  4. Alec Radford, Luke Metz, and Soumith Chintal. "Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks", arXiv preprint arXiv:1511.06434 (2015).
  5. Ishaan Gulrahani, Faruk Ahmed, Martin Arjovsky, Vincent DuMoulin, and Aron Courville. "Improved Training of Wasserstein GANs", Neural Information Processing Systems (NIPS). 2017, pp 5767-5777.
  6. Diederik P. Kingma and Jimmy Lei Ba. "Adam: A method for stochastic optimization", arXiv preprint arXiv:1412.6980 (2014).
  7. Martin Arjovsky and Leon Bottou, "Towards Princiled Methods for Training Generative Adversarial Networks", International Conference on Learning Representations (ICLR). 2017.
  8. Naveen Kodali, Hacob Avernethy, James Hays, and Zsolt Kira, "On Covergence and Stability of GANs", arXiv preprint arXiv:1705.07215.
  9. Christian Szegedy, Vincent Vanhoucke, Sergey Ioffe, Jon Shlens, and Zbigniew Wojna. "Rethinking the Inception Architecture for Computer Vision", The IEEE Conference on Computer Vision and Pattern Recognition (CVPR). 2016, pp 2818-2826.
  10. Tim Salimans, Ian Goodfellow, Wojciech Zaremba, Vicki Cheung, Alec Radford, and Xi Chen, "Improved Techniques for Training GANs", Neural Information Processing Systems. 2016. pp 2234-2242.

Recommended Posts

GAN: DCGAN Part3 - Comprendre Wasserstein GAN
GAN: DCGAN Part1 - Scraping d'images Web
GAN: DCGAN Part2-Training Modèle DCGAN
Comprendre et mettre en œuvre Style GAN