Jest to uproszczenie modelu poprzez zaokrąglenia do mniej dokładnych wartości niż rzeczywiste. A przez to przechowywanie ich za pomocą mniejszych komórek pamięci (na przykład z Float32 do Float 16). Dzięki temu możliwe jest z uruchomienie modelu na słabszym sprzęcie.
A po co to komu?
Większość dzisiejszych modeli językowych wymaga naprawdę mocnego sprzętu – pokroju 64 GB RAM lub więcej i do tego mocnych procesorów graficznych (zobacz tutaj). A umówmy się, większość komputerów nie posiada takich specyfikacji. Stąd zaczęto kwantyzować modele.
Przykład kwantyzacji 2-bitowej
Załóżmy, że mamy pięć wag:
0.1, -0.4, 0.7, -0.2, 0.3
Pierwszą rzeczą którą musimy zrobić jest normalizacja – czyli przedstawienie tych wszystkich wag w zakresie od 0 do 1. Służy do tego formuła:
\text{znormalizowana wartość} = \frac{\text{waga} - \text{najmniejsza waga}}{\text{największa waga} - \text{najmniejsza waga}}
no to lecimy:
0.1 => (0.1 - (-0.4)) / (0.7 - (-0.4)) = 0.5
-0.4 => (-0.4 - (-0.4)) / (0.7 - (-0.4)) = 0
0.7 => (0.7 - (-0.4)) / (0.7 - (-0.4)) = 1
-0.2 => (-0.2 - (-0.4)) / (0.7 - (-0.4)) = 0.2
0.3 => (0.3 - (-0.4)) / (0.7 - (-0.4)) = 0.636
Następnym krokiem będzie wyznaczenie możliwych wartości wag. Z racji tego, że za pomocą 2 bitów można zapisać 4 wartości, to dzielimy sobie nasz przedział od 0 do 1 na cztery:
0
1/3 (około 0.333)
2/3 (około 0.666)
1
Ostatnią rzeczą do zrobienia będzie zaokrąglenie do najbliższego poziomu:
0.5 => 2/3 (najbliższy poziom to 0.666)
0 => 0
1 => 1
0.2 => 1/3 (najbliższy poziom to 0.333)
0.636 => 2/3 (najbliższy poziom to 0.666)