Was sind gute Anfangsgewichte in einem neuronalen Netzwerk?

68

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(1d,1d)d

Warum ist das eine gute Idee?

Elmes
quelle
Eine Übersicht über die Initialisierungstechniken finden Sie in meiner Masterarbeit, Seite 81 .
Martin Thoma

Antworten:

47

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 221/10101/220001022002

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 ( - 101d01(1d,1d)0 d[-4,4]d13d[4,4]d

Bei Eingaben, die nicht normalisiert sind, können diese Gewichte die Sättigung möglicherweise nicht wirksam vermeiden.

Douglas Zare
quelle
1
Grundsätzlich sollte man also immer zumindest überlegen, Daten zu normalisieren. Das macht jetzt Sinn. Können Sie erklären, warum die Standardabweichung 1/3 beträgt und wie gering die Wahrscheinlichkeit ist, dass die Eingabesumme außerhalb des Bereichs <-4,4> liegt?
Elmes
1
Es gibt einige grundlegende Eigenschaften der Varianz, die dies implizieren: Wenn und unabhängig sind, dann ist und wenn und sind unabhängig und haben den Mittelwert , dann ist . Y Var ( X + Y ) = Var ( X ) + Var ( Y ) X Y 0 Var ( X * Y ) = Var ( X ) * Var ( Y )XYVar(X+Y)=Var(X)+Var(Y)XY0Var(XY)=Var(X)Var(Y)
Douglas Zare
1
Mit der Chebyshev-Ungleichung können Sie die Wahrscheinlichkeit abschätzen, dass eine Zufallsvariable mindestens Standardabweichungen vom Mittelwert entfernt ist. In der Praxis ist dies nicht scharf, aber das genaue Ergebnis hängt von der Verteilung ab. 12
Douglas Zare
Übrigens habe ich mich verrechnet. Die Varianz ist , die Standardabweichung ist also . 1313
Douglas Zare
1
"Die Logistikfunktion ist für große positive oder negative Eingaben nahezu flach. Die Ableitung bei einer Eingabe von ..." Sollte das relevante Thema nicht die Ableitung der Kostenfunktion der logistischen Regression sein? Wobei die Eingabe in die Ableitung der Kostenfunktion bereits von der Logistikfunktion auf (0,1) skaliert wird, unabhängig von der Größe der Gewichte und Signale?
Moobie
28

[1] befasst sich mit der Frage:

Erstens sollten die Gewichte nicht auf Null gesetzt werden, um die Symmetrie beim Zurückprogrammieren zu durchbrechen:

Vorspannungen können im Allgemeinen auf Null initialisiert werden, aber die Gewichte müssen sorgfältig initialisiert werden, um die Symmetrie zwischen verborgenen Einheiten derselben Ebene zu unterbrechen. Da unterschiedliche Ausgabeeinheiten unterschiedliche Gradientensignale empfangen, betrifft dieses Problem der Symmetrieunterbrechung nicht die Ausgabegewichte (in die Ausgabeeinheiten), die daher auch auf Null gesetzt werden können.

Einige Initialisierungsstrategien:

  • [2] und [3] empfehlen die Skalierung mit der Umkehrung der Quadratwurzel des Fan-In
  • Glorot und Bengio (2010) und die Deep Learning Tutorials verwenden eine Kombination aus Fan-In und Fan-Out:
    • für Einheiten mit hyperbolischer Tangente: nimm eine Uniform (-r, r) mit (fan-in ist die Zahl) der Eingänge der Einheit).r=6fan-in+fan-out
    • für sigmoide Einheiten: nimm eine Uniform (-r, r) mit (fan-in ist die Zahl) der Eingänge der Einheit).r=46fan-in+fan-out
  • Im Fall von RBMs funktioniert ein Gaußscher Mittelwert Null mit einer kleinen Standardabweichung um 0,1 oder 0,01 gut (Hinton, 2010), um die Gewichte zu initialisieren.
  • Orthogonale Zufallsmatrix-Initialisierung, dh W = np.random.randn(ndim, ndim); u, s, v = np.linalg.svd(W)dann uals Initialisierungsmatrix verwenden.

Unbeaufsichtigtes Pre-Training kann in einigen Situationen hilfreich sein:

Eine wichtige Wahl ist, ob ein unbeaufsichtigtes Vortraining (und welcher Algorithmus zum unbeaufsichtigten Lernen von Funktionen verwendet werden soll) verwendet werden soll, um die Parameter zu initialisieren. In den meisten Situationen haben wir festgestellt, dass unbeaufsichtigtes Pre-Training hilft und nur sehr selten zu Schmerzen führt, aber dies impliziert natürlich zusätzliche Trainingszeit und zusätzliche Hyperparameter.

Einige ANN-Bibliotheken haben auch einige interessante Listen, zB Lasagne :

Constant([val]) Initialize weights with constant value.
Normal([std, mean]) Sample initial weights from the Gaussian distribution.
Uniform([range, std, mean]) Sample initial weights from the uniform distribution.
Glorot(initializer[, gain, c01b])   Glorot weight initialization.
GlorotNormal([gain, c01b])  Glorot with weights sampled from the Normal distribution.
GlorotUniform([gain, c01b]) Glorot with weights sampled from the Uniform distribution.
He(initializer[, gain, c01b])   He weight initialization.
HeNormal([gain, c01b])  He initializer with weights sampled from the Normal distribution.
HeUniform([gain, c01b]) He initializer with weights sampled from the Uniform distribution.
Orthogonal([gain])  Intialize weights as Orthogonal matrix.
Sparse([sparsity, std]) Initialize weights as sparse matrix.

