web-dev-qa-db-fra.com

Dans quel ordre devrions-nous accorder les hyperparamètres dans les réseaux de neurones?

J'ai un ANN assez simple utilisant Tensorflow et AdamOptimizer pour un problème de régression et je suis maintenant sur le point d'accorder tous les hyperparamètres. 

Pour l'instant, j'ai vu beaucoup d'hyperparamètres différents que je dois régler: 

  • Taux d'apprentissage: taux d'apprentissage initial, diminution du taux d'apprentissage
  • AdamOptimizer a besoin de 4 arguments (vitesse d'apprentissage, beta1, beta2, epsilon) et nous devons donc les ajuster - au moins epsilon.
  • taille du lot 
  • nb d'itérations
  • Paramètre de régularisation Lambda L2
  • Nombre de neurones, nombre de couches 
  • quel type de fonction d'activation pour les couches cachées, pour la couche en sortie 
  • paramètre d'abandon

J'ai 2 questions:

1) Voyez-vous un autre hyperparamètre que j'ai peut-être oublié? 

2) Pour le moment, mon réglage est assez "manuel" et je ne suis pas sûr de ne pas tout faire de la bonne manière. Existe-t-il un ordre spécial pour régler les paramètres? E.g taux d’apprentissage en premier, puis taille du lot, puis ...… .__ Je ne suis pas sûr que tous ces paramètres soient indépendants - en fait, je suis tout à fait sûr que certains d’entre eux ne le sont pas. Lesquels sont clairement indépendants et lesquels ne le sont clairement pas? Devrions-nous ensuite les accorder ensemble? Existe-t-il un article ou un article traitant du réglage correct de tous les paramètres dans un ordre spécial? 

EDIT: Voici les graphiques que j’ai obtenus pour différents taux d’apprentissage initial, tailles de lot et paramètres de régularisation. La courbe mauve est complètement étrange pour moi ... Parce que le coût diminue comme les autres lentement, mais il s'est bloqué avec un taux de précision inférieur. Est-il possible que le modèle soit bloqué dans un minimum local? 

Précision

Coût

Pour le taux d’apprentissage, j’ai utilisé la décroissance: LR (t) = LRI/sqrt (Epoch) 

Merci pour votre aide! Paul 

17
Paul Rolin

Mon ordre général est le suivant:

  1. La taille des lots, car cela affectera largement le temps de formation des expériences futures.
  2. Architecture du réseau:
    • Nombre de neurones dans le réseau
    • Nombre de couches
  3. Reste (abandon, rég. L2, etc.)

Dépendances:

Je suppose que les valeurs optimales de 

  • taux d'apprentissage et taille du lot 
  • taux d'apprentissage et nombre de neurones 
  • nombre de neurones et nombre de couches

dépendent fortement les uns des autres. Je ne suis cependant pas un expert dans ce domaine.

Quant à vos hyperparamètres:

  • Pour l'optimiseur Adam: "Les valeurs recommandées dans le document sont eps = 1e-8, beta1 = 0,9, beta2 = 0,999." ( la source )
  • Pour le taux d’apprentissage avec Adam et RMSProp, j’ai trouvé que les valeurs autour de 0,001 étaient optimales pour la plupart des problèmes. 
  • En guise d'alternative à Adam, vous pouvez également utiliser RMSProp, qui réduit l'encombrement de la mémoire jusqu'à 33%. Voir cette réponse pour plus de détails.
  • Vous pouvez également régler les valeurs de poids initiales (voir Tout ce dont vous avez besoin est un bon init ). Bien que, l’initialiseur Xavier semble être un bon moyen d’empêcher l’affinement du poids.
  • Je n'accorde pas le nombre d'itérations/d'époques comme un hyperparamètre. J'entraîne le net jusqu'à ce que son erreur de validation converge. Cependant, je donne à chaque course un budget temps.
6
Kilian Batzner

Faites fonctionner Tensorboard. Tracez l'erreur ici. Vous devez créer des sous-répertoires dans le chemin où TB recherche les données à tracer. Je fais cette création sous-répertoire dans le script. Je modifie donc un paramètre dans le script, lui attribue un nom, l'exécute et trace tous les essais du même graphique. Vous aurez très vite une idée des paramètres les plus efficaces pour votre graphique et vos données.

3
Phillip Bock

Pour les paramètres moins importants, vous pouvez probablement choisir une valeur raisonnable et vous y tenir. 

Comme vous l'avez dit, les valeurs optimales de ces paramètres dépendent toutes les unes des autres. Le plus simple est de définir une plage de valeurs raisonnable pour chaque hyperparamètre. Ensuite, échantillonnez de manière aléatoire un paramètre de chaque plage et entraînez un modèle avec ce paramètre. Répétez cette opération un tas de fois, puis choisissez le meilleur modèle. Si vous avez de la chance, vous pourrez analyser quels paramètres d’hyperparamètre fonctionnent le mieux et en tirer des conclusions.

2
Aaron

Je ne connais aucun outil spécifique pour tensorflow, mais la meilleure stratégie consiste à commencer par les hyperparamètres de base tels que le taux d'apprentissage de 0,01, 0,001, weight_decay de 0,005, 0,0005. Et puis accordez-les. Faire cela manuellement prendra beaucoup de temps, si vous utilisez caffe, voici la meilleure option pour extraire les hyperparamètres d’un ensemble de valeurs d’entrée et vous donner le meilleur.

https://github.com/kuz/caffe-with-spearmint

pour plus d'informations, vous pouvez également suivre ce tutoriel:

http://fastml.com/optimizing-hyperparams-with-hyperopt/

Pour le nombre de couches, je vous suggère tout d’abord de créer un réseau plus petit et d’augmenter les données, puis, une fois que vous avez suffisamment de données, d’accroître la complexité du modèle.

0
Dharma