天天看點

第一次勝過MobileNet的二值神經網絡,-1與+1的三年艱苦跋涉

二值網絡是非常極緻的一種神經網絡,它的權重、激活值隻有+1 與-1 兩種狀态。那麼這麼極簡的神經網絡到底能幹什麼,它的優勢與限制都有什麼?這就是本文關注的,我們希望通過基本概念、性能裡程碑看看二值神經網絡這幾年到底有什麼發展。

與此同時,本文也着重介紹了一種最前沿的二值網絡 MeliusNet,它的誕生預示着二值網絡在 ImageNet 上第一次能達到 MobileNet 的水準。

二值神經網絡是什麼?

我們知道模型壓縮非常重要,想要應用到真實業務,模型就必須得高效。在模型壓縮中,有一種非常極緻的壓縮方法,它通過限制權重隻能取-1、+1 兩個值,進而大量降低計算資源的需求。

第一次勝過MobileNet的二值神經網絡,-1與+1的三年艱苦跋涉

二值神經網絡示例。

對于儲存的節省,這裡可以舉個例子,正常神經網絡采用 FP32 來表示數值,權重檔案經常會達到 1GB。而若權重數量相等,二值神經網絡可以節省 32 倍的存儲,權重檔案也就由 1GB 降低到 32MB。這看起來就非常有吸引力,簡直是部署邊緣端模型的不二選擇。

更重要的是,二值網絡隻有+1 與-1,這意味着所有運算隻靠位運算就能完成,二值網絡借助與門、異或門等運算,可以替代傳統乘加運算。換句話說,在二值網絡的傳播過程中,基本是不需要乘法的,它隻需要加法與位運算。如果有一個強大的二值網絡,我們也許能擺脫對 GPU 等高性能計算裝置的依賴。

既然有着這兩大不可忽視的優勢,那麼為什麼現在絕大多數神經網絡還是采用的單精度浮點數?為什麼神經網絡做量化也隻是壓縮到 INT8 等低精度整數,而不能直接壓縮到接近二值的超低精度?

與優勢同樣明顯的是,二值神經網絡也有不可忽視的缺陷。

令人又愛又恨的二值網絡

針對二值網絡的兩大優勢,它也有兩大缺陷。首先,二值網絡極緻地将數值精度降低到-1 與+1,這肯定會大幅度降低模型的效果。這一點從 BNN 的開山之作 [1,2] 在 ImageNet 分類任務上 Top-1 準确度僅能達到 50% 左右就可見一斑。

其次,二值網絡一直缺乏有效的訓練算法,這也是困擾模型的艱難問題。很明顯,既然二值網絡在傳播時采用的是±1,那麼我們無法直接計算梯度資訊,也就無法高效地使用反向傳播更新權重。

是以想要學習一個可行的二值網絡,我們不僅需要确定如何對輸入、參數執行二值化,同時還需要能從二值化的結果計算對應梯度。

其實之前在 2016 年的時候,BNN 與 XNOR-Net 的提出令很多研究者看到了二值網絡的優勢。但問題在于,二值網絡精度太低,又難以訓練。是以在短暫的熱潮之後,關于二值網絡的各項研究都被擱置了,僅留下了少數最為核心的問題,例如如何提升二值網絡的效果。

從 16 年到現在已經過去很久了,令人又愛又恨的二值網絡到底有了哪些提升?後文希望從二值網絡的發展路線、效果裡程碑等方面回顧 BNN 近 3 年的發展曆程。

走向現在的二值網絡

BNN 與 XNOR-Net,它們是近來最早引起廣泛關注的研究。對于建構二值網絡的兩個問題,BNN 采用符号函數 Sign() 來實作二值化,采用 Straight-through Estimator(STE)來傳遞梯度。其中二值化很好了解,即輸入如果是正數和零,則傳回+1,輸入是負數,則傳回-1。

而 STE 的主要思想也比較容易了解,因為二值化後的權重是無法精确計算梯度的,但在執行二值化前,那樣的浮點數能産生足夠準确的梯度。是以,STE 在訓練中會保留浮點數,并采用梯度更新這樣的浮點數,在訓練完成後,我們對這些浮點數做一個二值化就能得到最終的網絡,并可以丢棄浮點數。