[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.

Franck Dernoncourt
quelle
2
Ich möchte zwei nützliche Referenzen hinzufügen: 1) Eintauchen in Gleichrichter: Überlegene Leistung auf menschlicher Ebene bei der ImageNet-Klassifizierung - Über die Bedeutung aktivierungsbewusster Skalierung arxiv.org/abs/1502.01852 2) Genaue Lösungen für die nichtlineare Dynamik von lernen in tiefen linearen neuronalen netzen arxiv.org/abs/1312.6120 - orthonormale matrizen sind viel besser als nur gaußsches rauschen
old-ufo
1
Ein Redakteur schlägt vor, die Initialisierungen für das Sigma und den hyperbolischen Tangens so zu ändern, dass sie mit dem Originalpapier übereinstimmen.
gung - Wiedereinsetzung von Monica
2
Wolltest du diese Bearbeitung behalten, Frank? Wenn nicht, können Sie es zurücksetzen.
gung - Wiedereinsetzung von Monica
Ich muss etwas vermissen. Wo steht in der Veröffentlichung von Glorot und Bengio (2010), dass empfohlen wird, den 4-fachen Wert von Gleichung 16 zu verwenden, wenn logistische Sigmoid-Aktivierungsfunktionen verwendet werden? Gleichung 16 ergibt sich aus der Verwendung von Gleichung 12 und der Varianz einer Gleichverteilung, Gleichung 16 wird jedoch unter der Annahme einer symmetrischen Aktivierung mit einer Einheitsableitung bei 0 abgeleitet. Dies ist beispielsweise eine tanh-Aktivierungsfunktion, jedoch keine logistische Aktivierungsfunktion (nicht symmetrisch). Außerdem testen sie diese vorgeschlagene Initialisierung nicht einmal mit logistischem Sigmoid. sie testen es nur mit tanh und softsign.
Tommy L
10

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

<xi>=0
<xi2>=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

y=g(a)
a=i=0dwixi
<a>=i=0d<wixi>=i=0d<wi><xi>=0
<a2>=(i=0dwixi)(i=0dwixi)=i=0d<wi2><xi2>=σ2d
<wiwj>=δij
Juampa
quelle
Kleiner Fehler: statt . <xi2>=10
Bayerj
Dies erklärt, wie Sie ein Ceratin- vorausgesetzt, Sie kennen das erforderliche . Nach meinem Verständnis sollte klein sein, um einen großen Wert des Sigmoid-Derivats zuzulassen, aber nicht zu klein, damit die Deltas nicht verschwinden. Ist das wahr? Wenn ja - ist es eine gute Faustregel zu sagen, dass ~ 0,2 sein sollte? σααα
Uri
Dies gilt insbesondere für tiefe neuronale Netze, bei denen Einheiten beim Hinzufügen von Ebenen schnell gesättigt werden. Es gibt eine Reihe von Artikeln, die sich mit dieser Frage befassen. Ein guter Startpunkt könnte sein: "Die Schwierigkeit des Trainings tiefer neuronaler Netze mit Vorwärtskopplung verstehen" von glorot und bengio
jpmuc,
10

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 der ndie 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: Die Konvergenz eines 22-lagigen Großmodells

Ambodi
quelle
Beeindruckend! Signifikante Verbesserung für mich.
Thomas W
Nicht für eine große Anzahl von Eingaben ... schlägt mit MNIST fehl.
Thomas W
Beachten Sie, dass die He-Initialisierung speziell für (P) ReLUs entwickelt wurde und die Tatsache berücksichtigt, dass sie nicht symmetrisch ist (was eine der Annahmen bei der Xavier-Initialisierung ist). Lassen Sie sich von dieser Grafik nicht aus dem Zusammenhang bringen!
Herr Tsjolder
5

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.

Aktivierungen in einem ReLU MLP mit unterschiedlichen Initialisierungsstrategien

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.

x(i)iniw(i)(i+1)ff(s)1

Var(x(i+1))=niVar(x(i))Var(w(i))

Um wir daher die Bedingung auferlegenVar(x(i+1))=Var(x(i))

Var(w(i))=1ni.

Wenn wir mit , wollen wir auf ähnliche Weise den RückwärtsdurchlaufLxj(i)Δj(i)

Var(Δ(i))=ni+1Var(Δ(i+1))Var(w(i)).

Sofern nicht , müssen wir zwischen diesen beiden Bedingungen Kompromisse eingehen, und eine vernünftige Wahl ist das harmonische Mittelni=ni+1

Var(w(i))=2ni+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+1U(a,a)a=6ni+ni+1Var(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:tanhReLUf(s)=ReLU(s)

Var(w(i))=2ni.
Andre P
quelle
3

μB=1mi=1Mxi   and   σB2=1mi=1m(xiμB)2x^i=xiμBσB2+ϵ   and   BN(xi)=γx^i+β
xiBN(xi)x^iγβ

γβx^ixixix^iβγwährend dem Training. Somit stabilisiert die Batch-Normalisierung das Lernen.

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.

Vadim Smolyakov
quelle