Soweit ich weiß, sind die beiden von Ihnen angegebenen Formeln so ziemlich die Standardinitialisierung. Ich hatte vor einiger Zeit eine Literaturübersicht gemacht , die ich bei Interesse unten kopiert habe.
[1] befasst sich mit der Frage:
Erstens sollten Gewichte nicht auf Null gesetzt werden, um die Symmetrie bei der Rückprogrammierung zu brechen:
Verzerrungen können im Allgemeinen auf Null initialisiert werden, aber Gewichte müssen sorgfältig initialisiert werden, um die Symmetrie zwischen verborgenen Einheiten derselben Schicht zu brechen. Da unterschiedliche Ausgabeeinheiten unterschiedliche Gradientensignale empfangen, betrifft dieses Problem der Symmetriebrechung nicht die Ausgabegewichte (in die Ausgabeeinheiten), die daher auch auf Null gesetzt werden können.
Einige Initialisierungsstrategien:
- [2] und [3] empfehlen die Skalierung durch die Umkehrung der Quadratwurzel des Fan-In
- Glorot and Bengio (2010) und die Deep Learning Tutorials verwenden eine Kombination aus Fan-In und Fan-Out:
- r = 6Fan-In + Fan-Out- -- -- -- -- -- -- -- -- -√
- r = 4 6Fan-In + Fan-Out- -- -- -- -- -- -- -- -- -√
- Im Fall von RBMs funktioniert ein Gaußscher Mittelwert mit einer kleinen Standardabweichung um 0,1 oder 0,01 gut (Hinton, 2010), um die Gewichte zu initialisieren.
- Orthogonal Zufallsmatrix Initialisierung, also
W = np.random.randn(ndim, ndim); u, s, v = np.linalg.svd(W)
verwenden Sie dann u
als Initialisierung Matrix.
In einigen Situationen kann auch unbeaufsichtigtes Pre-Training hilfreich sein:
Eine wichtige Wahl ist, ob man unbeaufsichtigtes Pre-Training verwenden sollte (und welchen unbeaufsichtigten Feature-Learning-Algorithmus man verwenden soll), um Parameter zu initialisieren. In den meisten Situationen haben wir festgestellt, dass unbeaufsichtigtes Pre-Training hilft und sehr selten weh tut, aber das impliziert natürlich zusätzliche Trainingszeit und zusätzliche Hyperparameter.
Einige ANN-Bibliotheken haben auch einige interessante Listen, z. B. 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. " Die Schwierigkeit verstehen, tiefe vorwärtsgerichtete neuronale Netze zu trainieren ." Internationale Konferenz über künstliche Intelligenz und Statistik. 2010.