跳至主要内容

確定性誤差對消

問題

將權重 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=8L=32L=64增長
標準 INT432ε64εO(L)
隨機捨入2.8ε5.7εO(√L)
確定性對消000O(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 每個權重只使用一次 — 無法在第二次應用時對消第一次的誤差。此技術在非權重共享架構上不可能實現。

與其他方法的關係

方法額外儲存誤差需訓練?需權重共享?
AdaRound0%逐層最佳需校準
GPTQ0%逐層最佳需校準
隨機捨入12.5%O(√L)
確定性對消12.5%O(1)

注意:GPTQ 和對消不相容 — GPTQ 假設每個權重只使用一次來最佳化捨入決策。