CNN Xavier Gewichtsinitialisierung

14

In einigen Tutorials wurde festgestellt, dass die "Xavier" -Gewichtsinitialisierung (Artikel: Verständnis der Schwierigkeit, tiefe Feedforward-Neuronale Netze zu trainieren ) ein effizienter Weg ist, um die Gewichte von Neuronalen Netzen zu initialisieren.

Für vollständig verbundene Ebenen gab es in diesen Tutorials eine Faustregel:

Var(W)=2nin+nout,simpler alternative:Var(W)=1nin

Dabei ist die Varianz der Gewichte für eine Schicht, die mit einer Normalverteilung initialisiert ist, und n i n , n o u t ist die Anzahl der Neuronen in der Elternschicht und in der aktuellen Schicht.Var(W)ninnout

Gibt es ähnliche Faustregeln für Faltungsschichten?

Ich habe Mühe herauszufinden, was am besten wäre, um die Gewichte einer Faltungsschicht zu initialisieren. Beispiel: In einer Ebene, in der die Form der Gewichte (5, 5, 3, 8)so ist wie die Kernelgröße 5x5, wird das Filtern von drei Eingangskanälen (RGB-Eingang) und das Erstellen von 8Feature-Maps 3als Anzahl der Eingangsneuronen betrachtet. Oder eher 75 = 5*5*3, weil die Eingabe 5x5Patches für jeden Farbkanal sind?

Ich würde beides akzeptieren, eine spezifische Antwort zur Klärung des Problems oder eine "allgemeinere" Antwort, die den allgemeinen Prozess erklärt, die richtige Initialisierung von Gewichten zu finden und vorzugsweise Quellen zu verknüpfen.

daniel451
quelle

Antworten:

13

In diesem Fall sollte die Anzahl der Neuronen sein 5*5*3.

Ich fand es besonders nützlich für Faltungsschichten. Oft funktioniert auch eine gleichmäßige Verteilung über das Intervall [c/(in+out),c/(in+out)]] .

Es ist optional in fast allen neuronalen Netzwerkbibliotheken implementiert. Hier finden Sie den Quellcode der Keras-Implementierung der Initialisierung von Xavier Glorot.

dontloo
quelle
1
1106[0.1,0.01]
@ascenator Entschuldigung, ich weiß nicht viel darüber, wie sich die Gewichte während des Trainings ändern. Manchmal können seltsame Ergebnisse von zu großen / kleinen Lernraten herrühren.
Dontloo
106103
0

Ich stimme Erics Antwort hier zu. Ich nehme auch das "sqrt" des Begriffs und nicht nur diesen Begriff. Trotzdem kann das Training zum Stillstand kommen, wenn Sie Sigmoid tief in Ihrem Netz mit dem "RelU" -Ausgang verbinden. Dies liegt an der unbegrenzten "Relu" -Ausgabe, die dazu führen kann, dass der Gradient bei Sigmoid auf 0 fällt und kein Lernen stattfindet. In den Fällen habe ich also einen "scaleDown" -Faktor für mein Netz, der die Initialisierungsabweichung um diesen Faktor belastet. Ich stelle die Gewichte empirisch so lange ein, bis das Lernen stattfindet. Eine einfache Möglichkeit besteht darin, das Modell unmittelbar nach einer Iteration zu speichern und sich die RELU-Ausgabe (die mit Sigmoid verbunden ist) anzusehen. Stellen Sie die Gewichte so lange ein, bis diese RELU-Ausgabe angemessen ist. Und dann benutze diese Gewichte zum Training. Es ist ein guter Anfang. Wenn es nach einigen Iterationen immer noch zusammenbricht, beschweren Sie sie etwas mehr, bis Sie Stabilität erreichen. Es ist nur ein Hack, den ich benutzt habe. Es hat bei mir für mein Setup funktioniert. Also teile meine Erfahrungen. Verschiedene Dinge funktionieren für verschiedene Setups.

Also viel Glück!

Sarnath K.
quelle