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-8
et batch_size = 32
.
neural-networks
deep-learning
adam
Abdul Fatir
la source
la source
Réponses:
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'utilisationbatch_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:
la source
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.
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.drop_last
. Petite taille de lot = variance élevéeMaintenant, 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).
la source