Hasło słownika · · 2 min czytania
Gradient Accumulation
Chcesz wyliczyć jedną poprawkę modelu na dużej grupie przykładów, ale cała grupa nie mieści się w pamięci. Możesz przetworzyć kilka małych porcji i połączyć ich wskazówki przed zmianą wag.
Gradient Accumulation zbiera gradienty, czyli informacje o wpływie wag na błąd, z kilku przebiegów. Wagi pozostają niezmienione do końca zbierania, a optymalizator — algorytm aktualizacji — wykonuje dopiero jeden wspólny krok.
Cztery równe porcje po osiem przykładów dają efektywną grupę 32. Żeby odpowiadać średniej dużej grupy, trzeba właściwie uśrednić wkłady. Przy nierównych porcjach znaczenie ma liczba ocenianych przykładów lub tokenów, czyli kawałków tekstu.
To nie jest to samo co cztery kolejne aktualizacje wag. Nie każda operacja modelu zachowuje się identycznie po podziale grupy, dlatego równoważność z jedną wielką porcją wymaga sprawdzenia założeń.
Mechanizm i szczegóły

Przy równych porcjach po przykładów i przebiegach jeden krok obejmuje przykładów. Z replikami Data Parallelism jest to , jeśli każda dostaje odrębne dane. Dokumentacja PyTorch 2.11, Gradient accumulation pokazuje dodawanie gradientów i aktualizację dopiero po całej porcji.
Średnia musi mieć właściwy mianownik
Jeżeli jest gradientem średniej straty z porcji liczącej przykładów, gradient średniej po wszystkich przykładach wynosi:
Dzielenie każdej straty przez liczbę porcji wystarcza przy równych rozmiarach. Przy nierównych trzeba uwzględnić liczebności. Dla Cross-entropy uśrednianej po tokenach liczą się oceniane tokeny, również z uwzględnieniem Loss masking. To wynika z liniowości sumy i różniczkowania.
Własny przykład poniżej używa czterech celów , jednej wagi i straty . Gradienty to , więc średnia wynosi . Jeden krok SGD z learning rate 0,25 daje , niezależnie od podziału danych. Zobacz, co zepsuje podział 3+1 i zwykła średnia dwóch średnich.
Zgodność z dużym batchem zakłada tę samą funkcję straty i te same parametry podczas wszystkich przebiegów. Operacje zależne od całego batcha, losowość i zaokrąglenia mogą ją naruszyć. Wykonanie kroku optymalizatora po każdej porcji zmienia już sam algorytm.
Przy DDP można odroczyć synchronizację przez no_sync(). Kontekst musi obejmować również forward; pierwszy przebieg poza nim synchronizuje zgromadzone gradienty. Opisuje to dokumentacja DistributedDataParallel.