Quantizationgiáo trình tự học
Chương 36 phút đọcBiểu diễn số và lượng tử hoá

3Uniform affine quantization: công thức cốt lõi#

3.1Định nghĩa#

Trong xử lý tín hiệu, lượng tử hóa là ánh xạ từ một tập giá trị lớn (thường liên tục) vào một tập hữu hạn nhỏ hơn. Trong deep learning, dạng phổ biến nhất là lượng tử hóa đều (uniform): tập đích gồm các điểm cách đều nhau. Dạng đều được ưa chuộng vì nó cho phép tính toán trực tiếp bằng phép toán số nguyên (Chương 6). Các dạng không đều như NF4 (Mục 11.5) cho sai số nhỏ hơn với cùng số bit, nhưng thường phải giải mã về số thực trước khi tính.

3.2Suy ra công thức#

Ta muốn một ánh xạ tuyến tính từ đoạn số thực [α,β][\alpha, \beta] vào đoạn số nguyên [qmin,qmax][q_{min}, q_{max}], với α↦qmin\alpha \mapsto q_{min} và β↦qmax\beta \mapsto q_{max}. Mọi ánh xạ tuyến tính (chính xác hơn là affine) một biến có dạng q=x/S+Zq = x/S + Z. Thế hai điều kiện đầu mút vào:

qmin=αS+Z,qmax=βS+Z.q_{min} = \frac{\alpha}{S} + Z, \qquad q_{max} = \frac{\beta}{S} + Z.

Trừ vế theo vế rồi giải ra SS, sau đó thế lại để tìm ZZ:

S=β−αqmax−qmin,Z=⌊qmin−αS⌉\boxed{S = \frac{\beta - \alpha}{q_{max} - q_{min}}}, \qquad \boxed{Z = \left\lfloor q_{min} - \frac{\alpha}{S} \right\rceil}

ZZ được làm tròn để là số nguyên (lý do ở Mục 3.4). Thêm phép làm tròn cho qq và phép cắt cho các giá trị nằm ngoài dải, ta được cặp công thức cơ bản:

Quantize:q=clamp(⌊xS⌉+Z,  qmin,  qmax)\textbf{Quantize:}\quad q = \text{clamp}\left(\left\lfloor \frac{x}{S} \right\rceil + Z,\; q_{min},\; q_{max}\right)

Dequantize:x^=S (q−Z)\textbf{Dequantize:}\quad \hat{x} = S\,(q - Z)

Hàm hợp x↦x^x \mapsto \hat{x} gọi là fake quantization (hay quantize–dequantize). Nó cho giá trị vẫn là số thực nhưng chỉ nhận các giá trị trên lưới lượng tử. Hàm này đóng vai trò trung tâm trong mô phỏng và huấn luyện (Chương 7, 9).

3.3Ví dụ tính tay#

Lượng tử hóa dải [α,β]=[−1,3][\alpha, \beta] = [-1, 3] sang uint8, tức [qmin,qmax]=[0,255][q_{min}, q_{max}] = [0, 255]:

  1. S=3−(−1)255−0=4255≈0,015686S = \dfrac{3 - (-1)}{255 - 0} = \dfrac{4}{255} \approx 0{,}015686.
  2. Z=⌊0−−10,015686⌉=⌊63,75⌉=64Z = \left\lfloor 0 - \dfrac{-1}{0{,}015686} \right\rceil = \lfloor 63{,}75 \rceil = 64.
  3. Lấy x=1,5x = 1{,}5: q=⌊1,5/0,015686⌉+64=⌊95,625⌉+64=160q = \lfloor 1{,}5 / 0{,}015686 \rceil + 64 = \lfloor 95{,}625 \rceil + 64 = 160.
  4. Khôi phục: x^=0,015686×(160−64)=1,5059\hat{x} = 0{,}015686 \times (160 - 64) = 1{,}5059. Sai số 0,00590{,}0059, nhỏ hơn S/2≈0,0078S/2 \approx 0{,}0078.
  5. Lấy x=0x = 0: q=64=Zq = 64 = Z, và x^=0\hat{x} = 0 chính xác tuyệt đối.

Để nhìn rõ hình dạng của phép lượng tử hóa, Hình 4 dùng cùng dải nhưng chỉ 3 bit ([0,7][0, 7]), để các bậc thang đủ lớn.

Hình 4
Hình 4. Trên: hàm fake quantization là một hàm bậc thang. Dưới: sai số x^−x\hat{x} - x có dạng răng cưa trong khoảng ±S/2\pm S/2 bên trong dải và tăng tuyến tính bên ngoài dải (vùng clipping).

Hình 4 còn cho thấy một chi tiết hay bị bỏ qua. Vì Z=⌊1,75⌉=2Z = \lfloor 1{,}75 \rceil = 2 bị làm tròn, dải thực sự biểu diễn được là [S(0−2), S(7−2)]=[−1,143; 2,857][S(0 - 2),\, S(7 - 2)] = [-1{,}143;\ 2{,}857], lệch nhẹ so với dải [−1,3][-1, 3] ban đầu. Với 8 bit, độ lệch này nhỏ hơn nhiều nhưng vẫn tồn tại.

