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
∂L∂wj= 1k∑ki = 1∂Lje∂wj
Le code du didacticiel auquel vous avez lié dans les commentaires utilise Tensorflow pour minimiser la perte moyenne.
1k∑ki = 1Lje
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:
∂L∂wj= ∂∂wj1k∑ki = 1Lje
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.
∂∂wj1k∑ki = 1Lje= 1k∑ki = 1∂Lje∂wj
code line 170
?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.
la source