7 / 24 · 概念
累加器位元寬度、捨入與飽和
九個 signed-int8 乘積且偏置為零時,十八位元有號數是否足夠?
單元可免費閱讀,註冊課程即可儲存學習進度。
累加需要自己的位元寬度
八位元運算元與八位元輸出,不代表累加器也只需八位元。有號八位元編碼的最大絕對值是 128。零點為零且有 L 項時,總和絕對值的保守上界為 L×128×128,再加上偏置的絕對值。選擇正最大值能涵蓋此上界的有號位元寬度;符號位會占用一個位元。
位元寬度計算範例
C=3 且核心為 3×3 時,L=27。兩個運算元皆為 −128 時,每個乘積為 +16384,總和是 442368。十九位元有號數最多只有 262143。二十位元最多為 524287,還可容納偏置絕對值 1000 的額度,上界變成 443368。若已證明運算元範圍更小,可減少所需位元寬度,但少數一般測試輸入無法證明範圍上界。
零點為零的無號編碼可達 255,因此 128 的假設不成立。先計算 A=max(abs(qmin−zx),abs(qmax−zx)),以及權重對應的 B。使用 L×A×B+abs(b)。中心化本身可能比儲存編碼需要更多位元。
確立輸出轉換順序
乘數為 sx×sw/sy。乘數 0.5、輸出零點 128 時,累加器九變成同距 4.5,捨入至偶數四並產生 132。累加器十一將 5.5 捨入至六,產生 134。累加器 −3 將 −1.5 捨入至 −2。截斷、朝零截斷與算術右移,對負值有不同結果。練習使用專用的最近偶數捨入函式,而非程式語言的預設捨入函式。
對 int8 輸出,轉換後的 300 飽和為 127,−300 飽和為 −128。捨棄高位元會回繞至無關數值。記錄裁切前的數值與飽和次數。契約也要納入 ReLU 的位置,以及它如何表示零。
驗證大的正負總和、精確同距案例、兩端飽和邊界與大偏置。刻意比較寬位元參考與過窄累加器,以揭露溢位。我們可執行的測試資料都在 JavaScript 整數精確範圍內;更大型參考還必須說明主機算術的精確度。
自己試試看
九個 signed-int8 乘積且偏置為零時,十八位元有號數是否足夠?
查看解說
正上界為 9×16384=147456,大於十八位元最大值 131071。十九位元有號數最多可達 262143。