
X: 실테 데이터
q: quantization된 목표 데이터
X의 전체 범위를 q의 칸수로 나눈다. (예를 들어, X의 최대가 80, 최소가 -120이고, q가 uint4라면, X_max=80, X_min=-120, q_max=15, q_min=0이다. 아래 수식에 따라, S= 200/15로 13.333... 이다. 이는 q에서의 1칸은 X에서의 13.333...을 의미한다는것이다.)
이제 X_min이 q_min이 되도록, X_max가 q_max가 되도록 영점 조절을 해야된다.
q = round(X/S+Z) 수식이다. 이때, round함수는 q는 결국 정수값이 들어가야 하기 때문에 필요하다.
여기에 값을 대입해보면, 0 = (-120/13.33333 + Z), Z=9이다.
이는 X를 S로 나눈 후에, Z만큼 더하면 최소가 0, 최대가 15인 데이터로 변환된다는것을 의미한다.
해당 수식을 통해 quantization을 하는 것이 Affine Quantization이다. 하지만, round함수로 인해 de-quantization의 경우, 오차가 발생하게 된다.
X=-50의 q는 round(-3.75+9) = round(5.25) = 5이다. 이 값을 원래 X로 복원해보자.
X = S(q-Z) = 200/15 (5-9) = -53.333333로, 3.33333 오차가 발생한다. 이러한 오차들을 Quantization Error/Noise라고 한다. 이게 모여서 모델 성능을 낮추게 된다. (왜냐면 현재 quantization은 가중치만 int4고, 실제 추론할때에는 fp16으로 변환해서 추론하기 때문!)
오차를 줄이려면 결국, S와 N을 잘 선정해야하는데 이를 위해서 NF4와 같은 기술이 나왔다.