Gradient Accumulation
Gradient Accumulation polega na dodawaniu gradientów z kilku kolejnych małych porcji danych przed jednym krokiem optymalizatora. Parametry pozostają przez ten czas niezmienione. Dzięki temu aktywacje dla całej efektywnej porcji nie muszą jednocześnie mieścić się w pamięci.

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.
Wykorzystuję treści generowane przez AI jako część mojego codziennego procesu nauki.