[PYTHON] La méthode d'initialisation des paramètres de poids dans un réseau neuronal est résumée avec implémentation (valeurs initiales de Xavier, He et al., Etc.)

introduction

Le contenu de base de la façon de donner la valeur initiale du paramètre de poids dans le réseau neuronal est résumé. Le paramètre de poids est le coefficient utilisé lors de la combinaison des neurones. Dans la figure ci-dessous, il s'agit de la valeur à multiplier par la couche d'entrée lors de la connexion entre les couches.

image.png

Les références

Cette fois, j'ai créé l'article en référence aux deux livres suivants publiés par O'Reilly.

  1. Deep Learning à partir de zéro - la théorie et la mise en œuvre de l'apprentissage profond appris en Python
  2. Apprentissage automatique pratique avec scikit-learn et TensorFlow

Le contour est ci-dessous.

Réglage des paramètres de poids

Dans un perceptron multicouche, ** la méthode de mise à jour du paramètre de poids est importante ** pour déterminer la précision d'apprentissage et la vitesse du modèle. La mise à jour du paramètre de poids nécessite un gradient de la fonction de perte. Ce gradient est déterminé par la ** méthode de propagation d'erreur inverse ** dans un perceptron multicouche.

Considérez comment les paramètres de poids doivent être définis dans cette méthode de propagation d'erreur inverse. Comme exemple de programme, considérons un Perceptron ** multicouche avec 5 couches, chaque couche ayant 100 neurones. Les données d'entrée génèrent au hasard 1000 données avec une distribution gaussienne et les envoient à ce perceptron multicouche. La fonction d'activation utilise la fonction sigmoïde.

Weight.py


input_data = np.random.randn(1000, 100)  #1000 données
node_num = 100  #Nombre de nœuds (neurones) dans chaque couche cachée
hidden_layer_size = 5  #5 couches cachées
activations = {}  #Enregistrez le résultat de l'activation ici

x = input_data

for i in range(hidden_layer_size):
    if i != 0:
        x = activations[i-1]

    w = np.random.normal(0,0,(node_num, node_num))#Modifiez cette valeur pour déterminer le paramètre de poids
    a = np.dot(x, w)
    z = sigmoid(a)
    activations[i] = z

Lorsque la valeur du paramètre de poids est grande

