Jak modele naprawdę się uczą — od zwykłego spadku gradientu po Adama
Trening w mieszanej precyzji wykorzystuje mniejsze formaty liczb dla szybkości i pamięci. Zamiast przechowywać każde obliczenie w pełnej precyzji (standardowe 32-bitowe liczby zmiennoprzecinkowe), wiele operacji używa formatu float16 albo bfloat16: formatów 16-bitowych, które zajmują połowę pamięci w zamian za mniejszą precyzję i, w przypadku float16, węższy zakres reprezentowalnych rozmiarów.
Ryzykiem jest zakres liczbowy. Niektóre gradienty są maleńkie. Jeśli maleńka liczba zostanie zaokrąglona do zera, optymalizator traci informację. Skalowanie straty chroni te małe gradienty, mnożąc stratę przed propagacją wsteczną, a potem dzieląc gradienty z powrotem w dół.
Waga kuchenna, która zaokrągla do pełnych gramów, może przeoczyć maleńką szczyptę przyprawy. Jeśli zważysz razem dziesięć identycznych szczypt, waga widzi sumę. Potem dzielisz przez dziesięć, by odzyskać jedną szczyptę. Skalowanie straty wykorzystuje tę samą sztuczkę: uczyń małą wartość łatwiejszą do zapisania, a potem przeskaluj ją z powrotem. Poniższy rysunek to przypomnienie tego, co jest stawką. Zejście działa tylko wtedy, gdy gradient każdego kroku przetrwa arytmetykę; precyzja nie zmienia samej pętli, decyduje jedynie, czy maleńkie nachylenia blisko minimum są dla niej wciąż widoczne.