Comment la descente en gradient du mini-lot met-elle à jour les poids de chaque exemple dans un lot?


12

Si nous traitons par exemple 10 exemples dans un lot, je comprends que nous pouvons additionner la perte pour chaque exemple, mais comment fonctionne la rétropropagation en ce qui concerne la mise à jour des poids pour chaque exemple?

Par exemple:

  • Exemple 1 -> perte = 2
  • Exemple 2 -> perte = -2

Il en résulte une perte moyenne de 0 (E = 0), alors comment cela mettrait-il à jour chaque poids et convergerait-il? Est-ce simplement par la randomisation des lots que nous "espérons" converger tôt ou tard? De plus, cela ne calcule-t-il pas seulement le gradient pour le premier ensemble de poids pour le dernier exemple traité?

Réponses:


15

La descente en pente ne fonctionne pas tout à fait comme vous l'avez suggéré, mais un problème similaire peut se produire.

Nous ne calculons pas la perte moyenne du lot, nous calculons les gradients moyens de la fonction de perte. Les gradients sont la dérivée de la perte par rapport au poids et dans un réseau neuronal, le gradient pour un poids dépend des entrées de cet exemple spécifique et il dépend également de nombreux autres poids dans le modèle.

Si votre modèle a 5 poids et que vous avez une taille de mini-lot de 2, vous pouvez obtenir ceci:

Exemple 1. Perte = 2, gradients=(1.5,2.0,1.1,0.4,0.9)

Exemple 2. Perte = 3, gradients=(1.2,2.3,1.1,0.8,0.7)

La moyenne des gradients de ce mini-lot est calculée, ils sont (1.35,0.15,0,0.2,0.8)

L'avantage de la moyenne sur plusieurs exemples est que la variation du gradient est plus faible, de sorte que l'apprentissage est plus cohérent et moins dépendant des spécificités d'un exemple. Remarquez comment le gradient moyen pour le troisième poids est , ce poids ne changera pas cette mise à jour de poids, mais il sera probablement non nul pour les prochains exemples choisis qui sont calculés avec des poids différents.0

modifier en réponse aux commentaires:

Dans mon exemple ci-dessus, la moyenne des gradients est calculée. Pour une taille de mini-lot de où nous calculons la perte L i pour chaque exemple we et visons à obtenir le gradient moyen de la perte par rapport à un poids w j .kLjewj

Lwj=1kje=1kLjewj

Le code du didacticiel auquel vous avez lié dans les commentaires utilise Tensorflow pour minimiser la perte moyenne.

1kje=1kLje

Pour minimiser cela, il calcule les gradients de la perte moyenne par rapport à chaque poids et utilise la descente de gradient pour mettre à jour les poids:

Lwj=wj1kje=1kLje

La différenciation peut être apportée à l'intérieur de la somme, c'est donc la même chose que l'expression de l'approche dans mon exemple.

wj1kje=1kLje=1kje=1kLjewj


Je t'ai eu. Vous voudriez toujours faire la moyenne de la perte sur la taille de lot correcte? Je ne sais pas si vous êtes familier avec tensorflow mais j'ai essayé de concilier ma compréhension avec ce tutoriel: tensorflow.org/get_started/mnist/beginners Vous pouvez voir que la perte est calculée en moyenne sur le lot (code de réduire_mean). Je suppose que tensorflow conserve un compte / des moyennes internes des poids?
calculé

1
@carboncomputed Oh oui vous avez raison, ils font la moyenne de la perte de sorte que lorsque Tensorflow calcule les gradients de la perte moyenne, il calcule effectivement la moyenne des gradients pour chaque perte. Je vais modifier ma réponse pour montrer les mathématiques pour cela.
Hugh

Intéressant. Merci pour la clarification. Donc, juste pour creuser un peu plus, les gradients de poids sont-ils calculés par exemple pendant la passe avant et stockés ou sont-ils calculés pendant le processus d'optimisation dans tensorflow? Je suppose que je manque juste "où" sont ces gradients dans tensorflow? Je vois la passe avant et la perte, donc tensorflow fait ces calculs / moyennes de gradient sous le capot pour moi?
Calculé

1
@carboncomputed C'est l'attrait de Tensorflow, il utilise des mathématiques symboliques et peut faire la différenciation sous le capot
Hugh

Merci pour une réponse soignée. Cependant, je ne comprenais pas comment TF sait comment sauvegarder Propager avec une perte moyenne comme le montre cet exemple , code line 170?
pécheur

-1

La raison d'utiliser des mini-lots est d'avoir une bonne quantité d'exemples de formation de telle sorte que le bruit possible de celui-ci soit réduit en faisant la moyenne de leurs effets, mais ce n'est pas non plus un lot complet qui, pour de nombreux jeux de données, pourrait nécessiter une énorme quantité de mémoire. Un fait important est que l'erreur que vous évaluez est toujours une distanceentre votre sortie prévue et la sortie réelle: cela signifie qu'elle ne peut pas être négative, donc vous ne pouvez pas avoir, comme vous l'avez dit, une erreur de 2 et -2 qui s'annule, mais ce serait plutôt une erreur de 4 Vous évaluez ensuite le gradient de l'erreur par rapport à tous les poids, afin de pouvoir calculer quel changement de poids le réduirait le plus. Une fois que vous le faites, vous faites un "pas" dans cette direction, en fonction de l'amplitude de votre taux d'apprentissage alpha. (Ce sont les concepts de base, je ne vais pas entrer dans les détails de la rétropropagation pour NN profond) Après avoir exécuté cette formation sur votre jeu de données pendant un certain nombre d'époques, vous pouvez vous attendre à ce que votre réseau converge si votre étape d'apprentissage n'est pas trop importante pour le faire diverger. Vous pourriez toujours vous retrouver dans un minimum local, cela peut être évité en initialisant différemment vos poids, en utilisant différents optimiseurs et en essayant de régulariser.


Juste pour ajouter: nous utilisons des mini-lots principalement pour une efficacité de calcul. Nous avons un compromis entre la précision de la descente et la fréquence de mise à jour des poids. Les données doivent être extrêmement volumineuses pour ne pas tenir en mémoire.
Łukasz Grad

Je comprends chacun, mais comment pouvons-nous mettre à jour nos poids pour un lot spécifique? Les gradients de poids sont-ils également additionnés pour chaque exemple?
Calculé

Non, il n'y a qu'un seul gradient, qui est un vecteur de dérivés, sur l'erreur de lot totale. Cela signifie que nous mettons à jour une fois nos poids basés sur le gradient, c'est-à-dire le sens de la mise à jour qui fait que l'erreur sur ce mini batch diminue le plus. Le gradient est constitué de dérivées partielles, c'est-à-dire la dérivée pf de l'erreur de mini-lot par rapport à chaque poids: cela nous indique si chaque poids doit devenir plus petit ou plus grand, et combien. Tous les poids obtiennent une mise à jour pour le lot, afin de réduire l'erreur sur ce mini-lot, qui est indépendante des autres mini-lots.
dante
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.