GAN: Contenu lié aux réseaux de génération hostiles. Le modèle dans GAN ne converge pas nécessairement vers une image indiscernable de la réalité par la formation. La raison pour laquelle l'entraînement ne se déroule pas est l'instabilité de la disparition de la pente et l'effondrement du mode.
On dit qu'il est important de contrôler la continuité de Lipsitz et la constante de Lipsitz du Discriminateur pour cette instabilité. La normalisation spectrale est un moyen utile d'éliminer cette instabilité.
Eh bien, il y a des mots que je ne comprends pas. Cette fois, je voudrais résumer le contenu de ma propre interprétation de ces significations.
Voici le livre que j'ai également utilisé comme référence cette fois.
J'ai écrit un livre pour en savoir plus sur le deep learning et la dernière situation GAN d'Inpainting https://qiita.com/koshian2/items/aefbe4b26a7a235b5a5e
La fonction $ f (x) $ est Lipsitz contiguë pour tout $ x_1 $, $ x_2 $.
|\frac{f(x_1)-f(x_2)}{x_1-x_2}| \leq k Équation 1
Cela signifie qu'il existe une constante $ k $ qui satisfait. Ce $ k $ est appelé la constante de Lipsitz.
Maintenant, avant de passer au contenu de Lipsitz contigu, je voudrais revenir sur la continuité des fonctions. Si la fonction est simplement continue, c'est comme suit. Qu'est-ce qui est continu avec $ x = x_0 $?
\lim_{x \to x_0} f(x) = f(x_0)Équation 2\\
Cela signifie que cela est établi. Et $ f (x) $ est une fonction continue lorsqu'elle est continue à tous les points d'intérêt.
Par exemple, l'exemple suivant est une fonction continue et non une fonction continue.
Je pense que c'est facile à comprendre intuitivement.
D'autre part, la continuité de Lipsitz est une fonction dans laquelle $ k $ qui satisfait l'équation 1 ci-dessus existe.
Dans la figure ci-dessus, si vous tracez une ligne droite avec une pente de $ ± k $ en tout point de la fonction, l'état dans lequel le graphique de la fonction s'inscrit entre eux est appelé continuité de Lipsitz. Prenez $ y = x $ comme exemple. Équation 1
|\frac{f(x_1)-f(x_2)}{x_1-x_2}| \leq k \\
\Rightarrow 1\leq k
Ce sera. Par conséquent, si la valeur de $ k $ est de 0,01, etc., la formule ne tiendra pas, et cette fonction ne peut pas être considérée comme Lipsitz continue. Par conséquent, le fait que la fonction soit continue et qu'elle soit Lipsitz continue
Lipsitz en continu\en continu
Cela devient une forme que la continuation embrasse.
Dans le GAN, c'est une règle empirique que la définition d'une contrainte de $ k = 1 $ améliore généralement la stabilité.
URL de référence https://mathwords.net/lipschitz
Ensuite, nous expliquerons la décomposition en valeurs singulières. Cette décomposition de valeur singulière est une opération sur une matrice et est une opération nécessaire pour la normalisation spectrale ci-dessous, elle est donc résumée ici.
La décomposition de singularité signifie que pour toute matrice $ m × n $ $ A $, la matrice orthogonale $ U, V $ où $ A = UΣV $ et la composante hors diagonale sont 0, et la composante diagonale est non négative et grande. On dit qu'il divise par la matrice $ Σ $ arrangée dans l'ordre de. Et ce composant $ Σ $ est appelé une valeur singulière. Veuillez vous référer au pdf suivant pour savoir comment calculer $ U, V, Σ $.
http://www.cfme.chiba-u.jp/~haneishi/class/iyogazokougaku/SVD.pdf
Maintenant, en Python, ces décompositions de singularité peuvent être facilement obtenues.
SN.ipynb
import numpy as np
data = np.array([[1,2,3,4],[3,4,5,6]])
U, S, V = np.linalg.svd(data)
print(U)
print(S)
print(V)
[[-0.50566621 -0.86272921]
[-0.86272921 0.50566621]]
[10.73807223 0.8329495 ] #Singularité
[[-0.28812004 -0.41555404 -0.54298803 -0.67042202]
[ 0.7854851 0.35681206 -0.07186099 -0.50053403]
[-0.40008743 0.25463292 0.69099646 -0.54554195]
[-0.37407225 0.79697056 -0.47172438 0.04882607]]
De cette manière, la valeur singulière a été confirmée comme étant [10,73807223 0,8329495]. Vous pouvez voir que la singularité maximale est d'environ 10,74.
URL de référence https://thinkit.co.jp/article/16884
Maintenant, à propos de cette dernière normalisation spectrale. Une méthode appelée normalisation par lots (ci-après dénommée norme par lots) est célèbre pour la création de couches de réseaux neuronaux. Cette norme de lot est une méthode proposée en 2015. C'est une couche qui est incorporée après la couche entièrement connectée et la couche de pliage. Les effets sont les suivants.
Le traitement est le suivant.
En mini-lot, $ x_1, x_2 ・ ・ ・ $ m $ de x_m $ Pour ces données d'entrée, la moyenne $ μB $ et la variance $ σ_B ^ 2 $ sont calculées.
Batch Norm peut profiter de ces effets, mais il est cité comme un facteur qui nuit à la continuité lors de l'apprentissage du GAN. Comme vous pouvez le voir dans la formule ci-dessus, Batch Norm est une fonction fractionnaire car elle est divisée par l'écart type. On comprend que la fonction fractionnaire perd de la continuité car elle n'est pas continue à $ x = 0 $.
Par conséquent, la normalisation spectrale est la solution à ce problème.
Spectral Normalization for Generative Adversarial Networks https://arxiv.org/abs/1802.05957
Ceci est un auteur d'une personne japonaise et a été annoncé par les gens de Preferred Networks Co., Ltd. La normalisation spectrale est l'idée de diviser le coefficient par la singularité maximale. Pour le modèle, vous pouvez assurer la continuité de Lipsitz et contrôler la constante de Lipsitz à 1. Pour trouver cette singularité maximale, utilisez la décomposition de singularité ci-dessus.
C'est très simple à mettre en œuvre. Lors de l'utilisation de tensorflow, il peut être implémenté en le spécifiant avec ConvSN2D comme la solution.
SN.ipynb
import tensorflow as tf
from inpainting_layers import ConvSN2D
inputs = tf.random.normal((16, 256, 256, 3))
x = ConvSN2D(64,3,padding='same')(inputs)
print(x.shape)
Maintenant, c'est une méthode pour trouver la valeur singulière, mais si vous appliquez la méthode svd telle quelle, la quantité de calcul sera énorme, nous utiliserons donc un algorithme appelé multiplication de puissance.
La singularité maximale dans la matrice $ (N, M) $ $ X $ est
Estimation + $ V = L_2 (UX ^ T) $. Cependant, $ L2 = x / \ sqrt (Σx_ {i, j}) + ε
Une fois mis en œuvre, ce sera comme suit. La matrice de données originale est celle utilisée ci-dessus.
python
results = []
for p in range(1, 6):
U = np.random.randn(1, data.shape[1])
for i in range(p):
V = l2_normalize(np.dot(U, data.T))
U = l2_normalize(np.dot(V, data))
sigma = np.dot(np.dot(V, data), U.T)
results.append(sigma.flatten())
plt.plot(np.arange(1, 6), results)
plt.ylim([10, 11])
Eh bien, vers 10,74, j'ai obtenu le même résultat qu'avant. De cette manière, il est nécessaire pour la mise en œuvre.
Cette fois, nous avons résumé le contenu lié à la normalisation spectrale. Bien que j'aie saisi le flux général, je manquais toujours de compréhension des aspects mathématiques. Je voudrais approfondir ma compréhension tout en continuant à la mettre en œuvre.
Le programme est stocké ici. https://github.com/Fumio-eisan/SN_20200404
Recommended Posts