神經網絡加速器快速、低功耗推理的一個主要挑戰是模型的大小。近年來,隨著模型尺寸的增加,推理時間和每次推理能耗的相應增加,神經網絡向更深的神經網絡發展,激活和系數也在增加。這在資源受限的移動和汽車應用中尤為重要。
低精度推理有助于通過降低 DRAM 帶寬(這是影響設備能耗的一個重要因素)、計算邏輯成本和功耗來降低推理成本。在這種情況下,下面的問題自然而然地出現了:編碼神經網絡權重和激活的最佳位深度是多少?有幾個建議的數字格式可以減少位深度,包括Nvidia的TensorFloat,谷歌的8位非對稱定點(Q8A)和bfloat16。
但是,雖然這些格式是朝著正確方向邁出的一步,但不能說它們是最佳的:例如,大多數格式都為要表示的每個值存儲一個指數,當多個值在同一區間時,這些指數可能是多余的。
更重要的是,他們沒有考慮神經網絡的不同部分通常有不同的位深度要求這一事實。有些圖層可以用較低的位深度編碼,而其他圖層(如輸入和輸出層)需要更高的位深度。MobileNet v3就是一個例子,它可以從 32 位浮點轉換為大多數在 5-12 位區間內的位深度(見圖 1)。
我們稱使用不同的位深度來編碼原始浮點網絡的不同部分為可變位深度 (VBD) 壓縮。當然,權重的位深度編碼和網絡準確度也是需要權衡的。較低的位深度會導致更有效的推斷,但刪除過多的信息會損害準確性,這意味著需要找到一個最佳的折中方案。VBD 壓縮的目標是在壓縮和精度之間進行平衡。
原則上,可以將其視為優化問題:我們希望用盡可能少的比特數達到最佳精度的網絡。這是通過在損失函數中添加新的一項來實現的,該項表示網絡的大小,以便可以沿原始損失函數最小化,該函數可以大致表示為:總損失=網絡錯誤+γ(網絡大?。┢渲笑檬且粋€權重因子,用于控制網絡大小和誤差之間的目標權衡。
因此,要以這種方式壓縮網絡,我們需要兩件事:精度的可微度量(錯誤)和網絡大小的可微度量(壓縮位深度)。網絡大小項和網絡誤差項相對于比特數的可微性非常重要,因為它使我們能夠優化(學習)比特深度。
可微網絡規模
對于可微量化,我們可以使用任何具有可微位深度參數的函數,該參數將一個或多個浮點值映射為硬件可表示的壓縮數字格式。例如,我們可以使用 Google Q8A 量化的可變位深度版本(其中可表示范圍不是以零為中心):
其中:
?x?是 x 四舍五入到最近的整數(使用目標硬件平臺的舍入模式)
B 是位深度。
E 是浮點表示的指數。
α是不對稱參數。
在實踐中,量化參數 B、E 和α用于壓縮多個權重,例如,單個參數用于壓縮整個神經網絡層(激活或權重張量)或層內的通道。我們還可以通過將不對稱參數設置為 0 來使用對稱量化(有效地將其轉換為縮放的 B位無符號整數格式):為了實現對所有參數的反向傳播,我們使用直通估計器,將圓形函數的梯度作為 1。這使得公式中的所有操作都是可微的,使所有參數(包括位深度)都可學習!此時,我們可以選擇要訓練的參數:1. 權重和最大壓縮位深度。2. 只有權重和指數(對于固定的位深度)。3. 只有量化參數,它有幾個好處(如下所述),成本可能更低的壓縮比。在生成本文的結果時選擇了選項 3。
另一個需要考慮的方面是優化位深度參數 B(對于某些格式的指數 E):任何硬件都需要 B 是整數。要找到整數解,我們有多種選擇:
將四舍五入與直通估計器一起應用于 B 參數(例如,使用公式)。但是,這給優化表面帶來了不連續性,雖然可以處理,但超出了本文的范圍。
這里選擇的替代方案是在訓練的第一階段優化浮點數B,“保守”地將其四舍五入到最近的整數?B?( 否則激活和權重張量的重要部分可能會被鉗制),將其固定為常量并繼續訓練。這樣平均會損失大約 0.5 位的潛在壓縮,但保證不會發生不適當的裁剪。
可微精度測度
為了測量網絡的準確性,我們可以簡單地使用網絡最初訓練的相同損失函數。然而,在許多應用中,目標是壓縮一個已經用32 位浮點訓練的網絡,這意味著我們可以用蒸餾損失代替。這意味著壓縮網絡的精度是根據原始網絡的輸出來衡量的。在這項工作中,選擇(輸出)logits之間的絕對差異作為蒸餾損失,但也可以采用其他措施。
使用的蒸餾損失定義為:
(等式1)
蒸餾損失有許多優點:
無標簽訓練:我們不需要標簽數據來壓縮網絡,因為我們用原始網絡的輸出取代了標簽。這意味著我們可以壓縮網絡,而無需訪問(可能是專有的)原始數據集:我們只需要具有代表性的輸入和原始網絡。
通用性:神經網絡壓縮機具有通用性:它不需要特定于網絡。
更少的訓練數據:由于我們只是訓練量化參數,過度擬合的范圍大大縮小,所以我們可以使用更少的訓練數據。有時候一張圖片就足夠了!
軟目標:由于從輸入得到的蒸餾損失比標簽包含更多的量化誤差信息,因此它允許更快、更準確的收斂。
我們可以使用蒸餾損失將權重與量化參數一起訓練。然而,在這種情況下,我們需要更多的訓練數據來防止過度擬合。兩全其美的方法是以很小的學習率來訓練權重,并提前停止。這樣,權重可以抵消量化誤差,而不會過度擬合數據集。
可微壓縮將通用的、可微的精度度量與可微量化相結合,得到可微壓縮的損失函數:
(等式2)第一個項是誤差,第二項是網絡大小的成本。B 是網絡的平均位深度,可根據整個網絡的深度參數來計算:
(等式3)其中c_i是使用位深度參數B_i量化的網絡參數(權重或激活)的數量。請注意,此測量方式取決于批次大小。例如,如果對32個批次網絡進行評估,則激活張量的大小實際上比使用1 批次大小的高出 32 倍。如果目標是將網絡權重存儲在盡可能小的空間中,則此指標中也可以忽略激活。
選擇量化粒度一些神經網絡表示,如谷歌的Q8A格式,允許將不同的比例系數(與上面的指數E的2次冪相關)應用于權重張量(過濾器)的不同通道。這種更精細的粒度可提高給定壓縮級別的網絡精度。
通過對每個通道應用單獨的 E 和α參數,同時對整個張量使用相同的 B 參數,可以通過可變位深度壓縮實現相同的目標。然而,每個通道的量化會導致更慢的收斂,因此根據我們的經驗,使用學習前張量參數的訓練階段更快,然后將這些參數分解為每通道參數,并讓它們在另一個訓練階段收斂。
這最終導致三個階段的訓練計劃:
根據張量訓練所有量化參數
切換到每通道指數和移位參數
將位深度舍入到整數,并將其固定到常量,然后訓練指數和移位參數α。此外,權重也以較小的學習率進行訓練。
結果對象分類
壓縮分類網絡的精確度。
圖像分割
應用于分割網絡的不同壓縮方法之間的比較。第二個列基于啟發式算法,該算法試圖在不使用反向傳播的情況下確定固定位深度的最佳指數。
風格轉換
最后一列使用上述啟發式給出10 比特時的完全空白輸出。
結論用于編碼神經網絡權重和激活的位深度對推理性能有顯著影響。將大小精度權衡作為損失函數的一部分,可以在神經網絡訓練過程中學習任意粒度的最佳比特深度。此外,當優化將 0 位分配給網絡的一部分時,它會有效地從架構中刪除該部分,作為一種架構搜索,從而降低計算成本和帶寬成本。今后的工作將探索這方面的可微網絡壓縮。我們提出了一種基于微分量化和蒸餾的通用而靈活的方法,允許在不影響精度的情況下為各種任務優化位數。我們的方法有幾個優點,包括訓練時間短,重復使用訓練過的網絡,不需要標簽,可調整的大小精度權衡和問題無關的損失功能。通過這種方式,我們可以將網絡壓縮為有效的可變位深度表示,而不犧牲對原始浮點網絡的保真度。
[i] https://blogs.nvidia.com/blog/2020/05/14/tensorfloat-32-精確格式/
[ii]https://www.tensorflow.org/lite/performance/quantization_spec
[iii]https://arxiv.org/abs/1905.12322
[iv] https://arxiv.org/abs/1308.3432
[v]https://arxiv.org/abs/1503.02531
作者:Szabolcs Cséfalvay
原文鏈接:https://www.imaginationtech.com/blog/low-precision-inference-using-distillation/
編輯:jq
-
DRAM
+關注
關注
40文章
2325瀏覽量
183768 -
谷歌
+關注
關注
27文章
6192瀏覽量
105819 -
神經網絡
+關注
關注
42文章
4779瀏覽量
101052 -
估計器
+關注
關注
0文章
3瀏覽量
5565
原文標題:使用蒸餾法對低精度推理的浮點網絡進行高保真轉換
文章出處:【微信號:Imgtec,微信公眾號:Imagination Tech】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論