L'idea è che si desidera inizializzare i pesi in modo da garantire un buon flusso di dati in avanti e all'indietro attraverso la rete. Cioè, non vuoi che le attivazioni si riducano o aumentino costantemente mentre avanzi nella rete.
Questa immagine mostra le attivazioni di un Perceptron multistrato ReLU a 5 strati in 3 diverse strategie di inizializzazione dopo un passaggio di MNIST attraverso la rete.
In tutti e tre i casi i pesi sono estratti da una distribuzione normale centrata sullo zero che è determinata dalla sua deviazione standard. Puoi vedere che se i pesi iniziali sono troppo piccoli (la deviazione standard è piccola) le attivazioni vengono soffocate e se sono troppo grandi le attivazioni esplodono. Il valore medio, approssimativamente corretto, può essere trovato impostando i pesi in modo tale che la varianza delle attivazioni e degli aggiornamenti del gradiente rimanga approssimativamente la stessa che si passa attraverso la rete.
Ho scritto un post sul blog sull'inizializzazione del peso che viene approfondito, ma l'idea di base è la seguente.
Se indica le attivazioni -th layer, la dimensione del layer e i pesi che li collegano al -st layer, quindi uno può mostrare che per le funzioni di attivazione con abbiamo i n i w ( i ) ( i + 1 ) f f ′ ( s ) ≈ 1x(i)iniw(i)(i+1)ff′(s)≈1
Var(x(i+1))=niVar(x(i))Var(w(i))
Per raggiungere dobbiamo quindi imporre la condizioneVar(x(i+1))=Var(x(i))
Var(w(i))=1ni.
Se denotiamo con , sul passaggio indietro vogliamo allo stesso modo∂L∂x(i)jΔ(i)j
Var(Δ(i))=ni+1Var(Δ(i+1))Var(w(i)).
A meno che , dobbiamo scendere a compromessi tra queste due condizioni e una scelta ragionevole è la media armonicani=ni+1
Var(w(i))=2ni+ni+1.
Se campioniamo pesi da una normale distribuzione soddisfiamo questa condizione con . Per una distribuzione uniforme dovremmo prendere poiché . Siamo così arrivati all'inizializzazione di Glorot. Questa è la strategia di inizializzazione predefinita per i livelli di convoluzione densi e 2D in Keras, ad esempio.N(0,σ)σ=2ni+ni+1−−−−−√U(−a,a)a=6ni+ni+1−−−−−√Var(U(−a,a))=a2/3
L'inizializzazione di Glorot funziona abbastanza bene per le attivazioni banali e , ma non funziona altrettanto bene per . Fortunatamente, poiché azzera semplicemente gli input negativi, rimuove approssimativamente metà della varianza e questo è facilmente modificato moltiplicando una delle nostre condizioni sopra per due:tanhReLUf(s)=ReLU(s)
Var(w(i))=2ni.