Je viens d’entendre que c’est une bonne idée de choisir les poids initiaux d’un réseau de neurones dans la plage , où est le nombre d'entrées dans un neurone donné. On suppose que les ensembles sont normalisés - moyenne 0, variance 1 (je ne sais pas si cela compte).d
Pourquoi est-ce une bonne idée?
Réponses:
Je suppose que vous utilisez des neurones logistiques et que vous vous entraînez par gradient / descente / rétro-propagation.
La fonction logistique est presque plate pour les grandes entrées positives ou négatives. Le dérivé à une entrée est d' environ 1 / 10 , mais 10 le dérivé est d' environ 1 / 22 000 . Cela signifie que si l'entrée d'un neurone logistique est 10, alors, pour un signal d'entraînement donné, le neurone apprendra environ 2200 fois plus lentement que si l'entrée était 2 .2 1/10 10 1/22000 10 2200 2
Si vous voulez que le neurone apprenne rapidement, vous devez produire un signal d’entraînement important (par exemple, avec une fonction de perte d’entropie croisée) ou vous voulez que le dérivé soit grand. Pour rendre la dérivée grande, vous définissez les poids initiaux de manière à obtenir souvent des entrées comprises dans la plage .[−4,4]
Les poids initiaux que vous avez donnés pourraient ou non fonctionner. Cela dépend de la façon dont les entrées sont normalisées. Si les entrées sont normalisées avec une moyenne de et un écart type de 1 , alors une somme aléatoire de d termes avec des pondérations uniformes sur ( - 10 1 d aura la moyenne0et la variance1(−1d√,1d√) 0 , indépendant ded. La probabilité que vous obteniez une somme en dehors de[-4,4]est petite. Cela signifie que si vous augmentezd, vous ne causez pas aux neurones une saturation au départ afin qu'ils n'apprennent pas.13 d [−4,4] d
Avec des entrées qui ne sont pas normalisées, ces poids peuvent ne pas être efficaces pour éviter la saturation.
la source
[1] répond à la question:
Tout d'abord, les poids ne doivent pas être réglés sur des zéros afin de casser la symétrie lors de la propagation en arrière:
Quelques stratégies d'initialisation:
W = np.random.randn(ndim, ndim); u, s, v = np.linalg.svd(W)
utiliser ensuiteu
comme matrice d’initialisation.De plus, une pré-formation non supervisée peut aider dans certaines situations:
Certaines bibliothèques ANN ont aussi des listes intéressantes, par exemple Lasagne :
[1] Bengio, Yoshua. " Recommandations pratiques pour la formation d'architectures profondes basée sur le gradient. " Réseaux de neurones: astuces du métier. Springer Berlin Heidelberg, 2012. 437-478.
[2] LeCun, Y., Bottou, L., Orr, GB et Muller, K. (1998a). Backprop efficace Dans les réseaux de neurones, astuces du commerce .
[3] Glorot, Xavier et Yoshua Bengio. " Comprendre la difficulté de former des réseaux de neurones à feedforward profond ." Conférence internationale sur l'intelligence artificielle et les statistiques. 2010.
la source
L'explication suivante est tirée de l'ouvrage: Réseaux de neurones pour la reconnaissance de formes par Christopher Bishop. Grand livre! Supposons que vous ayez préalablement blanchi les entrées des unités d’entrée, c.-à-d. et < x 2 i > = 1
La question est: comment choisir le mieux les poids? L'idée est de choisir des valeurs de pondération aléatoires à la suite d'une distribution, ce qui permet au processus d'optimisation de converger vers une solution significative.
Vous avez pour l'activation des unités de la première couche, où a = d ∑ i = 0 w i x i . Maintenant, puisque vous choisissez les poids indépendamment des entrées, < a > = d Σ i = 0 < w i Ix i > = d Σ i = 0 < w i > < x i > = 0
la source
Comme une mise à jour, Approfondissement des redresseurs: Dépasser les performances humaines n ImageNet Classification de He et al ont introduit une initialisation spécifique à l’initialisation
w = U([0,n]) * sqrt(2.0/n)
oùn
est le nombre d’entrées de votre NN. J'ai vu cette initialisation utilisée dans de nombreux travaux récents (également avec ReLU). Ils montrent en fait comment cela commence à réduire le taux d'erreur beaucoup plus rapidement que le (-1 / n, 1 / n) que vous avez mentionné. Pour une explication détaillée, voir le document mais voici à quelle vitesse cela converge:la source
L'idée est que vous souhaitiez initialiser les poids de manière à assurer un bon flux de données en amont et en aval sur le réseau. Autrement dit, vous ne voulez pas que les activations soient constamment réduites ou croissantes à mesure que vous progressez sur le réseau.
Cette image montre les activations d'un Perceptron multicouche ReLU à 5 couches sous 3 stratégies d'initialisation différentes après un passage de MNIST à travers le réseau.
Dans les trois cas, les poids sont tirés d'une distribution normale centrée sur zéro, qui est déterminée par son écart type. Vous pouvez voir que si les poids initiaux sont trop petits (l'écart type est petit), les activations sont étouffées et que si elles sont trop grandes, les activations explosent. La valeur du milieu, à peu près juste, peut être trouvée en définissant des pondérations telles que la variance des activations et des mises à jour de gradients reste approximativement la même lorsque vous passez sur le réseau.
J'ai écrit un article de blog sur l'initialisation du poids qui va plus en détail, mais l'idée de base est la suivante.
la source
En conséquence, la normalisation par lots permet une formation plus rapide en utilisant des vitesses d'apprentissage beaucoup plus élevées et réduit le problème d'initialisation incorrecte. Le BN permet également d'utiliser des non-linéarités saturantes en empêchant le réseau de rester bloqué dans les modes de saturation. En résumé, la normalisation par lots est une transformation différenciable qui introduit des activations normalisées dans le réseau. En pratique, une couche BN peut être insérée immédiatement après une couche entièrement connectée.
la source