[PYTHON] J'ai essayé de comprendre la normalisation spectrale et la décomposition de valeurs singulières qui contribuent à la stabilité du GAN.

introduction

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

Qu'est-ce que la fonction Lipsitz continue et Lipsitz?

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.

image.png

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.

001.png

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

Qu'est-ce que la décomposition en valeurs singulières?

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

Qu'est-ce que la normalisation spectrale?

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.

image.png

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

  1. Définissez une matrice $ U $ pour $ U: (1, X) $. À ce moment-là, il est initialisé comme un nombre aléatoire normal
  2. Répétez les P fois suivantes

Estimation + $ V = L_2 (UX ^ T) $. Cependant, $ L2 = x / \ sqrt (Σx_ {i, j}) + ε , ( ε $ est un montant minute) Estimation + $ U = L_2 (VX) $.

  1. Estimer $ σ = VXT ^ T $. $ σ $ est la valeur singulière maximale.

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])

002.png

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.

À la fin

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

J'ai essayé de comprendre la normalisation spectrale et la décomposition de valeurs singulières qui contribuent à la stabilité du GAN.
J'ai essayé de visualiser la tranche d'âge et la distribution des taux d'Atcoder
J'ai essayé d'extraire et d'illustrer l'étape de l'histoire à l'aide de COTOHA
J'ai essayé de vérifier et d'analyser l'accélération de Python par Cython
J'ai essayé d'afficher la valeur d'altitude du DTM dans un graphique
J'ai essayé de notifier la mise à jour de "Hameln" en utilisant "Beautiful Soup" et "IFTTT"
J'ai essayé de corriger la forme trapézoïdale de l'image
Essayez de décomposer la matrice daimyo par valeur singulière
Je n'ai pas compris le redimensionnement de TensorFlow, alors je l'ai résumé visuellement.
J'ai essayé de vectoriser les paroles de Hinatazaka 46!
J'ai essayé de notifier la mise à jour de "Devenir romancier" en utilisant "IFTTT" et "Devenir un romancier API"
J'ai essayé de comprendre comment utiliser les pandas et la colinéarité multiple en utilisant l'ensemble de données Affaires comme thème.
J'ai essayé d'automatiser la mise à jour de l'article du blog Livedoor avec Python et sélénium.
J'ai essayé de comparer la vitesse de traitement avec dplyr de R et pandas de Python
J'ai essayé de résumer la forme de base de GPLVM
Je veux bien comprendre les bases de Bokeh
J'ai essayé de visualiser les informations spacha de VTuber
J'ai essayé d'effacer la partie négative de Meros
J'ai essayé de classer les voix des acteurs de la voix
J'ai essayé de résumer les opérations de chaîne de Python
J'ai essayé de publier automatiquement sur ChatWork au moment du déploiement avec Fabric et ChatWork Api
J'ai essayé de vérifier la classification yin et yang des membres hololive par apprentissage automatique
J'ai essayé de trouver l'entropie de l'image avec python
[Courses de chevaux] J'ai essayé de quantifier la force du cheval de course
J'ai essayé d'obtenir les informations de localisation du bus Odakyu
J'ai essayé de trouver la moyenne de plusieurs colonnes avec TensorFlow
Je souhaite utiliser uniquement le traitement de normalisation SudachiPy
J'ai essayé d'illustrer le temps et le temps du langage C
J'ai essayé d'afficher l'heure et la météo d'aujourd'hui w
[Python] J'ai essayé de visualiser la relation de suivi de Twitter
[Apprentissage automatique] J'ai essayé de résumer la théorie d'Adaboost
Je veux connaître la nature de Python et pip
J'ai essayé d'énumérer les différences entre java et python
J'ai essayé de combattre le minimum local de la fonction Goldstein-Price
J'ai affiché le chat de YouTube Live et essayé de jouer
Une histoire sur l'écriture d'AWS Lambda et de devenir un peu accro aux valeurs par défaut des arguments Python
J'ai créé mon propre réseau de neurones à propagation directe à 3 couches et j'ai essayé de comprendre le calcul en profondeur.
Je suis devenu horreur quand j'ai essayé de détecter la quantité de fonctionnalités d'un visage animé en utilisant PCA et NMF.
Je ne suis pas sûr de la différence entre les modules, les packages et les bibliothèques, alors j'ai essayé de les organiser.
J'ai essayé de prédire les hauts et les bas du cours de clôture du cours de l'action de Guru Navi en utilisant TensorFlow (progression)
J'ai essayé d'adapter la fonction exponentielle et la fonction logistique au nombre de patients positifs au COVID-19 à Tokyo
[Linux] J'ai essayé de résumer les commandes de confirmation des ressources
(Python) Valeur attendue ・ J'ai essayé de comprendre attentivement l'échantillonnage Monte Carlo
J'ai essayé d'obtenir l'index de la liste en utilisant la fonction énumérer
[Introduction à Python] J'ai comparé les conventions de nommage de C # et Python.
J'ai essayé de créer l'image de démarrage SD de LicheePi Nano
J'ai essayé de visualiser l'ensemble de données de préférence de boisson par décomposition tenseur.
Je souhaite utiliser à la fois la clé et la valeur de l'itérateur Python
J'ai résumé comment changer les paramètres de démarrage de GRUB et GRUB2
J'ai essayé d'agrandir la taille du volume logique avec LVM
J'ai étudié le comportement de la différence entre lien dur et lien symbolique
J'ai essayé de résumer la méthode de mise en œuvre fréquemment utilisée de pytest-mock
J'ai essayé d'améliorer l'efficacité du travail quotidien avec Python
J'ai essayé de visualiser la condition commune des téléspectateurs de la chaîne VTuber
J'ai essayé de faire la différence de Config avant et après le travail avec le script pyATS / Genie self-made
J'ai essayé d'obtenir et d'analyser les données statistiques de la nouvelle Corona avec Python: données de l'Université John's Hopkins