J'essaye de construire un réseau neuronal à partir de zéro. Dans toute la littérature sur l'IA, il existe un consensus sur le fait que les pondérations doivent être initialisées à des nombres aléatoires pour que le réseau converge plus rapidement.
Mais pourquoi les poids initiaux des réseaux de neurones sont-ils initialisés en tant que nombres aléatoires?
J'avais lu quelque part que cela est fait pour "briser la symétrie" et cela permet au réseau neuronal d'apprendre plus rapidement. Comment la rupture de la symétrie permet-elle d'apprendre plus rapidement?
L'initialisation des poids à 0 ne serait-elle pas une meilleure idée? De cette façon, les pondérations pourraient trouver leurs valeurs (positives ou négatives) plus rapidement?
Y a-t-il une autre philosophie sous-jacente derrière la randomisation des poids en dehors de l'espoir qu'ils seraient proches de leurs valeurs optimales une fois initialisés?
la source
Réponses:
La rupture de la symétrie est ici essentielle, et non pour des raisons de performance. Imaginez les 2 premières couches de perceptron multicouche (couches d'entrée et cachées):
Pendant la propagation vers l'avant, chaque unité de la couche cachée reçoit le signal:
Autrement dit, chaque unité cachée obtient la somme des entrées multipliée par le poids correspondant.
Imaginez maintenant que vous initialisez tous les poids à la même valeur (par exemple zéro ou un). Dans ce cas, chaque unité cachée recevra exactement le même signal . Par exemple, si tous les poids sont initialisés à 1, chaque unité reçoit un signal égal à la somme des entrées (et des sorties
sigmoid(sum(inputs))
). Si tous les poids sont des zéros, ce qui est encore pire, chaque unité cachée recevra un signal nul. Quelle que soit la valeur d'entrée - si tous les poids sont identiques, toutes les unités de la couche masquée seront également identiques .C'est le principal problème de symétrie et la raison pour laquelle vous devez initialiser les poids de manière aléatoire (ou, au moins, avec des valeurs différentes). Notez que ce problème affecte toutes les architectures qui utilisent des connexions de chaque à chaque.
la source
symmetry
ne pas utiliser le motcorrelation
? Qui a utilisé le mot en premier?Analogie:
J'espère que c'est une bonne analogie. J'ai essayé de l'expliquer aussi simplement que possible.
Imaginez que quelqu'un vous ait déposé d'un hélicoptère au sommet d'une montagne inconnue et que vous y soyez coincé. Partout est embué. La seule chose que vous savez, c'est que vous devriez descendre au niveau de la mer d'une manière ou d'une autre. Quelle direction faut-il prendre pour descendre au point le plus bas possible?
Si vous ne parveniez pas à trouver un moyen d'atteindre le niveau de la mer et que l'hélicoptère vous ramènerait et vous déposerait à la même position au sommet de la montagne. Vous devrez reprendre les mêmes directions car vous vous «initialisez» aux mêmes positions de départ .
Cependant, chaque fois que l'hélicoptère vous dépose quelque part au hasard sur la montagne, vous prenez des directions et des étapes différentes. Ainsi, il y aurait une meilleure chance pour vous d'atteindre le point le plus bas possible.
C'est ce que l'on entend par briser la symétrie . L'initialisation est asymétrique ( ce qui est différent ) afin que vous puissiez trouver différentes solutions au même problème.
Dans cette analogie, là où vous atterrissez, ce sont les poids . Ainsi, avec des poids différents, il y a de meilleures chances d'atteindre le point le plus bas ( ou le plus bas ).
En outre, cela augmente l' entropie dans le système afin que le système puisse créer plus d'informations pour vous aider à trouver les points les plus bas ( minimum local ou global ).
la source
La réponse est plutôt simple. Les algorithmes de formation de base sont de nature gourmande - ils ne trouvent pas l'optimum global, mais plutôt - la solution locale «la plus proche». En conséquence, partir de toute initialisation fixe biaise votre solution vers un ensemble particulier de poids. Si vous le faites au hasard (et peut-être plusieurs fois), il est beaucoup moins probable que vous restiez coincé dans une partie étrange de la surface d'erreur.
Le même argument s'applique aux autres algorithmes, qui ne sont pas capables de trouver un optimum global (k-means, EM, etc.) et ne s'applique pas aux techniques d'optimisation globale (comme l'algorithme SMO pour SVM).
la source
Comme vous l'avez mentionné, le point clé est de briser la symétrie . Parce que si vous initialisez tous les poids à zéro, tous les neurones cachés (unités) de votre réseau neuronal feront exactement les mêmes calculs. Ce n'est pas quelque chose que nous souhaitons parce que nous voulons que différentes unités cachées calculent différentes fonctions. Cependant, cela n'est pas possible si vous initialisez tous à la même valeur.
la source
Si vous initialisez tous les poids à zéro, alors tous les neurones de toutes les couches effectuent le même calcul, donnant la même sortie et là en rendant le réseau profond entier inutile . Si les poids sont nuls, la complexité de l'ensemble du réseau profond serait la même que celle d'un seul neurone et les prédictions ne seraient rien de mieux que aléatoires.
Les nœuds qui sont côte à côte dans une couche masquée connectée aux mêmes entrées doivent avoir des poids différents pour que l'algorithme d'apprentissage mette à jour les poids.
En rendant les poids non nuls (mais proches de 0 comme 0,1, etc.), l'algorithme apprendra les poids dans les prochaines itérations et ne sera pas bloqué. De cette façon, la rupture de la symétrie se produit.
Les algorithmes d'optimisation stochastique tels que la descente de gradient stochastique utilisent le hasard dans la sélection d'un point de départ pour la recherche et dans la progression de la recherche.
La progression de la recherche ou de l'apprentissage d'un réseau de neurones est appelée convergence. La découverte d'une solution sous-optimale ou d'un optima local entraîne une convergence prématurée.
Au lieu de vous fier à un seul optima local, si vous exécutez votre algorithme plusieurs fois avec différents poids aléatoires, il existe une meilleure possibilité de trouver des optima globaux sans rester coincé sur des optima locaux.
Après 2015, en raison des progrès de la recherche sur l'apprentissage automatique, He-et-al Initializatio n est introduit pour remplacer l'initialisation aléatoire
Les poids sont toujours aléatoires mais varient en fonction de la taille de la couche de neurones précédente.
En résumé, les poids aléatoires non nuls nous aident
la source
Outre l'initialisation avec des valeurs aléatoires, les poids initiaux ne doivent pas commencer par des valeurs élevées. C'est parce que nous utilisons souvent les fonctions tanh et sigmoid dans les couches cachées et les couches de sortie. Si vous regardez les graphiques des deux fonctions, après la propagation vers l'avant à la première itération, il en résulte des valeurs plus élevées, et ces valeurs correspondent aux endroits dans les fonctions sigmoïde et tanh qui font converger la dérivée vers zéro. Cela conduit à un démarrage à froid du processus d'apprentissage et à une augmentation du temps d'apprentissage. Par conséquent, si vous démarrez les pondérations au hasard, vous pouvez éviter ces problèmes en multipliant ces valeurs par des valeurs telles que «0,01» ou «0,001».
la source
Tout d'abord, certains algorithmes convergent même avec des pondérations initiales nulles. Un exemple simple est un réseau linéaire de Perceptron. Bien sûr, de nombreux réseaux d'apprentissage nécessitent une pondération initiale aléatoire (bien que ce ne soit pas une garantie d'obtenir la réponse la plus rapide et la meilleure ).
Les réseaux de neurones utilisent la rétro-propagation pour apprendre et mettre à jour les pondérations, et le problème est que dans cette méthode, les pondérations convergent vers l'optimum local (coût / perte minimum local), et non vers l'optimum global.
La pondération aléatoire aide le réseau à prendre des risques pour chaque direction dans l'espace disponible et à les améliorer progressivement pour arriver à une meilleure réponse et ne pas se limiter à une seule direction ou réponse.
[L'image ci-dessous montre un exemple unidimensionnel de la façon dont la convergence. Compte tenu de l'emplacement initial, une optimisation locale est réalisée mais pas une optimisation globale. À des dimensions plus élevées, la pondération aléatoire peut augmenter les chances d'être au bon endroit ou de mieux commencer, ce qui se traduit par une convergence des poids vers de meilleures valeurs.] [1]
[1]: https://i.stack.imgur.com/2dioT.png [Kalhor, A. (2020). Classification et régression NNs. Conférence.]
Dans le cas le plus simple, le nouveau poids est le suivant:
Ici, le gradient de la fonction de coût est ajouté au poids précédent pour obtenir un nouveau poids. Si tous les poids précédents sont identiques, à l'étape suivante, tous les poids peuvent être égaux. En conséquence, dans ce cas, d'un point de vue géométrique, le réseau de neurones est incliné dans une direction et tous les poids sont les mêmes. Mais si les poids sont différents, il est possible de mettre à jour les poids de différentes quantités. (selon le facteur d'impact que chaque poids a sur le résultat, il affecte le coût et les mises à jour des poids. Ainsi, même une petite erreur dans la pondération aléatoire initiale peut être résolue).
C'était un exemple très simple, mais il montre l'effet de l'initialisation de la pondération aléatoire sur l'apprentissage. Cela permet au réseau de neurones d'aller dans différents espaces au lieu d'aller d'un côté. En conséquence, dans le processus d'apprentissage, allez au meilleur de ces espaces
la source
Soyons plus mathématique. En fait, la raison pour laquelle je réponds est que j'ai trouvé ce petit peu absent des autres réponses. Supposons que vous ayez 2 couches. Si nous regardons l'algorithme de rétro-propagation, le calcul de
dZ2 = A2 - Y
dW2 = (1 / m) * dZ2 * A2.T
Ignorons db2. (Désolé pas désolé;))
dZ1 = W2.T * dZ2. * g1 '(Z1)
...
Le problème que vous voyez est en gras. Le calcul de dZ1 (qui est nécessaire pour calculer dW1) contient W2 qui est 0. Nous n'avons jamais eu la chance de changer les poids en quoi que ce soit au-delà de 0 et nous ne le ferons jamais. Donc, essentiellement, le réseau neuronal n'apprend rien. Je pense que c'est pire que la régression logistique (unité unique). Dans le cas de la régression logistique, vous apprenez avec plus d'itérations puisque vous obtenez des entrées différentes grâce à X. Dans ce cas, les autres couches donnent toujours la même sortie donc vous n'apprenez pas du tout.
la source
J'ai appris une chose: si vous initialisez le poids à des zéros, il est évident que les unités d'activation dans la même couche seront les mêmes, cela signifie qu'elles auront les mêmes valeurs. Lorsque vous effectuez un backbrop, vous constaterez que toutes les lignes du gradient dW sont également identiques, donc toutes les lignes de la matrice de poids W sont les mêmes après les mises à jour de la descente du gradient. En général, l'initialisation de tous les poids à zéro entraîne l'échec du réseau à rompre la symétrie. Cela signifie que chaque neurone de chaque couche apprendra la même chose, et vous pourriez aussi bien entraîner un réseau de neurones avec
n[l]=1n[l]=1
pour chaque couche, et le réseau n'est pas plus puissant qu'un classificateur linéaire tel que la régression logistique. Cours Andrew Ng:la source