Altifigence Academy

6 / 24 · 概念

尺度與零點

sx=0.25、zx=128 時,填補編碼與 q=132 的實數值各是多少?sw=0.5 時,哪個偏置編碼代表 0.75?

實數零的編碼

仿射量化使用正尺度 s 與整數零點 z。我們的整數契約將 x/s 捨入至最近整數,完全同距時選擇偶數,加上 z,再飽和至儲存範圍。反量化將編碼解讀為約 s(q−z)。將實數映射至整數格點,通常會遺失資訊。

q=clip⁡(roundEven⁡(x/s)+z,qmin,qmax)q=\operatorname{clip}(\operatorname{roundEven}(x/s)+z,q_{min},q_{max})

對 s=0.25、z=128 的 uint8 輸入,實數零的編碼是 128。編碼 130 與 126 分別代表 0.5 與 −0.5。原始填補編碼零則會代表 −32。儲存原始編碼的緩衝器,必須以 z 填補。儲存已中心化編碼的緩衝器,則填入整數零。應在資料路徑中標記此轉換位置。

內積計算範例

將輸入編碼 [130,126] 減去 128,中心化為 [2,−2]。權重 [3,−2] 的尺度為 0.5、零點為零。累加 2×3+(−2)×(−2)=10。累加器的實數尺度為 0.25×0.5=0.125,因此實數結果為 1.25。使用輸出尺度 0.25 與零點 128,得到編碼 133。非零的權重零點,也必須在相乘前減去。

逐張量量化共用一個尺度。逐通道權重量化則需要每個通道專屬的偏置與輸出轉換。若兩個輸出通道的權重尺度為 0.5 與 0.25,累加器編碼十便分別代表 1.25 與 0.625。軟體的彈性,並不表示硬體支援其中任何一種安排。

將 0.625 以尺度 0.25 量化,會得到同距的 2.5,捨入至二後得到編碼 130。反量化得到 0.5,誤差為 −0.125。輸入 0.375 也映射至相同編碼。量化格點誤差不同於飽和誤差:裁切超出範圍的輸入,可能超過半個尺度步距。請將整數規則與 ONNX QuantizeLinear 比較。我們的練習刻意只實作小型 int8/uint8 子集。

自己試試看

sx=0.25、zx=128 時,填補編碼與 q=132 的實數值各是多少?sw=0.5 時,哪個偏置編碼代表 0.75?

查看解說

原始填補是編碼 128,q=132 代表一。累加器尺度為 0.125,因此偏置編碼為 0.75/0.125=6。

此選擇適用於本瀏覽器,隨時可從頁尾變更。