Inizializzazione del peso xavier della CNN


14

In alcuni tutorial ho scoperto che l'inizializzazione del peso "Xavier" (articolo: comprendere la difficoltà di addestrare reti neurali profonde ) è un modo efficace per inizializzare i pesi delle reti neurali.

Per i livelli completamente collegati c'era una regola empirica in quei tutorial:

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

dove è la varianza dei pesi per uno strato, inizializzato con una distribuzione normale e , è la quantità di neuroni nel genitore e nello strato corrente.Var(W)ninnout

Esistono regole empiriche simili per i livelli convoluzionali?

Sto lottando per capire quale sarebbe meglio inizializzare i pesi di uno strato convoluzionale. Ad esempio in un livello in cui la forma dei pesi è (5, 5, 3, 8), quindi la dimensione del kernel è 5x5, filtrare tre canali di input (input RGB) e creare 8mappe di funzionalità ... sarebbe 3considerata la quantità di neuroni di input? O meglio 75 = 5*5*3, perché gli input sono 5x5patch per ogni canale di colore?

Accetterei entrambi, una risposta specifica che chiarisca il problema o una risposta più "generica" ​​che spieghi il processo generale di ricerca della corretta inizializzazione dei pesi e preferibilmente il collegamento delle fonti.

Risposte:


13

In questo caso la quantità di neuroni dovrebbe essere 5*5*3.

L'ho trovato particolarmente utile per gli strati convoluzionali. Spesso funziona anche una distribuzione uniforme nell'intervallo . [c/(in+out),c/(in+out)]

È implementato come opzione in quasi tutte le librerie di reti neurali. Qui puoi trovare il codice sorgente dell'implementazione di Keras dell'inizializzazione di Xavier Glorot.


1
Hmm..hai qualche consiglio aggiuntivo? Ad esempio, una delle mie reti ha uno strato completamente connesso con 480.000 neuroni. Se applico l'inizializzazione di Xavier finisco con una variazione di circa e la mia rete impara solo alcuni strani schemi di interferenza. Immagino che rientri nel minimo locale. Voglio dire, i pesi sono davvero piccoli allora. Per lo più ho esperienza di apprendimento ragionevole con qualcosa nell'intervallo . Qualche idea su questo? Penso che l'inizializzazione di Xavier non si applichi a livelli molto grandi? 1106[0.1,0.01]
daniel451,

@ascenator mi dispiace non so molto su come i pesi cambiano durante l'allenamento. a volte risultati strani possono tuttavia provenire da tassi di apprendimento troppo grandi / piccoli.
dontloo,

Molte librerie DL prendono un termine di deviazione standard, non un termine di varianza, come parametro per i loro metodi di generazione di numeri casuali. Quindi, per una variazione di , avresti bisogno di una deviazione standard di , che potrebbe spiegare i tuoi risultati. 106103
eric.mitchell,

0

Secondo la risposta di Eric qui. Prendo anche il "sqrt" del termine e non solo quel termine. Nonostante ciò, quando si collega sigmoid in profondità nella propria rete all'output "RelU" ... può causare l'interruzione dell'allenamento. Ciò è dovuto all'uscita "Relu" illimitata che può far scendere a 0 il gradiente di sigmoid e non si verifica alcun apprendimento. Quindi, nei casi, ho un fattore "scaleDown" per la mia rete che peserà la deviazione di inizializzazione di quel fattore. Continuo a sintonizzare empiricamente i pesi fino all'apprendimento. Un modo semplice per trovare è salvare il modello immediatamente dopo 1 iterazione e dare un'occhiata all'uscita RELU (che è collegata a sigmoid). Continuare a regolare i pesi fino a quando questa uscita RELU è ragionevole. E poi usa quei pesi per allenarti. È un buon inizio Se crolla ancora dopo alcune iterazioni, appesantirli leggermente di più fino a raggiungere la stabilità. È solo un trucco che ho usato. Ha funzionato per me per la mia installazione. Quindi condividendo la mia esperienza. Cose diverse funzionano per configurazioni diverse.

Quindi buona fortuna!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.