BMXNet:基於MXNet的二進位神經網路實現

作者|Haojin Yang 等

譯者|薛命燈

編輯|Emily

AI前線出品| ID:ai-front

近年來,深度學習在學術和行業領域取得突破性的進展,但深度學習需要耗費大量的計算和存儲資源。與此同時,移動、可穿戴設備、自動機器人和物聯網對深度學習的需求愈加旺盛,所以如何將深度學習模型應用在這些低配置的設備上成為了一個巨大的挑戰。二進位神經網路(BNN)的出現解決了在低配置設備上應用深度學習模型的難題。

位於德國波茨坦的 Hasso Plattner Institute 近日開源了一個 BNN 庫,叫作 BMXNet。它基於 Apache MXNet,使用 C 和 C++ 實現,支持將 BNN 層無縫地與其他標準庫組件結合在一起,並支持 GPU 和 CPU 兩種模式。

BMXNet 提供了激活層、卷積層和全連接層,並支持二進位的輸入數據和權重。它們分別是 QActivation、QConvolution 和 QFullyConnected,分別與 MXNet 的三個層對應。它們提供了一個額外的參數 act_bit,用於控制位寬。

在傳統的深度學習模型中,全連接和卷積層嚴重依賴矩陣的點積,導致出現大量的浮點數運算。而二進位權重和輸入數據可以利用 CPU 的 xnor 和 popcount 指令,從而極大地提升矩陣乘法的性能。

在訓練階段,BMXNet 二進位化的層銜接 MXNet 內置的層,將權重和輸入限制在 -1 和 +1 之間的離散值範圍內。在計算出點積之後,將計算結果映射回 xnor 風格的點積值區間。

在使用 BMXNet 訓練之後,權重以 32 位浮點變數的形式保存下來,使用 1 個 bit 位寬訓練得到的網路也是如此。BMXNet 提供了 model_converter,用於讀取訓練過的二進位文件和打包 QConvolution 及 QFullyConnected 層的權重。經過轉換之後,每個權重只佔用一個 bit 的存儲空間和內存。

以下是 BMXNet 在 MNIST(手寫識別)和 CIFAR-10(圖像分類)數據集上訓練得出的一個實驗結果。

從表中可以看出,二進位模型在大小方面有很大優勢,在準確度方面雖然有一點下降,但相差不遠,仍然有很大的競爭力。

下圖是一組性能方面的實驗數據。使用了不同的 GEMM 方法和一組固定的參數:過濾值為 64,內核大小為 5x5,批次大小為 200,矩陣的 M、N、K 分別為 64、12800 和內核寬度 x 內核高度 x 輸入通道大小。

圖中有顏色的長方形表示處理時間,xnor_32 和 xnor_64 分別表示 32 位和 64 位的 xnor gemm 操作符,xnor_64_omp 表示使用了 OpenMP 並行編程庫的 64 位 xnor gemm 加速。二進位化輸入和 xnor_64_omp 又將二進位化的處理時間也累積起來。儘管輸入數據的二進位化也耗費了一些時間,但仍然得到比 Cblas 方法更好的結果。

從目前的實驗的結果來看,它的模型大小只有傳統模型的二十九分之一,而且在 gemm 計算方面具有更高的效率。BMXNet 的源代碼、文檔以及一些應用示例的代碼和預訓練模型可以在 GitHub(github.com/hpi-xnor)上找到。下一步,該項目將會在準確度和效率方面做更多的改進,並在 Q_Conv 層重新實現 unpack_patch2col 方法,以便改進 CPU 模式下的推理速度。


-全文完-

關注人工智慧的落地實踐,與企業一起探尋 AI 的邊界,AICon 全球人工智慧技術大會火熱售票中,6 折倒計時一周搶票,詳情點擊:

aicon.geekbang.org/appl

《深入淺出TensorFlow》迷你書現已發布,關注公眾號「AI前線」,ID:ai-front,回復關鍵字:TF,獲取下載鏈接!


推薦閱讀:

當AI學會了看相算命,畫風就有點不太對勁了
Edward中文文檔維護團隊招募成員
全卷積網路:從圖像級理解到像素級理解

TAG:神经网络 | 人工智能 |