Ich habe gerade gehört, dass es eine gute Idee ist, die Anfangsgewichte eines neuronalen Netzes aus dem Bereich zu wählen , wobei ist Anzahl der Eingaben in ein bestimmtes Neuron. Es wird angenommen, dass die Mengen normalisiert sind - Mittelwert 0, Varianz 1 (weiß nicht, ob dies wichtig ist).d
Warum ist das eine gute Idee?
Antworten:
Ich gehe davon aus, dass Sie logistische Neuronen verwenden und dass Sie durch Gradientenabstieg / Rückausbreitung trainieren.
Die Logistikfunktion ist für große positive oder negative Eingänge nahezu flach. Die Ableitung bei einem Eingang von ist ungefähr , aber bei die Ableitung ungefähr . Dies bedeutet, dass das Neuron bei einer Eingabe eines logistischen Neurons von für ein bestimmtes Trainingssignal ungefähr mal langsamer lernt als bei einer Eingabe von .1 / 10 10 1 / 22000 10 2200 22 1 / 10 10 1 / 22000 10 2200 2
Wenn Sie möchten, dass das Neuron schnell lernt, müssen Sie entweder ein großes Trainingssignal erzeugen (z. B. mit einer Cross-Entropy-Loss-Funktion) oder Sie möchten, dass die Ableitung groß ist. Um die Ableitung groß zu machen, setzen Sie die Anfangsgewichte so, dass Sie häufig Eingaben im Bereich .[−4,4]
Die anfänglichen Gewichte, die Sie eingeben, könnten funktionieren oder auch nicht. Dies hängt davon ab, wie die Eingänge normalisiert werden. Wenn die Eingaben so normalisiert sind, dass sie den Mittelwert und die Standardabweichung , wird eine zufällige Summe von Termen mit einer einheitlichen Gewichtung von wird Mittelwert und Varianz , unabhängig von . Die Wahrscheinlichkeit, dass Sie eine Summe außerhalb von ist gering. Das heißt, wenn Sie erhöhen , werden die Neuronen nicht gesättigt, sodass sie nicht lernen.1 d ( - 10 1 d 01(−1d√,1d√) 0 d[-4,4]d13 d [−4,4] d
Bei Eingaben, die nicht normalisiert sind, können diese Gewichte die Sättigung möglicherweise nicht wirksam vermeiden.
quelle
[1] befasst sich mit der Frage:
Erstens sollten die Gewichte nicht auf Null gesetzt werden, um die Symmetrie beim Zurückprogrammieren zu durchbrechen:
Einige Initialisierungsstrategien:
W = np.random.randn(ndim, ndim); u, s, v = np.linalg.svd(W)
dannu
als Initialisierungsmatrix verwenden.Unbeaufsichtigtes Pre-Training kann in einigen Situationen hilfreich sein:
Einige ANN-Bibliotheken haben auch einige interessante Listen, zB Lasagne :
[1] Bengio, Yoshua. " Praktische Empfehlungen für das gradientenbasierte Training tiefer Architekturen. " Neuronale Netze: Tricks of the Trade. Springer Berlin Heidelberg, 2012. 437-478.
[2] Y. LeCun, L. Bottou, GB Orr und K. Muller (1998a). Effizientes Backprop. In neuronalen Netzen, Tricks des Handels .
[3] Glorot, Xavier und Yoshua Bengio. " Verständnis der Schwierigkeit, tiefe Feedforward-Neuronale Netze zu trainieren ." Internationale Konferenz zu künstlicher Intelligenz und Statistik. 2010.
quelle
Die folgende Erklärung stammt aus dem Buch: Neuronale Netze zur Mustererkennung von Christopher Bishop. Tolles Buch! Angenommen, Sie haben zuvor die Eingaben für die Eingabeeinheiten weiß gemacht, dh und< x 2 i > = 1
Die Frage ist: Wie wählt man am besten die Gewichte aus ?. Die Idee ist, die Werte der Gewichte nach einer Verteilung zufällig auszuwählen, wodurch der Optimierungsprozess zu einer aussagekräftigen Lösung konvergiert.
Sie haben für die Aktivierung der Einheiten in der ersten Ebene wobei . Nun, da Sie die Gewichte unabhängig von den Eingaben auswählen, ist und wobei sigma die Varianz der Gewichtsverteilung ist. Um dieses Ergebnis abzuleiten, müssen Sie daran erinnern, dass die Gewichte unabhängig voneinander initialisiert werden, dh
quelle
Nun, genau wie ein Update, Eintauchen in Gleichrichter: Leistung auf menschlicher Ebene übertreffen n Die ImageNet-Klassifizierung von He et al. Führte eine Initialisierung speziell mit Initialisierung ein,
w = U([0,n]) * sqrt(2.0/n)
bei dern
die Anzahl der Eingänge Ihres NN angegeben ist. Ich habe diese Initialisierung in vielen neueren Werken gesehen (auch mit ReLU). Sie zeigen tatsächlich, wie dies die Fehlerrate viel schneller reduziert als die von Ihnen erwähnten (-1 / n, 1 / n). Eine ausführliche Erklärung finden Sie im Artikel, aber wie schnell es konvergiert, erfahren Sie hier:quelle
Die Idee ist, dass Sie die Gewichte auf eine Weise initialisieren möchten, die einen guten Datenfluss vorwärts und rückwärts durch das Netzwerk gewährleistet. Das heißt, Sie möchten nicht, dass die Aktivierungen im Verlauf des Netzwerks ständig kleiner oder größer werden.
Dieses Bild zeigt die Aktivierung eines 5-Schicht-ReLU-Mehrschicht-Perceptrons unter 3 verschiedenen Initialisierungsstrategien nach einem Durchlauf von MNIST durch das Netzwerk.
In allen drei Fällen werden die Gewichte aus einer nullzentrierten Normalverteilung gezogen, die durch ihre Standardabweichung bestimmt wird. Sie können sehen, dass die Aktivierungen erstickt werden, wenn die Anfangsgewichte zu klein sind (die Standardabweichung ist klein), und dass die Aktivierungen explodieren, wenn sie zu groß sind. Der mittlere Wert, der ungefähr richtig ist, kann ermittelt werden, indem die Gewichte so eingestellt werden, dass die Varianz der Aktivierungen und Gradientenaktualisierungen ungefähr gleich bleibt, wenn Sie durch das Netzwerk gehen.
Ich habe einen Blog-Beitrag über Gewichtsinitialisierung geschrieben , der ausführlicher behandelt wird. Die Grundidee lautet jedoch wie folgt.
Um wir daher die Bedingung auferlegenVar(x(i+1))=Var(x(i))
Wenn wir mit , wollen wir auf ähnliche Weise den Rückwärtsdurchlauf∂L∂x(i)j Δ(i)j
Sofern nicht , müssen wir zwischen diesen beiden Bedingungen Kompromisse eingehen, und eine vernünftige Wahl ist das harmonische Mittelni=ni+1
Wenn wir Gewichte aus einer Normalverteilung abtasten, erfüllen wir diese Bedingung mit . Für eine gleichmäßige Verteilung sollten wir da . Damit sind wir bei der Glorot-Initialisierung angelangt. Dies ist beispielsweise die Standard-Initialisierungsstrategie für dichte und 2D-Faltungs-Layer in Keras.N(0,σ) σ=2ni+ni+1−−−−−√ U(−a,a) a=6ni+ni+1−−−−−√ Var(U(−a,a))=a2/3
Die Glorot-Initialisierung funktioniert ziemlich gut für triviale und Aktivierungen, aber nicht so gut für . Da negative Eingaben nur auf Null setzt, wird die Hälfte der Varianz grob entfernt, und dies lässt sich leicht ändern, indem eine der obigen Bedingungen mit zwei multipliziert wird:tanh ReLU f(s)=ReLU(s)
quelle
Infolgedessen ermöglicht die Stapel-Normalisierung ein schnelleres Training, indem viel höhere Lernraten verwendet werden, und verringert das Problem einer schlechten Initialisierung. BN ermöglicht auch die Verwendung von Sättigungs-Nichtlinearitäten, indem verhindert wird, dass das Netzwerk im Sättigungsmodus hängen bleibt. Zusammenfassend ist Batch-Normalisierung eine differenzierbare Transformation, die normalisierte Aktivierungen in das Netzwerk einführt. In der Praxis kann eine BN-Schicht unmittelbar nach einer vollständig verbundenen Schicht eingefügt werden.
quelle