[PYTHON] Ich habe mich sehr bemüht, die spektrale Normalisierung und die Singularwertzerlegung zu verstehen, die zur Stabilität von GAN beitragen.

Einführung

GAN: Inhalte in Bezug auf Netzwerke feindlicher Generationen. Das Modell in GAN konvergiert nicht unbedingt zu einem Bild, das durch Training nicht von der Realität zu unterscheiden ist. Der Grund, warum das Training nicht fortgesetzt wird, ist die Instabilität des Verschwindens der Steigung und der Zusammenbruch des Modus.

Es wird gesagt, dass es wichtig ist, die Lipsitz-Kontinuität und die Lipsitz-Konstante des Diskriminators für diese Instabilität zu kontrollieren. Die spektrale Normalisierung ist ein nützlicher Weg, um diese Instabilität zu beseitigen.

Nun, es gibt einige Wörter, die ich nicht verstehe. Dieses Mal möchte ich zusammenfassen, was ich diese Bedeutungen interpretiert habe.

Hier ist das Buch, das ich auch dieses Mal als Referenz verwendet habe.

Ich habe ein Buch geschrieben, um mehr über Deep Learning und die neueste GAN-Situation von Inpainting zu erfahren https://qiita.com/koshian2/items/aefbe4b26a7a235b5a5e

Was ist Lipsitz Continuous und Lipsitz Funktion?

Die Funktion $ f (x) $ ist Lipsitz, das für jedes $ x_1 $, $ x_2 $ zusammenhängend ist.

|\frac{f(x_1)-f(x_2)}{x_1-x_2}|  \leq k Gleichung 1

Dies bedeutet, dass es eine Konstante $ k $ gibt, die erfüllt. Dieses $ k $ wird als Lipsitz-Konstante bezeichnet.

Bevor ich nun mit dem Inhalt von Lipsitz fortlaufend fortfahre, möchte ich auf die Kontinuität der Funktionen zurückblicken. Wenn die Funktion einfach stetig ist, ist es wie folgt. Was ist stetig mit $ x = x_0 $?

\lim_{x \to x_0} f(x) = f(x_0)Gleichung 2\\

Es bedeutet, dass festgelegt ist. Und $ f (x) $ ist eine stetige Funktion, wenn sie an allen interessierenden Punkten stetig ist.

Das folgende Beispiel ist beispielsweise eine stetige Funktion und keine stetige Funktion.

image.png

Ich denke, es ist leicht intuitiv zu verstehen.

Andererseits ist die Lipsitz-Kontinuität eine Funktion, in der $ k $ existiert, die die obige Gleichung 1 erfüllt.

001.png

Wenn Sie in der obigen Abbildung an einem beliebigen Punkt der Funktion eine gerade Linie mit einer Steigung von $ ± k $ zeichnen, wird der Zustand, in den der Graph der Funktion zwischen ihnen passt, als Lipsitz-Kontinuität bezeichnet. Nehmen Sie als Beispiel $ y = x $. Gleichung 1

|\frac{f(x_1)-f(x_2)}{x_1-x_2}|  \leq k  \\
\Rightarrow 1\leq k

Es wird sein. Wenn der Wert von $ k $ 0,01 usw. beträgt, gilt die Formel daher nicht, und diese Funktion kann nicht als Lipsitz-stetig bezeichnet werden. Daher ist die Tatsache, dass die Funktion stetig ist und dass es Lipsitz stetig ist

Lipsitz kontinuierlich\in kontinuierlicher

Es wird eine Form, die die Fortsetzung umfasst.

In GAN ist es eine empirische Regel, dass das Setzen einer Einschränkung von $ k = 1 $ normalerweise die Stabilität verbessert.

Referenz-URL https://mathwords.net/lipschitz

Was ist Singularwertzerlegung?

Als nächstes werden wir die Singularwertzerlegung erklären. Diese Singularwertzerlegung ist eine Operation auf einer Matrix und eine notwendige Operation für die spektrale Normalisierung, daher wird sie hier zusammengefasst.

Singularitätszerlegung bedeutet, dass für jede $ m × n $ -Matrix $ A $ die orthogonale Matrix $ U, V $ mit $ A = UΣV $ und die nicht diagonale Komponente 0 sind und die diagonale Komponente nicht negativ und groß ist. Es wird gesagt, dass es durch die Matrix $ Σ $ dividiert wird, die in der Reihenfolge von angeordnet ist. Und diese $ Σ $ -Komponente wird als Singularwert bezeichnet. Informationen zur Berechnung von $ U, V, Σ $ finden Sie im folgenden PDF.

http://www.cfme.chiba-u.jp/~haneishi/class/iyogazokougaku/SVD.pdf

In Python können diese Singularitätszerlegungen nun leicht erhalten werden.

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ät
[[-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]]

Auf diese Weise wurde bestätigt, dass der Singularwert [10.73807223 0.8329495] ist. Sie können sehen, dass die maximale Singularität etwa 10,74 beträgt.

