Explication des pics de perte d'entraînement par rapport aux itérations avec Adam Optimizer

16

J'entraîne un réseau de neurones en utilisant i) SGD et ii) Adam Optimizer. Lorsque j'utilise un SGD normal, j'obtiens une courbe de perte d'entraînement en fonction de l'itération comme indiqué ci-dessous (la rouge). Cependant, lorsque j'ai utilisé Adam Optimizer, la courbe de perte d'entraînement présente des pointes. Quelle est l'explication de ces pics?

Détails du modèle:

14 nœuds d'entrée -> 2 couches cachées (100 -> 40 unités) -> 4 unités de sortie

J'utilise les paramètres par défaut pour Adam beta_1 = 0.9, beta_2 = 0.999, epsilon = 1e-8et batch_size = 32.

i) Avec SGD ii) Avec AdamAvec SGD Avec Adam

Abdul Fatir
la source
Pour un avis futur, la réduction de votre taux d'apprentissage initial peut aider à éliminer les pics d'Adam
bold

Réponses:

12

Les pointes sont une conséquence inévitable de la descente de gradient en mini-lot à Adam ( batch_size=32). Certains mini-lots contiennent des données malchanceuses `` par hasard '' pour l'optimisation, ce qui induit les pics que vous voyez dans votre fonction de coût en utilisant Adam. Si vous essayez une descente de gradient stochastique (identique à l'utilisation batch_size=1), vous verrez qu'il y a encore plus de pics dans la fonction de coût. La même chose ne se produit pas dans (Full) Batch GD car il utilise toutes les données d'apprentissage (c'est-à-dire que la taille du lot est égale à la cardinalité de votre ensemble d'entraînement) à chaque époque d'optimisation. Comme dans votre premier graphique, le coût diminue régulièrement de manière monotone, il semble que le titre ( i) avec SGD ) soit incorrect et que vous utilisez la descente de gradient de lot (complet) au lieu de SGD.

Lors de son excellent cours de Deep Learning à Coursera , Andrew Ng explique en détail cela en utilisant l'image ci-dessous:

Fonctions de coût

xboard
la source
2
«SGD ... utilise toutes les données de formation», en êtes-vous sûr? Cela signifie que les pondérations sont mises à jour après que toutes les données ont été transmises, mais cela s'appelle gd complet, pas sgd. Stochastique implique un mini
Alex
Merci @Alex d'avoir signalé mon erreur, je l'ai déjà corrigée et amélioré la réponse en référence pour plus d'informations.
xboard
@xboard - Non, j'utilise une descente en gradient en mini-batch pour la première.
Abdul Fatir
7

J'ai passé un temps fou à déboguer des gradients explosifs et des comportements similaires. Votre réponse dépendra de la fonction de perte, des données, de l'architecture, etc. Il y a des centaines de raisons. J'en nommerai quelques-uns.

  • Dépendant de la perte. Les pertes de vraisemblance logiques doivent être écrêtées, sinon, elles peuvent être évaluées à la log(0)recherche de mauvaises prédictions / valeurs aberrantes dans l'ensemble de données, provoquant une explosion des gradients. La plupart des packages (torche, tensorflow, etc.) implémentent l'écrêtage par défaut pour leurs pertes.
  • Valeurs aberrantes dans l'ensemble de données.
  • BatchNorm avec petite taille de lot et grand epsilon (hyperparamètre). Avec batchnorm comme , puis avec des petits et vous pouvez obtenir des magnitudes élevées deϵy=(xu)/(s+ϵ)sϵy
  • Le lot final d'une époque peut être petit si l'ensemble de données n'est pas divisible par la taille du lot. Dans le chargeur de torche, il y a un drapeau drop_last. Petite taille de lot = variance élevée

Maintenant, pourquoi voyez-vous cela avec Adam et non avec SGD? De toute évidence, vous avez atteint une perte plus faible avec Adam. Comme indiqué précédemment, si 99,9% de l'ensemble de données a des optima à un moment donné, sauf une observation, cela peut être cette observation criant «NON» et sautant des minima locaux lorsqu'elle est sélectionnée au hasard dans un lot. Si vous le voyez à chaque dataset_size//batch_size+1étape, c'est probablement parce que la taille finale du lot est petite. Je parie que vous verrez également un pic de SGD si vous le laissez atteindre une perte plus faible.

Bonus: Votre diminution très rapide avec l'optimiseur de momentum (Adam) pourrait signifier qu'une couche (couche d'entrée? Couche de sortie?) Est initialisée de manière hors échelle (à des poids grands / petits).

ragulpr
la source