Spadek gradientu nie działa tak, jak sugerowałeś, ale może wystąpić podobny problem.
Nie obliczamy średniej straty z partii, obliczamy średnie gradienty funkcji straty. Gradienty są pochodną straty w stosunku do masy, aw sieci neuronowej gradient dla jednej masy zależy od danych wejściowych z tego konkretnego przykładu i zależy również od wielu innych wag w modelu.
Jeśli twój model ma 5 ciężarków, a rozmiar mini-partii wynosi 2, możesz otrzymać:
Przykład 1. Strata = 2,gradients=(1.5,−2.0,1.1,0.4,−0.9)
Przykład 2. Strata = 3,gradients=(1.2,2.3,−1.1,−0.8,−0.7)
Obliczane są średnie gradientów w tej mini-partii, wynoszą one(1.35,0.15,0,−0.2,−0.8)
Zaletą uśrednienia dla kilku przykładów jest to, że zmienność gradientu jest mniejsza, więc uczenie się jest bardziej spójne i mniej zależne od specyfiki jednego przykładu. Zauważ, że średni gradient dla trzeciej wagi wynosi , ta waga nie zmieni tej aktualizacji wagi, ale prawdopodobnie będzie różna od zera dla kolejnych wybranych przykładów, które zostaną obliczone z różnymi wagami.0
edytuj w odpowiedzi na komentarze:
W moim przykładzie powyżej obliczana jest średnia gradientów. Dla wielkości mini partii której obliczamy stratę dla każdego przykładu, dążymy do uzyskania średniego gradientu straty w stosunku do wagi .L i w jkLiwj
Sposób, w jaki napisałem to w moim przykładzie, uśredniłem każdy gradient, np .:∂L∂wj=1k∑ki=1∂Li∂wj
Kod samouczka, do którego prowadzisz link w komentarzach, wykorzystuje Tensorflow w celu zminimalizowania średniej straty.
Tensorflow ma na celu zminimalizowanie1k∑ki=1Li
Aby to zminimalizować, oblicza gradienty średniej straty w odniesieniu do każdej masy i wykorzystuje gradient opadający do aktualizacji wag:
∂L∂wj=∂∂wj1k∑ki=1Li
Zróżnicowanie można wprowadzić do sumy, więc jest takie samo jak wyrażenie z podejścia w moim przykładzie.
∂∂wj1k∑ki=1Li=1k∑ki=1∂Li∂wj