Loss Scaling
Loss Scaling polega na pomnożeniu straty przez współczynnik przed backward, a następnie podzieleniu gradientów parametrów przez przed aktualizacją. Dla stałego reguła łańcuchowa daje:
oznacza stratę, a parametry modelu. W arytmetyce dokładnej skalowanie i odskalowanie znoszą się. W ograniczonym formacie pośrednie, większe gradienty mogą przetrwać zapis, w którym ich pierwotne wartości zniknęłyby do zera. Ten mechanizm opisują Micikevicius et al., §3.2.

Okno zamiast dowolnie dużej skali
Własny przykład: zaokrągla się w FP16 do zera. Po pomnożeniu przez 4 otrzymujemy , najmniejszą dodatnią wartość subnormalną FP16. Zapisujemy ją i dzielimy przez 4 w większej precyzji, odzyskując gradient. Pomnożenie gradientu, który już został zerem, niczego nie naprawi.
Jedna skala obejmuje jednak gradienty o różnych wielkościach. W demonstracji drugi wynosi 8. Skala daje dla niego 65536, czyli przepełnienie FP16. Zwiększając suwak, znajdź zakres, w którym oba gradienty przetrwają.
W Mixed Precision Training loss scaling chroni zakres gradientów; autocast dobiera formaty operacji. To osobne mechanizmy. Dokumentacja AMP, Gradient Scaling ostrzega, że FP16 nie pasuje do każdego modelu i skala może nawet spaść poniżej 1.
PyTorch GradScaler pomija krok optymalizatora, gdy wykryje nieskończone gradienty lub NaN. Przed gradient clipping trzeba odskalować gradienty, aby próg zachował znaczenie. Przy Gradient Accumulation skala pozostaje stała do zebrania całej efektywnej porcji; dopiero potem następuje odskalowanie i aktualizacja. Te granice pokazują przykłady AMP: unscaled gradients i accumulation.
Skalowanie nie zmienia celu Cross-entropy ani zamierzonego learning rate. Nie zastępuje też poprawnego uśrednienia straty po przykładach lub tokenach.
Wykorzystuję treści generowane przez AI jako część mojego codziennego procesu nauki.