選自arXiv
作者:Mostafa Elhoushi 等機器之心編譯參與:魔王、杜偉
前不久,機器之心報導過北大、華為諾亞等合著的一篇論文,探討了不用乘法用加法能不能做深度學習。最近,我們又看到華為的另一篇論文,這一次沒有用加法替代乘法,而是用「按位移位」和「按位取反」來取代乘法運算。
深度學習模型,尤其是深度卷積神經網絡(DCNN),在多個計算機視覺應用中獲得很高的準確率。但是,在移動環境中部署時,高昂的計算成本和巨大的耗電量成為主要瓶頸。而大量使用乘法的卷積層和全連接層正是計算成本的主要貢獻者。論文連結:https://arxiv.org/pdf/1905.13298.pdf華為的這篇論文提出了解決該問題的新方法,即引入兩種新型運算:卷積移位(convolutional shift)和全連接移位(fully-connected shift),從而用按位移位(bitwise shift)和按位取反(bitwise negation)來取代乘法。使用了卷積移位和全連接移位的神經網絡架構族即 DeepShift 模型。DeepShift 模型可以在不使用乘法的情況下實現,且在 CIFAR10 數據集上獲得了高達 93.6% 的準確率,在 ImageNet 數據集上獲得了 70.9%/90.13% 的 Top-1/Top-5 準確率。研究者將多種著名 CNN 架構的卷積層和全連接層分別進行卷積移位和全連接移位轉換,並進行了大量實驗。實驗結果表明,有些模型的 Top-1 準確率下降程度低於 4%,Top-5 準確率下降程度低於 1.5%。所有實驗均使用 PyTorch 框架完成,訓練和運行代碼也已經發布。代碼地址:https://github.com/mostafaelhoushi/DeepShift引言越來越多的深度神經網絡針對移動和 IoT 應用而開發。邊緣設備通常電量和價格預算較低,且內存有限。此外,內存和計算之間的通信量在 CNN 的電量需求中也佔主要地位。如果設備和雲之間的通信成為必要(如在模型更新等情況下),那麼模型大小將影響連接成本。因此,對於移動/IoT 推斷應用而言,模型優化、模型規模縮小、加速推斷和降低能耗是重要的研究領域。目前已有多種方法可以解決這一需求,這些方法可分為三類:
第一類方法是從頭開始構建高效模型,從而得到新型網絡架構,但要找出最適合的架構需要嘗試多個架構變體,而這需要大量訓練資源;
第二類方法是從大模型開始。由於網絡中存在一些冗餘參數,這些參數對輸出沒有太大貢獻,因而我們可以基於參數對輸出的貢獻程度對它們進行排序。然後修剪掉排序較低的參數,這不會對準確率造成太大影響。參數排序可以按照神經元權重的 L1/L2 均值(即平均激活)進行,或者按照非零神經元在某個驗證集上的比例進行。剪枝完成後,模型準確率會下降,因此需要進一步執行模型訓練來恢復準確率。一次性修剪太多參數可能導致輸出準確率大幅下降,因此在實踐中,通常迭代地使用「剪枝-重新訓練」這一循環來執行剪枝操作。這可以降低模型大小,並加快速度;
第三類方法是從大模型開始,然後用量化技術來縮減模型大小。在一些案例中,量化後的模型被重新訓練,以恢復部分準確率。
這些方法的重要魅力在於:它們可以輕鬆應用於多種網絡,不僅能夠縮減模型大小,還能降低在底層硬體上所需的複雜計算單元數量。這帶來了更小的模型佔用、更少的工作記憶(和緩存)、在支持平臺上的更快計算,以及更低的能耗。此外,一些優化技術用二值 XNOR 運算來替代乘法。此類技術在小型數據集(如 MNIST 或 CIFAR10)上可能有較高的準確率,但在複雜數據集(如 ImageNet)上準確率會嚴重下降。華為的這篇論文提出兩種新型運算——卷積移位和全連接移位,用按位移位和按位取反來取代乘法,從而降低 CNN 的計算成本和能耗。這一神經網絡架構族即為 DeepShift 模型。該方法主要使用 2 的冪或按位移位從頭開始執行 one-shot 訓練,或者對預訓練模型進行轉換。DeepShift 網絡
圖 1:(a) 原始線性算子 vs 本研究提出的移位線性算子;(b) 原始卷積算子 vs 本研究提出的移位卷積算子。如上圖 1 所示,本論文的主要概念是用按位移位和按位取反來替代乘法運算。如果輸入數字的底層二進位表示 A 是整數或固定點形式,則向左(或向右)按位移動 s 位在數學層面上等同於乘以 2 的正(負)指數冪:
按位移位僅等同於乘以正數,因為對於任意 s 值,都有 2_±s > 0。但在神經網絡訓練過程中,搜索空間中必須存在乘以負數的情況,尤其是在卷積神經網絡中,其濾波器的正負值可用於檢測邊。因此,我們還需要使用取反運算,即:
與按位移位類似,取反運算的計算成本較低,因為它只需要對數字返回 2 的補碼。下文將介紹該研究提出的新型算子 LinearShift 和 ConvShift,它們用按位移位和取反取代了乘法:
其中 s 是移位值,n 是取反值。在經典的 CPU 架構中,按位移位和按位取反僅使用 1 個時鐘周期,而浮點乘法可能需要 10 個時鐘周期。LinearShift 算子
其中輸入 x 可表示為矩陣 B × m_in,輸出 y 可表示為矩陣 B × m_out,W 是可訓練權重矩陣 m_in × m_out,b 是可訓練偏置向量 m_out × 1。B 是批大小,m_in 是輸入特徵大小,m_out 是輸出特徵大小。該線性算子的反向傳播可表達為:
其中 L/y 是運算的梯度輸入(運算輸出的模型損失 L 的導數),L/x 是運算的梯度輸出(運算輸入的模型損失的導數),L/W 是運算權重的模型損失的導數。本論文提出該移位線性算子,在其前向傳播中用按位移位和取反替代了矩陣乘法。其前向傳播可定義為:
其中 N 是取反矩陣,S 是移位值矩陣,· 表示這兩個矩陣的對應元素乘法。B 和 S 的大小是 m_in × m_out,b 是偏置向量,類似於原始線性算子。S、N 和 b 都是可訓練的參數。為了幫助推導後向傳播,研究者使用項 V = (1)^round(N) ˙ (2)^round(S),得到:
注意,反向傳播導致 -1 和 2 的冪存在非整數值。但是,在前向傳播中,它們被四捨五入,以實現按位取反和移位。ConvShift 算子原始卷積算子的前向傳播可表達為:
其中 W 的維度是 c_out × c_in × h × w,其中 c_in 是輸入通道大小,c_out 是輸出通道大小,h 和 w 分別是卷積濾波器的高和寬。LeCun 等 [1999] 將卷積的反向傳播表示為:
類似地,本研究提出的卷積移位(即 ConvShift)算子的前向傳播可表示為:
其中 N 和 S 分別表示取反和移位矩陣,維度為 c_out × c_in × h × w。類似地,為了推導反向傳播,研究者使用項 V = (1)^round(N) ˙ (2)^round(S),得到:
基準測試結果研究者在 3 個數據集上測試了模型的訓練和推斷結果:MNIST、CIFAR10 和 ImageNet 數據集。MNIST 數據集下表 1 展示了模型在 MNIST 驗證集上的準確率。我們可以看到,從頭訓練得到的 DeepShift 模型的準確率下降程度超過 13%,不過僅轉換預訓練權重得到的 DeepShift 版本準確率下降程度較小,而基於轉換權重進行後續訓練則使驗證準確率有所提升,甚至超過了原版模型的準確率。
CIFAR10 數據集下表 2 展示了模型在 CIFAR10 驗證集上的評估結果。我們注意到從頭訓練得到的 DeepShift 版本出現了嚴重的準確率下降,而基於轉換預訓練權重訓練得到的 DeepShift 模型準確率下降幅度較小(不到 2%)。值得注意的是,對於未經進一步訓練的轉換權重,寬度更大、複雜度更高的模型取得的結果優於低複雜度模型。這或許可以解釋為,模型複雜度的提升補償了運算被轉換為 ConvShift 或 LinearShift 導致的精度下降。
ImageNet 數據集下表 3 展示了模型在 ImageNet 數據集上的結果,我們從中可以看到不同的模型結果迥異。最好的性能結果來自 ResNet152,其 Top-1 和 Top-5 準確率分別是 75.56% 和 92.75%。值得注意的是,由於時間限制,一些模型僅訓練了 4 個 epoch。進行更多訓練 epoch 可能帶來更高的準確率。
複雜度較高的模型被準換為 DeepShift 後,結果通常更好。MobileNetv2 等「難纏」模型在移除所有乘法運算後準確率僅降低了約 6%。與其他加速方法(如 XNOR 網絡、量化或剪枝)相比,這無疑是巨大的優勢,這些方法對 MobileNet 的優化帶來負面效果。然而,其他「難纏」網絡(如 SqueezeNet)的準確率則出現了大幅下降。為什麼 MobileNetv2 的權重被轉換後,在未經後續訓練的情況下準確率幾乎為 0?而在訓練幾個 epoch 後,Top-5 準確率竟然超過 84%?這一點還有待分析。