Referenz-URL https://thinkit.co.jp/article/16884

Was ist spektrale Normalisierung?

Nun zu dieser letzten spektralen Normalisierung. Ein Verfahren namens Chargennormalisierung (im Folgenden als Chargennorm bezeichnet) ist berühmt für die Erzeugung von Schichten neuronaler Netze. Diese Chargennorm ist eine 2015 vorgeschlagene Methode. Es ist eine Schicht, die nach der vollständig verbundenen Schicht und der Faltschicht eingearbeitet wird. Die Auswirkungen sind wie folgt.

Die Verarbeitung ist wie folgt.

image.png

Als Mini-Batch werden $ x_1, x_2 ・ ・ m $ m $ von x_m $ Für diese Eingabedaten werden der Durchschnitt $ μB $ und die Varianz $ σ_B ^ 2 $ berechnet.

Batch Norm kann diese Effekte genießen, wird jedoch als ein Faktor angeführt, der die Kontinuität beim Erlernen von GAN beeinträchtigt. Wie Sie der obigen Formel entnehmen können, ist die Chargennorm eine Bruchfunktion, da sie durch die Standardabweichung geteilt wird. Es versteht sich, dass die Bruchfunktion die Kontinuität verliert, weil sie bei $ x = 0 $ nicht stetig ist.

Daher ist die spektrale Normalisierung die Lösung für dieses Problem.

Spectral Normalization for Generative Adversarial Networks https://arxiv.org/abs/1802.05957

Dies ist ein Autor einer japanischen Person und wurde von den Leuten von Preferred Networks Co., Ltd. angekündigt. Spektrale Normalisierung ist die Idee, den Koeffizienten durch die maximale Singularität zu teilen. Für das Modell können Sie die Lipsitz-Kontinuität sicherstellen und die Lipsitz-Konstante auf 1 steuern. Verwenden Sie die obige Singularitätszerlegung, um diese maximale Singularität zu ermitteln.

Es ist sehr einfach zu implementieren. Wenn Sie Tensorflow verwenden, kann es implementiert werden, indem Sie es wie die Lösung mit ConvSN2D angeben.

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)

Dies ist eine Methode, um den Singularwert zu ermitteln. Wenn Sie jedoch die svd-Methode so anwenden, wie sie ist, ist der Rechenaufwand enorm. Daher verwenden wir einen Algorithmus namens Leistungsmultiplikation.

Die maximale Singularität in der $ (N, M) $ -Matrix $ X $ ist

  1. Definieren Sie eine Matrix $ U $ für $ U: (1, X) $. Zu diesem Zeitpunkt wird es als normale Zufallszahl initialisiert
  2. Wiederholen Sie die folgenden P-Male

Schätzen Sie + $ V = L_2 (UX ^ T) $. $ L2 = x / \ sqrt (Σx_ {i, j}) + ε , ( ε $ ist ein Minutenbetrag) Schätzen Sie + $ U = L_2 (VX) $.

  1. Schätzen Sie $ σ = VXT ^ T $. $ σ $ ist der maximale Singularwert.

Wenn implementiert, wird es wie folgt sein. Die ursprüngliche Datenmatrix ist die oben verwendete.

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

Nun, gegen 10.74 Uhr bekam ich das gleiche Ergebnis wie zuvor. Auf diese Weise wird es für die Implementierung benötigt.

Am Ende

Dieses Mal haben wir die Inhalte zur spektralen Normalisierung zusammengefasst. Obwohl ich den allgemeinen Fluss begriff, fehlte mir immer noch das Verständnis der mathematischen Aspekte. Ich möchte mein Verständnis vertiefen, während ich es weiter umsetze.

Das Programm ist hier gespeichert. https://github.com/Fumio-eisan/SN_20200404

Recommended Posts