Tout d'abord, considérez ** lorsque la valeur initiale du paramètre de poids est extrêmement élevée **. Regardons le paramètre de poids à ce moment-là et le résultat de l'activation de chaque couche (= valeur après la fonction d'activation). C'est le cas lorsque ** l'écart type du paramètre de poids est de 10 **.

image.png

Vous pouvez voir que les valeurs d'activation de chaque couche sont biaisées vers 0 et 1. ** Si la valeur de sortie de la fonction d'activation est biaisée sur 0 ou 1, cela signifie que la valeur du gradient devient plus petite lors de l'utilisation de cette valeur de sortie lors de la mise à jour du paramètre de poids. ** Cela entraînera la non-mise à jour des paramètres de poids. Il s'agit d'un problème appelé ** disparition du gradient **.

Lorsque le paramètre de poids est 0

Ensuite, lorsque l'écart type du paramètre de poids est de 0,0.

image.png

Le résultat est que la valeur d'activation est concentrée sur 0,5. ** Il s'agit d'une situation d'activation biaisée. ** Le problème de la disparition du gradient mentionné précédemment ne s'est pas produit. ** Cependant, être biaisé signifie qu'il y a un problème d'expressivité du modèle. En effet, si la même valeur est sortie de plusieurs neurones, la signification de plusieurs valeurs existantes disparaît. En d'autres termes, le même résultat peut être obtenu en réduisant le nombre de couches.

Relation avec le processus de développement de l'apprentissage profond

Le phénomène de disparition du gradient vu précédemment est un problème qui a été observé empiriquement. Ce problème est propre aux perceptrons multicouches et a été l'une des raisons pour lesquelles la recherche n'a pas beaucoup progressé (≒ peu populaire).

Bien que l'idée du perceptron multicouche (≒ réseau de neurones) elle-même ait été proposée depuis les années 1980, elle ne s'est pas beaucoup développée en raison de problèmes tels que ** coût de calcul énorme, disparition de gradient, solution optimale locale, etc. **. Dans les années 2010, ** le développement de matériels hautes performances tels que les GPU et le développement d'algorithmes qui résolvent divers problèmes ** semblent avoir conduit à la mode d'aujourd'hui.

Résolution du problème de la disparition du gradient (à propos de la valeur initiale de Xavier)

Concernant cette problématique liée à la disparition des gradients, une méthode d'initialisation appelée ** pré-apprentissage, proposée par Hinton et al. De l'Université de Toronto en 2006, a été proposée. ** **

Reducing the Dimensionality of Data with Neural Networks http://www.cs.toronto.edu/~hinton/science.pdf

Dans cet article, nous proposons une méthode pour entraîner le paramètre de poids du perceptron multicouche ** une fois en tant qu'auto-encodeur et le régler à une valeur appropriée. ** D'autre part, il y a aussi le problème de savoir comment donner le paramètre de poids de cet encodeur automatique lui-même.

En revanche, des progrès ont été réalisés en 2010 sur le comportement de cette disparition de gradient. L'article suivant a été publié par le groupe de recherche de Xavier et al.

Understanding the difficulty of training deep feedforward neural networks http://proceedings.mlr.press/v9/glorot10a.html

J'ai soulevé des questions sur les fonctions sigmoïdes les plus utilisées et les techniques d'initialisation du poids à l'époque. À ce moment, l'initialisation aléatoire a été effectuée en utilisant une distribution normale avec une moyenne de 0 et un écart type de 1. Dans ce cas, la distribution de sortie de chaque couche sera supérieure à la distribution d'entrée. Au fur et à mesure que le réseau progresse dans le sens aller, la sortie de la fonction sigmoïde sera 0 ou 1 en raison de la grande distribution.

Par conséquent, les auteurs proposent d'effectuer une opération pour initialiser le paramètre de poids dans chaque couche. Lorsque $ n_ {in} $ est le nombre de neurones dans la couche d'entrée et $ n_ {out} $ est le nombre de neurones dans la couche de sortie, la distribution ci-dessous est donnée.

\theta \sim \mathcal{U}\left(-\sqrt{\frac{6}{n_{\textrm{in}}+n_{\textrm{out}}}}, \sqrt{\frac{6}{n_{\textrm{in}}+n_{\textrm{out}}}}\right) \quad \textrm{or} \quad \mathcal{N}\left(0, \sqrt{\frac{2}{n_{\textrm{in}}+n_{\textrm{out}}}}\right)

Cette méthode d'initialisation est appelée la valeur initiale de Xavier ou la valeur initiale de Glorot.

Confirmer par mise en œuvre

Essayons d'utiliser la valeur initiale de Xavier.

image.png

Ce résultat montre que la distribution est plus large que les résultats précédents. Puisqu'il y a une diffusion modérée, il semble que l'apprentissage peut être fait efficacement sans limiter l'expressivité de la fonction sigmoïde.

À propos de la valeur initiale de He

De même, le groupe de recherche de He et al. Propose également une méthode pour éliminer la disparition du gradient par la formule suivante. La valeur initiale de Xavier mentionnée plus haut est une valeur initiale appropriée lorsque la fonction d'activation est symétrique comme la fonction sigmoïde et la fonction Tanh. En revanche, la méthode appropriée pour utiliser la fonction ReLU est la valeur initiale de He.

Soit la dimension d'entrée de chaque couche $ n_ {\ textrm {in}} $ et initialise comme suit. $ \theta \sim \mathcal{U}\left(-\sqrt{\frac{6}{n_{\textrm{in}}}}, \sqrt{\frac{6}{n_{\textrm{in}}}}\right) \quad \textrm{or} \quad \mathcal{N}\left(0, \sqrt{\frac{2}{n_{\textrm{in}}}}\right) $

Notez que $ \ mathcal {U} $ représente une distribution uniforme et $ \ mathcal {N} $ représente une distribution normale.

Comparer à l'aide des données MNIST

Maintenant, entraînons les données MNIST avec 5 couches de perceptrons multicouches (100 neurones dans chaque couche). A ce moment, le paramètre de poids initial est donné comme suit pour le calcul.

  1. Écart type 0,01
  2. Valeur initiale de Xavier (distribution gaussienne), la fonction d'activation est la fonction sigmoïde
  3. Valeur initiale de He (distribution gaussienne), la fonction d'activation est la fonction ReLU

Toutes les méthodes d'optimisation utilisent SGD.

007.png

Il a été constaté que la fonction de perte diminuait dans l'ordre de la valeur initiale de He, de la valeur initiale de Xavier et de l'écart type 0,01.

en conclusion

Cette fois, j'ai résumé le concept d'initialisation des paramètres dans le réseau neuronal. Nous avons confirmé que la valeur initiale du poids est un point très important dans l'apprentissage du réseau neuronal. La valeur initiale du poids détermine souvent le succès ou l'échec de la formation du réseau neuronal. Il peut être nécessaire de noter si ces valeurs initiales et ces fonctions d'activation sont appropriées pour le modèle que vous créez.

Le programme complet est ici. https://github.com/Fumio-eisan/Weight_20200502

La comparaison des mises à jour des paramètres de poids pour Xavier, He, etc. est weight_init_activation_histogram.py La comparaison par données MNIST est "weight_init_compare.py".

Recommended Posts

La méthode d'initialisation des paramètres de poids dans un réseau neuronal est résumée avec implémentation (valeurs initiales de Xavier, He et al., Etc.)
Comprendre le nombre de paramètres d'entrée / sortie du réseau neuronal convolutif
Implémentation d'un réseau de neurones à deux couches 2
Visualisez la couche interne du réseau neuronal
Avec une légère baisse de précision, les paramètres de poids ont été incroyablement réduits ~ Résultats surprenants de CNN ~