3.4Vì sao số 0 phải được biểu diễn chính xác#

Số 0 xuất hiện với tần suất rất cao trong mạng nơ-ron: vùng zero-padding của phép tích chập, đầu ra âm bị ReLU đưa về 0, các phần tử bị mask trong attention. Nếu số 0 bị biểu diễn lệch thành một giá trị δ≠0\delta \neq 0, sai số này không ngẫu nhiên mà có hệ thống và cộng dồn qua hàng nghìn phần tử trong một tổng. Bắt ZZ là số nguyên bảo đảm x=0⇒q=Z⇒x^=0x = 0 \Rightarrow q = Z \Rightarrow \hat{x} = 0. Cũng vì lý do này, dải [α,β][\alpha, \beta] luôn được mở rộng để chứa số 0: α≤0≤β\alpha \le 0 \le \beta.

3.5Lượng tử đối xứng và bất đối xứng#

Bất đối xứng (asymmetric, affine): dùng đúng công thức ở trên, ZZ tùy ý.

Đối xứng (symmetric): ép Z=0Z = 0 và dùng dải đối xứng quanh 0, [−c,c][-c, c] với c=max⁡∣x∣c = \max|x|. Thường dùng miền số nguyên hạn chế [−(2b−1−1), 2b−1−1][-(2^{b-1} - 1),\ 2^{b-1} - 1], ví dụ [−127,127][-127, 127] cho int8, bỏ giá trị −128-128 để lưới đối xứng hoàn hảo:

S=c2b−1−1,q=clamp(⌊xS⌉,  −(2b−1−1),  2b−1−1).S = \frac{c}{2^{b-1} - 1}, \qquad q = \text{clamp}\left(\left\lfloor \frac{x}{S} \right\rceil,\; -(2^{b-1}-1),\; 2^{b-1}-1\right).

Bất đối xứng Đối xứng
Tham số SS và ZZ chỉ SS (Z=0Z = 0)
Phù hợp dữ liệu lệch một phía, ví dụ activation sau ReLU dữ liệu phân bố quanh 0, ví dụ trọng số
Chi phí tính toán phải xử lý thêm các số hạng chứa ZZ rẻ hơn (xem Mục 6.2)
Hình 5
Hình 5. Lượng tử 3 bit cho activation sau ReLU. Lưới đối xứng lãng phí 3/7 mức cho vùng âm không bao giờ xuất hiện.

Đo trên chính dữ liệu của Hình 5 (200 000 giá trị sau ReLU), MSE của lượng tử đối xứng so với bất đối xứng là 2,67×10−22{,}67 \times 10^{-2} so với 5,79×10−35{,}79 \times 10^{-3} ở 4 bit (gấp 4,6 lần), và 8,11×10−58{,}11 \times 10^{-5} so với 2,01×10−52{,}01 \times 10^{-5} ở 8 bit. Quy ước phổ biến trong TFLite và PyTorch vì thế là trọng số đối xứng, activation bất đối xứng.

3.6Cài đặt#

Python
import numpy as np

def affine_params(alpha, beta, qmin, qmax):
    alpha, beta = min(alpha, 0.0), max(beta, 0.0)       # dải luôn chứa 0 (Mục 3.4)
    S = (beta - alpha) / (qmax - qmin)
    Z = int(np.clip(np.round(qmin - alpha / S), qmin, qmax))
    return S, Z

def quantize(x, S, Z, qmin, qmax):
    return np.clip(np.round(x / S) + Z, qmin, qmax).astype(np.int32)

def dequantize(q, S, Z):
    return S * (q.astype(np.float32) - Z)

S, Z = affine_params(-1.0, 3.0, 0, 255)
x = np.array([-1.0, 0.0, 1.5, 3.0, 5.0])
q = quantize(x, S, Z, 0, 255)
print(S, Z, q, dequantize(q, S, Z))
# 0.01568627...  64  [  0  64 160 255 255]  [-1.0039  0.  1.5059  2.9961  2.9961]

Lưu ý giá trị 5,05{,}0 nằm ngoài dải nên bị cắt về 2,99612{,}9961. Đó là sai số cắt (clipping error), chủ đề của chương sau.


Tự kiểm tra

4 câu. Chọn đáp án để xem ngay lời giải thích.

  1. 1Công thức đúng của bước nhảy SS là gì?

  2. 2Vì sao ZZ bắt buộc phải là một số nguyên?

  3. 3Quy ước phổ biến trong TFLite và PyTorch là gì?

  4. 4Dùng lưới đối xứng cho activation sau ReLU ở 3 bit thì lãng phí bao nhiêu mức?

Đã trả lời 0/4