Pourquoi les poids des réseaux de neurones devraient-ils être initialisés à des nombres aléatoires? [fermé]


105

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?


8
Cela semble être un meilleur ajustement pour Cross Validated .
Sycorax

2
Je vote pour clore cette question car il ne s'agit pas de programmation telle que définie dans le centre d'aide mais de théorie et méthodologie générales du ML.
desertnaut

Réponses:


140

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):

entrez la description de l'image ici

Pendant la propagation vers l'avant, chaque unité de la couche cachée reçoit le signal:

entrez la description de l'image ici

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.


1
Grande explication. Mais pourquoi symmetryne pas utiliser le mot correlation? Qui a utilisé le mot en premier?
nn0p

1
@ nn0p: la corrélation implique que 2 signaux changent dans une direction similaire, mais pas toujours et pas exactement de la même amplitude. Au moins pour autant que je sache, la symétrie n'a pas de définition formelle et est utilisée ici pour représenter exactement les mêmes signaux sur tous les liens entre les nœuds, ce qui rend la formation inutile.
ffriend

@ffriend que dans le cas où nous utilisons l'abandon, la randomisation n'est pas plus nécessaire. Ai-je tort?
emanuele

1
@emanuele Dropout est en soi une sorte de randomisation, donc oui, cela devrait fonctionner. Pourtant, toutes les connexions qui ne sont pas "abandonnées" à chaque itération, recevront toujours une mise à jour symétrique, donc je suppose que l'apprentissage sera assez lent et recommande donc de toujours utiliser l'initialisation aléatoire dans n'importe quel réseau pratique.
ffriend

Cela explique bien forwardprop, mais qu'en est-il du backprop?
zell

74

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 ).

entrez la description de l'image ici


10
Il semble que l'hélicoptère vous dépose plusieurs fois quelque part au hasard sur la montagne, mais dans l'apprentissage en profondeur, nous n'avons initialisé les poids au hasard qu'une seule fois.
YuFeng Shen

1
C'est une véritable explication intuitive. Nous devrions également noter que les NN ne sont presque jamais convexes - la randomisation est donc la solution idéale - mais si vous avez une fonction de perte convexe, alors bien sûr, peu importe ce sur quoi vous initialisez vos pondérations.
Kingz

4
C'est une bonne analogie - mais il est plus logique de supposer que vous et vos amis êtes lâchés sur la montagne (c'est-à-dire des nœuds dans un réseau) - soit au même endroit, soit différentes personnes à différents endroits. Et supposez que vous pouvez tous communiquer les uns avec les autres. Différents spots avec communication permettront une descente plus rapide. Le même endroit signifie que tout le monde est susceptible de suivre le même chemin.
ahmedhosny

26

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).


Donc, il n'est pas garanti qu'il ne restera pas bloqué dans les minima locaux simplement en randomisant? Mais après plusieurs exécutions avec différents poids aléatoires, il peut obtenir le minimum global?
Shayan RC

1
Il n'y a aucune garantie, mais plusieurs initialisations peuvent aider au moins à se rapprocher du véritable optimum.
lejlot

Existe-t-il une formule ou une règle standard pour définir la valeur pour initialiser les poids ?? J'ai un réseau neuronal à rétroaction, multicouche et à rétroaction, où la fonction sigmoïde est utilisée.
lkkkk

il y a une règle empirique dans le livre de S.Haykin "neural networks"
lejlot

3
Ce n'est pas la raison pour laquelle les gens utilisent l'initialisation aléatoire, car la plupart des gens ne redémarrent pas l'entraînement plusieurs fois avec différentes initialisations aléatoires et le net est toujours en mesure d'obtenir de bons optima locaux.
cesarsalgado

4

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.


2
  1. 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?

  2. Comment la rupture de la symétrie permet-elle d'apprendre plus rapidement?

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.

  1. 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?

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

w=np.random.randn(layer_size[l],layer_size[l-1])*np.sqrt(2/layer_size[l-1])

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

  1. Sortez des optima locaux
  2. Briser la symétrie
  3. Atteignez les optima mondiaux dans d'autres itérations

1

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».


1

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:

W_new = W_old + D_loss

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


0

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.


0

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]=1pour 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:

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.