COMMENT FAIRE: Initialisation du poids du réseau neuronal profond

10

Étant donné la tâche d'apprentissage difficile (par exemple, grande dimensionnalité, complexité inhérente des données), les réseaux neuronaux profonds deviennent difficiles à former. Pour atténuer de nombreux problèmes, on pourrait:

  1. Normaliser les données de qualité &&
  2. choisir un algorithme d'entraînement différent (par exemple RMSprop au lieu de Gradient Descent)
  3. choisissez une fonction de coût de gradient plus raide (par exemple Entropie croisée au lieu de MSE)
  4. Utiliser une structure de réseau différente (par exemple, des couches de convolution au lieu de Feedforward)

J'ai entendu dire qu'il existe des moyens astucieux d'initialiser de meilleurs poids. Par exemple, vous pouvez mieux choisir la magnitude: Glorot et Bengio (2010)

  • pour les unités sigmoïdes: échantillonnez un uniforme (-r, r) avecr=6Njen+Nout
  • ou unités tangentes hyperboliques: échantillonner un uniforme (-r, r) avecr=46Njen+Nout

Existe-t-il un moyen cohérent de mieux initialiser les poids?

Joonatan Samuel
la source

Réponses:

7

Pour autant que je sache, les deux formules que vous avez données sont à peu près l'initialisation standard. J'avais fait une revue de la littérature il y a quelque temps, je l'ai copiée ci-dessous si vous êtes intéressé.


[1] répond à la question:

Tout d'abord, les pondérations ne doivent pas être définies sur des zéros afin de briser la symétrie lors de la rétrogradation:

Les biais peuvent généralement être initialisés à zéro, mais les pondérations doivent être initialisées avec soin pour briser la symétrie entre les unités cachées de la même couche. Étant donné que différentes unités de sortie reçoivent différents signaux de gradient, ce problème de rupture de symétrie ne concerne pas les poids de sortie (dans les unités de sortie), qui peuvent donc également être mis à zéro.

Quelques stratégies d'initialisation:

  • [2] et [3] recommandent une mise à l'échelle par l'inverse de la racine carrée du fan-in
  • Glorot et Bengio (2010) et les didacticiels d'apprentissage en profondeur utilisent une combinaison de fan-in et fan-out:
    • pour les unités sigmoïdes: échantillonnez un uniforme (-r, r) avec (fan-in est le nombre de entrées de l’unité).r=6fan-in+fan-out
    • pour les unités tangentes hyperboliques: échantillonnez un uniforme (-r, r) avec (fan-in est le nombre d'entrées de l'unité).r=46fan-in+fan-out
  • dans le cas des RBM, une gaussienne à moyenne nulle avec un petit écart-type autour de 0,1 ou 0,01 fonctionne bien (Hinton, 2010) pour initialiser les poids.
  • Initialisation matricielle aléatoire orthogonale, c'est-à-dire W = np.random.randn(ndim, ndim); u, s, v = np.linalg.svd(W)ensuite utiliser ucomme matrice d'initialisation.

De plus, une formation préalable non supervisée peut aider dans certaines situations:

Un choix important est de savoir si l'on doit utiliser une pré-formation non supervisée (et quel algorithme d'apprentissage des fonctionnalités non supervisé utiliser) afin d'initialiser les paramètres. Dans la plupart des contextes, nous avons trouvé une pré-formation non supervisée pour aider et très rarement pour blesser, mais cela implique bien sûr un temps de formation supplémentaire et des hyper-paramètres supplémentaires.

Certaines bibliothèques ANN ont également des listes intéressantes, par exemple Lasagne :

Constant([val]) Initialize weights with constant value.
Normal([std, mean]) Sample initial weights from the Gaussian distribution.
Uniform([range, std, mean]) Sample initial weights from the uniform distribution.
Glorot(initializer[, gain, c01b])   Glorot weight initialization.
GlorotNormal([gain, c01b])  Glorot with weights sampled from the Normal distribution.
GlorotUniform([gain, c01b]) Glorot with weights sampled from the Uniform distribution.
He(initializer[, gain, c01b])   He weight initialization.
HeNormal([gain, c01b])  He initializer with weights sampled from the Normal distribution.
HeUniform([gain, c01b]) He initializer with weights sampled from the Uniform distribution.
Orthogonal([gain])  Intialize weights as Orthogonal matrix.
Sparse([sparsity, std]) Initialize weights as sparse matrix.

[1] Bengio, Yoshua. « Recommandations pratiques pour la formation par gradient des architectures profondes. » 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 Neural Networks, Tricks of the Trade .

[3] Glorot, Xavier et Yoshua Bengio. " Comprendre la difficulté de former des réseaux neuronaux à action profonde ." Conférence internationale sur l'intelligence artificielle et les statistiques. 2010.

Franck Dernoncourt
la source
2
Quelque chose que vous semblez manquer est la normalisation par lots. Décrit ici: arxiv.org/abs/1502.03167 Peut être utile.
Joonatan Samuel
Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun ont publié un article plus récent qui comprend une variation de l'initialisation du poids de Xavier de Glorot et Bengio: "Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification" .
mjul