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
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.
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.
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
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
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.
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
Schätzen Sie + $ V = L_2 (UX ^ T) $. $ L2 = x / \ sqrt (Σx_ {i, j}) + ε
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])
Nun, gegen 10.74 Uhr bekam ich das gleiche Ergebnis wie zuvor. Auf diese Weise wird es für die Implementierung benötigt.
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