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 vào đoạn số nguyên , với và . Mọi ánh xạ tuyến tính (chính xác hơn là affine) một biến có dạng . Thế hai điều kiện đầu mút vào:
Trừ vế theo vế rồi giải ra , sau đó thế lại để tìm :
được làm tròn để là số nguyên (lý do ở Mục 3.4). Thêm phép làm tròn cho 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:
Hàm hợp 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 sang uint8, tức :
- .
- .
- Lấy : .
- Khôi phục: . Sai số , nhỏ hơn .
- Lấy : , và 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 (), để các bậc thang đủ lớn.

Hình 4 còn cho thấy một chi tiết hay bị bỏ qua. Vì bị làm tròn, dải thực sự biểu diễn được là , lệch nhẹ so với dải 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ị , 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 là số nguyên bảo đảm . Cũng vì lý do này, dải luôn được mở rộng để chứa số 0: .
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, tùy ý.
Đối xứng (symmetric): ép và dùng dải đối xứng quanh 0, với . Thường dùng miền số nguyên hạn chế , ví dụ cho int8, bỏ giá trị để lưới đối xứng hoàn hảo:
| Bất đối xứng | Đối xứng | |
|---|---|---|
| Tham số | và | chỉ () |
| 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 | rẻ hơn (xem Mục 6.2) |

Đ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à so với ở 4 bit (gấp 4,6 lần), và so với ở 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#
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ị nằm ngoài dải nên bị cắt về . Đó 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.
1Công thức đúng của bước nhảy là gì?
Vì sao: là bước nhảy giữa hai mức liền kề tính bằng đơn vị số thực, nên nó phải là (độ rộng dải thực) chia cho (số khoảng trong miền số nguyên).2Vì sao bắt buộc phải là một số nguyên?
Vì sao: Số 0 xuất hiện dày đặc: zero-padding, đầu ra ReLU, phần tử bị mask trong attention. Nếu 0 lệch thành thì sai số có hệ thống và cộng dồn qua hàng nghìn phần tử. Ép nguyên bảo đảm .3Quy ước phổ biến trong TFLite và PyTorch là gì?
Vì sao: Trọng số phân bố quanh 0 nên đối xứng là hợp (và rẻ hơn khi tính, Mục 6.2). Activation sau ReLU lệch hẳn một phía nên bất đối xứng mới không phí mức.4Dùng lưới đối xứng cho activation sau ReLU ở 3 bit thì lãng phí bao nhiêu mức?
Vì sao: Hình 5 vẽ đúng hiện tượng này. Đo trên 200 000 giá trị sau ReLU, MSE của đối xứng so với bất đối xứng là so với ở 4 bit — gấp 4,6 lần.
Đã trả lời 0/4