web-dev-qa-db-fra.com

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

J'essaie de créer un réseau de neurones à partir de zéro ..___ Dans toute la littérature sur l'IA, il existe un consensus selon lequel les poids devraient être initialisés à 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 sous forme de nombres aléatoires?  

J'avais lu quelque part que c'était fait pour "casser la symétrie" et que le réseau de neurones apprenait plus vite. Comment briser la symétrie permet-il d’apprendre plus vite?

Initialiser les poids à 0 ne serait-il pas une meilleure idée? De cette façon, les poids pourraient trouver leurs valeurs (positives ou négatives) plus rapidement?

Existe-t-il une autre philosophie sous-jacente à la randomisation des pondérations en espérant qu'elles seraient proches de leurs valeurs optimales une fois initialisées?

79
Shayan RC

Briser la symétrie est essentiel ici, et non pour des raisons de performance. Imaginez les deux premières couches de perceptron multicouches (couches d'entrée et cachées): 

enter image description here

Pendant la propagation en avant, chaque unité de la couche cachée reçoit un signal:

enter image description here

Autrement dit, chaque unité cachée reçoit 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 zéro. Peu importe l’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 pondérations de manière aléatoire (ou au moins avec des valeurs différentes). Notez que ce problème affecte toutes les architectures utilisant des connexions de chaque à chaque. 

107
ffriend

Analogie:

J'espère que c'est une bonne analogie. J'ai essayé de l'expliquer le plus simplement possible.

Imaginez que quelqu'un vous ait déposé d'un hélicoptère vers une montagne inconnue et que vous soyez coincé à cet endroit. Tout est embué. La seule chose que vous savez, c'est que vous devriez atteindre le niveau de la mer. Quelle direction devriez-vous prendre pour descendre au point le plus bas possible?

Si vous ne pouviez pas trouver un moyen d'atteindre le niveau de la mer et que l'hélicoptère vous emmènerait à nouveau et vous déposerait au sommet de la montagne. Vous devrez à nouveau suivre les mêmes instructions car vous vous "initialisez" sur le même positions de départ.

Cependant, chaque fois que l'hélicoptère vous dépose quelque part aléatoire sur la montagne, vous suivez des étapes et des étapes différentes. Donc, il y aurait une meilleure chance 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 _ (qui est différent) afin que vous puissiez trouver différentes solutions au même problème.

Dans cette analogie, où vous avez atterri sont les poids. Ainsi, avec des poids différents, il y a une meilleure chance d'atteindre le point le plus bas (ou inférieur).

En outre, il augmente entropie} dans le système, ce qui permet au système de créer plus d'informations pour vous aider à trouver les points les plus bas (minimums locaux ou globaux).

 enter image description here

51
Inanc Gumus

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, votre solution est orientée vers un ensemble de poids particulier. 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 à d'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).

26
lejlot
  1. Initialiser les poids à 0 ne serait-il pas une meilleure idée? De cette façon, les poids pourraient trouver leurs valeurs (positives ou négatives) plus rapidement?

  2. Comment briser la symétrie permet-il d’apprendre plus vite?

Si vous initialisez tous les poids à zéro, tous les neurones de toutes les couches effectuent le même calcul, donnant la même sortie et en rendant le tout le réseau profond inutile . Si les poids sont nuls, la complexité de l'ensemble du réseau profond serait la même que celle d'un neurone unique et les prédictions ne seraient rien de mieux que le hasard.

Les nœuds côte à côte dans une couche masquée connectée aux mêmes entrées doivent avoir des pondérations différentes pour que l'algorithme d'apprentissage mette à jour les pondérations.

En faisant des 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 symétrie est brisée.

  1. Existe-t-il une autre philosophie sous-jacente à la randomisation des poids en espérant qu'ils seraient proches de leurs valeurs optimales une fois initialisés?

Les algorithmes d'optimisation stochastiques, tels que la descente de gradient stochastique, utilisent le caractère aléatoire pour sélectionner un point de départ pour la recherche et pour 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’optima local entraîne une convergence prématurée.

Au lieu de vous fier à un optima local, si vous exécutez votre algorithme plusieurs fois avec différentes pondérations aléatoires, il existe une meilleure possibilité de trouver un optima global sans rester bloqué à l'optima local.

Après 2015, en raison d'avancées dans la recherche sur l'apprentissage automatique, L'initialisation He-et-al n est introduit pour remplacer 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 leur plage varie en fonction de la taille de la couche précédente de neurones.

En résumé, des poids aléatoires non nuls nous aident

  1. Sortez des optima locaux
  2. Briser la symétrie
  3. Atteindre les optima globaux dans les itérations ultérieures

Références :

machinelearningmastery

versdatascience

0
Ravindra babu

Comme vous l'avez dit, le point clé est 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 de neurones feront exactement les mêmes calculs. Ce n'est pas quelque chose que nous souhaitons, car nous voulons que différentes unités cachées calculent différentes fonctions. Toutefois, cela n’est pas possible si vous initialisez tous à la même valeur.

0