這兩個問題是二值網絡的核心,很多新研究都針對它們提出了新的見解。

例如 [8] 等不少研究提出了 STE 的替代方案,這些方法大多嘗試一種可微的 Approximator,或者使用比 STE 曲線更加平滑的函數來代替它。不過這些研究建立在實驗和直覺上,缺少理論上嚴謹的證明,甚至在其它驗證明驗中 [9],也沒有取得超過 STE 的結果。

二值網絡的晉升之路

2016 提出的 BNN [1] 是 Bengio 等大牛的挖坑之作,該研究可以認為是現代二值網絡的開山之作。研究者在 MNIST 與 CIFAR-10 等小資料上測試了模型效果,該研究至少證明二值神經網絡是可行的。

同樣在 2016 年提出的還有 XNOR-Net [2],入坑二值網絡研究的小熱潮就是它帶動的。該模型在 ipohne 上做到了 yolo v1 的實時檢測,可惜 ImageNet 上精度還是很低,僅為 51%。論文裡 58 倍加速比也帶有誤導性,因為它的對比并不是太公平。

第一次勝過MobileNet的二值神經網絡,-1與+1的三年艱苦跋涉

XNOR-Net 的效果展示,選自 [2]。

即使這樣,51% 的準确率也持續到 2018 年才被超越,可見 BNN 準确率的提升并不簡單。

WRPN [3] 和 Shen et al. [11] 通過提升卷積層通道數的方式來提升 BNN 的精度,即讓 BNN 變得更寬。但是這樣的方法很大程度上增加了運算複雜度,欠缺模型效果和計算複雜度上的平衡,實用性比較差。

ABC-Net 和 GroupNet[7] 是另一種提升 BNN 準确率的代表性方法。它們認為單個權重與激活值資訊量不夠,如果多學習幾組,并取線性權重來逼近全精度輸出,那麼效果應該是足夠的。這類方法計算複雜度太高,準确率是上去了,但速度優勢也沒了。

随後,Bi-RealNet [8] 和 BinaryDenseNet [9] 都堅持用一組權重與激活值,并通過改進網絡結構來提升效果。研究者在設計結構時嘗試調優網絡的資訊流,移除資訊流中的「瓶頸」。這兩項工作都更具實踐意義,作者們也開源了對應代碼。

值得注意的是,[9] 中作者做了完整詳細的測評實驗,驗證之前研究提出的技巧或方法,例如 scaling factor,approxi-sign function 等。結果顯示也許我們不需要複雜的技巧,隻需要簡單樸素的方法就能獲得很好效果。

MeliusNet 來了

現在,來自德國波茨坦大學的 Joseph Bethge 和 Haojin Yang 等研究者提出了 MeliusNet [10],其準确度上能擊敗之前所有二值模型,甚至超越了 MobileNetV1。

與此同時,MeliusNet 的計算複雜度并不高,能充分利用二值網絡的速度優勢。整體而言,MeliusNet 繼續在 BNN 定制化架構上進行探索,為二值網絡設計了一套高效簡潔的架構。

如下所示為 MeliusNet 的建構塊,它主要由 Dense Block 與 Improvement Block 組成。其中 Dense Block 主要用于擴充特征的表達能力,而 Improvement Block 主要用于提升特征的品質。

第一次勝過MobileNet的二值神經網絡,-1與+1的三年艱苦跋涉

MeliusNet 建構塊示意圖,選自 [10]。

Dense Block 是 DenseNet 的二值化變體,它包含一個二值卷積(Binary Convolution),并将輸入特征壓縮到 64 個通道數,并憑借到原本的輸入特征上。舉個栗子,Dense Block 的輸入特征是 W*H*256,那麼輸出特征就是 W*H*320,相當于擴充了輸入特征。

随後的 Improvement Block 主要關注新擴充特征的品質,如上圖所示,所有特征圖會經過新的卷積運算,并用來提升之前新生成的 64 張特征圖。最後得出的 320 張特征圖就是建構塊的輸出結果,可以看到,MeliusNet 資訊流是不斷擴充與精煉的。

