Initialisation du poids CNN Xavier

14

Dans certains tutoriels, j'ai trouvé qu'il était indiqué que l'initialisation du poids "Xavier" (article: Comprendre la difficulté de former des réseaux neuronaux profonds à action directe ) est un moyen efficace d'initialiser les poids des réseaux neuronaux.

Pour les couches entièrement connectées, il y avait une règle générale dans ces didacticiels:

Vuner(W)=2njen+nout,alternative plus simple:Vuner(W)=1njen

est la variance des poids pour une couche, initialisée avec une distribution normale et n i n , n o u t est la quantité de neurones dans le parent et dans la couche actuelle.Vuner(W)njennout

Existe-t-il des règles de base similaires pour les couches convolutives?

J'ai du mal à trouver ce qui serait le mieux pour initialiser les poids d'une couche convolutionnelle. Par exemple, dans une couche où la forme des poids est (5, 5, 3, 8), donc la taille du noyau est 5x5, le filtrage de trois canaux d'entrée (entrée RVB) et la création de 8cartes d'entités ... serait 3considéré comme la quantité de neurones d'entrée? Ou plutôt 75 = 5*5*3, parce que les entrées sont des 5x5patchs pour chaque canal de couleur?

J'accepterais les deux, une réponse spécifique clarifiant le problème ou une réponse plus "générique" expliquant le processus général de recherche de la bonne initialisation des poids et de préférence reliant les sources.

daniel451
la source

Réponses:

13

Dans ce cas, la quantité de neurones devrait être 5*5*3.

[-c/(jen+out),c/(jen+out)]

Il est implémenté en option dans presque toutes les bibliothèques de réseaux de neurones. Ici vous pouvez trouver le code source de la mise en œuvre de Keras de l'initialisation de Xavier Glorot.

dontloo
la source
1
1dix-6[0,1,0,01]
@ascenator désolé, je ne sais pas trop comment les poids changent pendant l'entraînement. des résultats parfois étranges peuvent cependant provenir de taux d'apprentissage trop élevés / trop faibles.
dontloo
dix-6dix-3
0

J'appuie ici la réponse d'Eric. Je prends également le "sqrt" du terme et pas seulement ce terme. Malgré cela, lorsque vous connectez sigmoïde au fond de votre réseau à la sortie "RelU" .... cela peut entraîner le décrochage de la formation. Cela est dû à la sortie "Relu" illimitée qui peut faire tomber le gradient à sigmoïde à 0 et aucun apprentissage ne se produit. Donc, dans les cas, j'ai un facteur "scaleDown" pour mon filet qui alourdira l'écart d'initialisation de ce facteur. Je continue à ajuster empiriquement les poids jusqu'à ce que l'apprentissage se produise. Un moyen simple de trouver est d'enregistrer le modèle immédiatement après 1 itération et de regarder la sortie RELU (qui est connectée à sigmoid). Continuez à régler les poids jusqu'à ce que cette sortie RELU soit raisonnable. Et puis utilisez ces poids pour la formation. C'est un bon début. S'il s'effondre toujours après quelques itérations, alourdissez-les un peu plus jusqu'à ce que vous atteigniez la stabilité. C'est juste un hack que j'ai utilisé. Cela a fonctionné pour moi pour ma configuration. Alors partage mon expérience. Différentes choses fonctionnent pour différentes configurations.

Alors bonne chance!

Sarnath K
la source