確定性誤差對消
問題
將權重 W 量化為 INT4 時,每個值都會產生捨入誤差 ε。在循環 transformer 中,相同的量化權重被應用 L 次。相同的捨入誤差 ε 被應用 L 次。總誤差與 L 線性增長:
total_error ∝ L × ε
在 L=8 時尚可管理。在 L=32 或 L=64 時,它會破壞輸出品質。
解決方案
在迭代間交替捨入方向。 偶數迭代使用標準四捨五入。奇數迭代套用符號校正,反轉捨入方向。
每對迭代互相抵消:(+ε) + (−ε) = 0。無論 L 多大,總誤差都是 O(1)。
運作方式
sign_bit 通道
量化器記錄每個權重值的捨入方向:
q_int = round(w_float / scale + zero)
sign = +1 若 q_int 被向下捨入
sign = -1 若 q_int 被向上捨入
這個每權重 1 位元的通道以 sign_bit 儲存在 v5 .tinyloop 格式中,增加 12.5% 的儲存開銷。
逐迭代分派
誤差尺度比較
| 方法 | L=8 | L=32 | L=64 | 增長 |
|---|---|---|---|---|
| 標準 INT4 | 8ε | 32ε | 64ε | O(L) |
| 隨機捨入 | 2.8ε | 5.7ε | 8ε | O(√L) |
| 確定性對消 | 0 | 0 | 0 | O(1) |
使用方式
# 啟用對消(需要含 sign_bit 的 v5 模型)
TINYLOOP_CANCEL_ROUND=1 tinyloop model_v5.tinyloop generate --loops 32
import os
os.environ["TINYLOOP_CANCEL_ROUND"] = "1"
model = tl.Model("model_v5.tinyloop")
tokens = model.generate(prompt, loops=32)
為何僅限 Looped 架構
標準 transformer 每個權重只使用一次 — 無法在第二次應用時對消第一次的誤差。此技術在非權重共享架構上不可能實現。
與其他方法的關係
| 方法 | 額外儲存 | 誤差 | 需訓練? | 需權重共享? |
|---|---|---|---|---|
| AdaRound | 0% | 逐層最佳 | 需校準 | 否 |
| GPTQ | 0% | 逐層最佳 | 需校準 | 否 |
| 隨機捨入 | 12.5% | O(√L) | 否 | 是 |
| 確定性對消 | 12.5% | O(1) | 否 | 是 |
注意:GPTQ 和對消不相容 — GPTQ 假設每個權重只使用一次來最佳化捨入決策。