研究者同樣也做了很多實驗,為了對比其它 SOTA 模型,研究者根據不同配置建構了不同大小的 MeliusNet,17MB 大小的 MeliusNet 59 在 ImageNet 上已經能達到 70.7% 的 Top-1 準确率。

第一次勝過MobileNet的二值神經網絡,-1與+1的三年艱苦跋涉

表 1:不同 MeliusNet 在 ImageNet 上的效果。其中降低通道數的因子根據 32 的倍數來選,「/2」與「/4」等字尾表示 1×1 下采樣卷積采用 2 和 4 的分組。選自 [10]。

MeliusNet 在 ImageNet 上的效果已經很好了,相比最開始 50% 左右的準确率已經提升了一大截。那麼 MeliusNet 與其它二值網絡、MobileNet V1 的對比又是怎樣的?研究者在給定模型大小的情況下,對比了不同模型在 ImageNet 上的效果。

第一次勝過MobileNet的二值神經網絡,-1與+1的三年艱苦跋涉

圖 5:ImageNet 資料集上,不同模型在 4MB 和 5MB 大小下的效果。其中所有彩色的圖示表示模型通過作者的政策訓練,黑色表示原論文的結果。選自 [10]。

從上圖 a 可以看出,MeliusNet 22 要比 BinaryDenseNet 28 有更高的準确率,且沒有額外的運算。與此同時,在 b 圖中,MeliusNet 是第一個實作能媲美 MobileNet 的二值神經網絡。

 此外,研究者還對比了其它使用多組權重與激活值的二值網絡、更大一些的 MobileNet 1.0。結果表明盡管 MeliusNet 是二值網絡,但它在 ImageNet 上的效果已經非常驚人了。

第一次勝過MobileNet的二值神經網絡,-1與+1的三年艱苦跋涉

表 2:不同模型架構的計算複雜度與效果對比,MeliusNet 相比 MobileNet 0.5、0.75 和 1.0 能實作相等或更好的效果。選自 [10]。

通過一系列實驗,我們至少可以明确,二值網絡在準确度上也是非常有潛力的。MeliusNet 證明了更好的二值網絡架構,确實能産生更優秀的模型效果。

二值網絡能幹什麼?

 首先二值網絡本身就是一種模型壓縮方法,它能以更小的存儲代價、計算代價實作相同的功能。在 WRPN [3] 中,Intel 的研究員在 FPGA 和 ASIC 等多種不同硬體上驗證了二值網絡的效果。該研究表示在 FPGA 和 ASIC 等定制晶片上,和标準單精度模型相比,BNN 可以達到超過 50 倍的加速比,同時達到千分之一的能耗比。

[Image: image.png] 圖注:低精度運算在不同硬體上的效果提升。d 圖可以看到二值網絡的加速比超過 50 倍,g 圖可以看到能耗效率能提升一千倍。

既然效果這麼強硬,而且 MeliusNet 的準确率也提升來了,那我們為什麼不試一試?

如果不考慮論文複現代碼,目前能用的可靠開源項目并不多。

  • BMXNet 2017 [5] 由來自德國 Hasso Plattner Institute 的研究員 Haojin Yang 等開發,它是一個基于 MXNet 的二值化開源架構。它支援使用 CuDNN 進行訓練,并使用二值運算符 XNOR 和 Bitcount 做推斷。不足之處是二值化核心并未經過專門調優,是以在 ARM CPU 上的速度表現并不突出。
  • Dabnn 2019 [4] 由京東 AI 研究院推出,基于彙編調優後的 BNN 推理工具。它有效提升了 BNN 在 ARM 架構端上的推理速度,但是這個工具并不能用于模型訓練,需要使用其它工具進行訓練。
  • BMXNet-v2 2019 [9],Bethge 和 Yang 等開源了支援 Gluon API 的第二版。該架構采用的一系列改進大大降低了模型訓練難度,大大減小了同 MXNet 同步的成本。第二版不僅提升了效率,同時繼續支援模型的壓縮和二值化推理,可将模型部署在多種邊緣裝置上。

有了這些工具,再加上架構上的創新,二值神經網絡能做的比我們想象的更多。也許以後跑在手機等移動裝置上的神經網絡,就能經常見到二值網絡大顯身手。

繼續閱讀