Ich habe mich sehr bemüht, die spektrale Normalisierung und die Singularwertzerlegung zu verstehen, die zur Stabilität von GAN beitragen.
Ich habe versucht, die Altersgruppe und die Ratenverteilung von Atcoder zu visualisieren
Ich habe versucht, die Phase der Geschichte mit COTOHA zu extrahieren und zu veranschaulichen
Ich habe versucht, die Beschleunigung von Python durch Cython zu verifizieren und zu analysieren
Ich habe versucht, den Höhenwert von DTM in einem Diagramm anzuzeigen
Ich habe versucht, das Update von "Hameln" mit "Beautiful Soup" und "IFTTT" zu benachrichtigen.
Ich habe versucht, die Trapezform des Bildes zu korrigieren
Versuchen Sie, die Daimyo-Matrix durch einen Singularwert zu zerlegen
Ich habe die Größenänderung von TensorFlow nicht verstanden und sie daher visuell zusammengefasst.
Ich habe versucht, die Texte von Hinatazaka 46 zu vektorisieren!
Ich habe versucht, das Update von "Werde ein Romanautor" mit "IFTTT" und "Werde ein Romanautor API" zu benachrichtigen.
Ich habe versucht zu verstehen, wie Pandas und multiple Co-Linearität unter Verwendung des Affairs-Datensatzes als Thema verwendet werden.
Ich habe versucht, das Artikel-Update des Livedoor-Blogs mit Python und Selen zu automatisieren.
Ich habe versucht, die Verarbeitungsgeschwindigkeit mit dplyr von R und pandas von Python zu vergleichen
Ich habe versucht, die Grundform von GPLVM zusammenzufassen
Ich möchte die Grundlagen von Bokeh vollständig verstehen
Ich habe versucht, die Spacha-Informationen von VTuber zu visualisieren
Ich habe versucht, den negativen Teil von Meros zu löschen
Ich habe versucht, die Stimmen der Sprecher zu klassifizieren
Ich habe versucht, die String-Operationen von Python zusammenzufassen
Ich habe versucht, zum Zeitpunkt der Bereitstellung mit Fabric und ChatWork Api automatisch in ChatWork zu posten
Ich habe versucht, die Yin- und Yang-Klassifikation hololiver Mitglieder durch maschinelles Lernen zu überprüfen
Ich habe versucht, die Entropie des Bildes mit Python zu finden
[Pferderennen] Ich habe versucht, die Stärke des Rennpferdes zu quantifizieren
Ich habe versucht, die Standortinformationen des Odakyu-Busses zu erhalten
Ich habe versucht, mit TensorFlow den Durchschnitt mehrerer Spalten zu ermitteln
Ich möchte nur die SudachiPy-Normalisierungsverarbeitung verwenden
Ich habe versucht, die Zeit und die Zeit der C-Sprache zu veranschaulichen
Ich habe versucht, die Uhrzeit und das heutige Wetter anzuzeigen
[Python] Ich habe versucht, die folgende Beziehung von Twitter zu visualisieren
[Maschinelles Lernen] Ich habe versucht, die Theorie von Adaboost zusammenzufassen
Ich möchte die Natur von Python und Pip kennenlernen
Ich habe versucht, die Unterschiede zwischen Java und Python aufzuzählen
Ich habe versucht, das lokale Minimum der Goldstein-Preis-Funktion zu bekämpfen
Ich habe den Chat von YouTube Live angezeigt und versucht zu spielen
Eine Geschichte über das Schreiben von AWS Lambda und ein wenig Abhängigkeit von den Standardwerten von Python-Argumenten
Ich habe mein eigenes neuronales 3-Layer-Forward-Propagation-Netzwerk erstellt und versucht, die Berechnung genau zu verstehen.
Ich wurde entsetzt, als ich versuchte, mithilfe von PCA und NMF die Anzahl der Merkmale eines animierten Gesichts zu ermitteln.
Ich bin mir über den Unterschied zwischen Modulen, Paketen und Bibliotheken nicht sicher und habe versucht, sie zu organisieren.
Ich habe versucht, die Höhen und Tiefen des Schlusskurses des Aktienkurses von Guru Navi mit TensorFlow vorherzusagen (Fortschritt)
Ich habe versucht, die Exponentialfunktion und die Logistikfunktion an die Anzahl der COVID-19-positiven Patienten in Tokio anzupassen
[Linux] Ich habe versucht, die Ressourcenbestätigungsbefehle zusammenzufassen
(Python) Erwarteter Wert ・ Ich habe versucht, die Monte-Carlo-Probenahme sorgfältig zu verstehen
Ich habe versucht, den Index der Liste mithilfe der Aufzählungsfunktion abzurufen
[Einführung in Python] Ich habe die Namenskonventionen von C # und Python verglichen.
Ich habe versucht, das SD-Boot-Image von LicheePi Nano zu erstellen
Ich habe versucht, den Getränkepräferenzdatensatz durch Tensorzerlegung zu visualisieren.
Ich möchte sowohl den Schlüssel als auch den Wert des Python-Iterators verwenden
Ich habe zusammengefasst, wie die Boot-Parameter von GRUB und GRUB2 geändert werden
Ich habe versucht, die Größe des logischen Volumes mit LVM zu erweitern
Ich untersuchte das Verhalten bezüglich des Unterschieds zwischen Hard Link und Symbolic Link
Ich habe versucht, die häufig verwendete Implementierungsmethode von pytest-mock zusammenzufassen
Ich habe versucht, die Effizienz der täglichen Arbeit mit Python zu verbessern
Ich habe versucht, den allgemeinen Zustand der VTuber-Kanalbetrachter zu visualisieren
Ich habe versucht, den Unterschied zwischen Config vor und nach der Arbeit mit pyATS / Genie selbst erstelltem Skript zu berücksichtigen
Ich habe versucht, die statistischen Daten der neuen Corona mit Python abzurufen und zu analysieren: Daten der Johns Hopkins University