5種小型設備上深度學習推理的高效算法

  • 2019 年 11 月 27 日
  • 筆記

作者 | James Le

譯者 | 陸離

編輯 | Jane

出品 | AI科技大本營(ID:rgznai100)

【導讀】文中為AI實踐者和研究者們介紹了5種高效模型推斷算法,希望這篇文章能夠幫助大家更清楚地認識到,在我們所使用的深度學習庫的背後,有多少優化正在被應用,從而在像流動電話等小型邊緣設備上實現越來越多的實際應用。

隨着深度學習的快速發展,神經網絡的規模也變得越來越大。例如,在ImageNet識別挑戰賽中, 從2012年到2015年,獲獎模型的大小增大了16倍。而在短短的一年時間裏,對於百度的深度語音模式來說,用於訓練的模型數量增加了10倍。

一般來說,當前的嵌入式系統的深度學習面臨著如下的三大挑戰:

1、隨着模型的增大,在流動電話上部署模型變得越來越困難。如果模型超過了100 MB,那麼如果你不連接到Wi-Fi(一般的情況下)就會無法進行下載;

2、模型的訓練速度變得極其緩慢。例如,原始的ResNet152的準確率高於ResNet101不到1%,它需要一周半的時間在4個分佈式的GPU上進行訓練;

3、這種龐大的模型難以提高資源利用率。例如,在GO語言環境中,AlphaGo擊敗了Lee Sedol,它使用了1920個CPU和280個GPU來進行訓練,而耗費的電量則花費了有3000美元左右;

在這種情況下,在資源受限的設備上運行神經網絡需要數據工程和數據科學方面的整體解決方案,這些方案有時候會被稱為「算法和硬件協同設計」。源自斯坦福大學Song Han的視頻講座《深度學習的有效方法和硬件設備(efficient methods and hardware for deep learning)》中的一個圖表對這個概念進行了闡述:

在本文中,我們只討論象限的左上部分。有哪些可以有效地進行推理的最先進算法呢?

1、修剪神經網絡

在機器學習中,模型的修剪包括去除不重要的權值以得到更小更快的網絡。

模型修剪最早是在1989年由Yann Le Cun在他的論文《最優腦損傷(Optimal Brain Damage)》中提出的。其思想是採用一個經過充分訓練過的網絡,並去掉那些在刪除之後將導致在目標函數中增加最少的權重。每個參數的作用可以用Hessian矩陣來估算得出。一旦去除了不重要的權值,就可以再次訓練較小的網絡,並且這個過程可以重複執行很多次,直到網絡既具有滿意的規模又具有合適的性能。

從那時起,許多修剪技術的變化已經得到了發展。到了2015年,Han等人在《學習有效神經網絡的權值和連接(Learning both Weights and Connections for Efficient Neural Networks)》一文中,提出了一種「三步法」,即訓練一個神經網絡,然後修剪其權值低於預設閾值的連接,最後重新訓練稀疏網絡,以學習剩餘連接的最終權值。

你可能會想:如何確定修剪的閾值呢?非常好的問題。實際上,卷積層和全連接層都可以剪除;然而,經驗表明,卷積層對修剪比全連接層更加的敏感。因此,要根據每一層的敏感度來進行閾值的選擇和設定,如下圖所示(該圖來源於Han等人的研究論文):

論文地址:

https://papers.nips.cc/paper/5784-learning-both-weights-and-connections-for-efficient-neural-network.pdf

根據這篇論文的說明,在一個NVIDIA Titan X GPU上對修剪過的AlexNet上進行重新訓練需要173個小時。但重新訓練時長並不是一個關鍵的問題,因為最終目標是讓更小的模型在資源受限的設備上快速運行。

在ImageNet上,該方法將AlexNet的參數數量減少了9倍(從6100萬個參數減少到了670萬個),將VGG-16的參數數量減少了13倍(從1.38億個參數減少到了1030萬個)。在修剪後,AlexNet和VGGNet對存儲的需求要低很多,並且所有的權值都可以被存儲在芯片上,而不是芯片外的存儲器上(當然這需要耗費更多的資源來進行訪問)。

2、深度壓縮

神經網絡兼具計算密集型和內存密集型的特點,使得它們很難在硬件資源有限的嵌入式系統上進行部署。為了解決這一局限性,Han等人的關於深度壓縮的論文引入了一個三階段流水線(如下所示):修剪、訓練量化和哈夫曼編碼,它們互相協作,在不影響神經網絡精確度的情況下,將神經網絡的存儲需求減少了35倍到49倍。

這個方法首先會通過只學習重要的連接來修剪網絡。接下來,它量化權重用以強制權重共享。最後,它使用了哈夫曼編碼。在前兩個步驟之後,作者們重新訓練了網絡來微調剩餘的連接和量化的中心。修剪過程將連接數減少了9倍到13倍。然後量化過程將表示每個連接的比特數從32減少到了5。

在ImageNet上,這個方法將AlexNet所需的存儲空間減少了35倍(從240 MB減少到了6.9 MB),而不會造成精確度方面的損失。它還將VGG-16預訓練模型的大小減少了49倍(從552 MB減少到了11.3 MB),並且沒有任何精確度上的損失。

最後,這種深度壓縮算法促進了複雜神經網絡在移動應用中的使用,但其中的應用規模和下載帶寬是受限制的。當以CPU、GPU和移動GPU為基準時,壓縮網絡的分層加速提高了3倍到4倍,而資源消耗率則改進了3倍到7倍。

3、數據量化

近些年來,基於卷積神經網絡的方法在大量的應用中取得了巨大的成功,並已經成為計算機視覺領域中應用最廣泛的體系結構之一。然而,基於卷積神經網絡(Convolutional Neural Networks,CNN)的方法計算能力強、資源消耗巨大,因此很難集成到智能手機、智能眼鏡和機械人等嵌入式系統中。現場可編碼門陣列(Field Programmable Gate Array,FGPA)是一種前景光明的CNN加速平台,但有限的帶寬和芯片存儲空間限制了其性能。

在清華大學CNN研究人員的論文《CNN的嵌入式FPGA平台的深入研究(Going Deeper with Embedded FPGA Platform for CNN)》中,提出了一種基於嵌入式FPGA的CNN加速器設計方案,用於ImageNet的大規模圖像分類。作者們通過經驗表明,在目前最先進的CNN的體系結構中,卷積層以計算為中心,全連接層以存儲為中心。因此,他們提出了一種動態精確數據量化方法(如下圖所示),用以幫助提高帶寬和資源的利用率。

論文地址:

http://cadlab.cs.ucla.edu/~jaywang/papers/fpga16-cnn.pdf

在這種數據量化流中,任意兩個固定點之間的分數長度對於不同的層和特徵映射集都是動態的,而在一個層中是靜態的,用以最小化每個層的截斷誤差。

  • 權重量化階段目的是為在一個層中的權重找到最佳分數長度。在此階段,首先分析各層權重的動態範圍。之後,初始化分數長度以避免數據溢出;
  • 數據量化階段旨在為兩個層之間的一組特徵映射找到最佳分數長度。在此階段,採用貪婪算法(Greedy Algorithm)對定點CNN模型和浮點CNN模型的中間數據進行逐層比較,以減少精確度的損失;

他們進一步分析了不同神經網絡結構下的不同策略,其結果表明,動態精確度量化比靜態精確度量化是更為有利的。通過動態精確度量化,他們可以使用更短的操作表示,同時仍能達到與靜態精確度量化相當的精確度。

4、低階近似

卷積神經網絡(Convolutional Neural Network,CNN)的另一個問題是其高昂的測試時間評估成本,這就使得模型在現實系統中不是很實用。例如,雲服務每秒鐘需要處理數千個新的請求;手機和平板電腦等便攜式設備大多只有CPU或低端的GPU;一些識別任務(例如對象檢測)對於處理單個圖像仍然非常地耗時,即使在高端GPU上也是如此。因此,降低CNN的測試時間計算具有重要的現實意義。

微軟(亞洲)研究院關於對非線性卷積網絡的高效精確近似值的論文《Efficient and Accurate Approximations of Nonlinear Convolutional Networks》,其中提出了一種加速非線性卷積神經網絡的方法。它基於最小化非線性響應的重建誤差,受限於一個可以用來降低計算量的低階約束。為了解決這種極具挑戰性的約束優化問題,在作者們將其分解成兩個可行的子問題之後進行了迭代處理。隨後,他們提出了最小化非對稱重建誤差的方式,這有效地減少了多個相似層的累積誤差。

論文地址:

https://arxiv.org/pdf/1411.4229.pdf

如上圖所示,作者們將原始層(由W提供)替換為兩個層(由W '和P提供)。矩陣W '在實際上是d '過濾器,其大小為k * k * c(其中k是過濾器的空間大小,c是該層的輸入信道的數量)。

這些過濾器生成了一個d '維特徵圖。在這個特徵映射上,d * d』的矩陣P可以用以實現1 * 1 * d』的d過濾器。因此P對應於一個具有1 * 1空間支持的卷積層,它將d』維特徵圖映射到d維特徵圖。

他們在給ImageNet訓練的大型網絡上應用了這種低階近似方式,並得出了訓練加速的比率提高了4倍的結果。事實上,與AlexNet相比,他們的加速模型的推理速度相對較快,而準確率則提高了4.7%。

5、訓練三元量化

另外一種可以解決在資源有限的移動設備上部署大型神經網絡模型的算法是訓練三元量化(Trained Ternary Quantization),它可以將神經網絡中的權值精確度降低到由三個部分組成的值。這個方法對精確度影響很小,甚至可以提高一些在CIFAR-10上的模型以及ImageNet上的AlexNet模型的精確度。本文從零開始訓練AlexNet模型,這意味着它和訓練一個正常的、全精確度的模型一樣簡單。

上圖中所顯示的訓練量化方法可以同時學習三元值以及三元賦值。首先,作者們通過將每個權值除以最大權重的方式,將全精確度的權值標準化到範圍[-1,+1 ]。

接下來,他們通過設置閾值將中間的全分辨率權值量化為數組{-1,0,+1}。閾值因子t是一個超參數,它在所有的層都是相同的,這樣就可以有效縮小搜索空間。

最後,他們通過反向傳播兩個梯度(虛線所示)來執行訓練量化:梯度1到全分辨率權值,梯度2到縮放係數。前者可以學習三元賦值,而後者則可以學習三元值。

他們在CIFAR-10上的實驗表明,用這種訓練的量化方法得到的三元模型分別比ResNet32、ResNet44、ResNet56這三個全精確度的模型要好0.04%、0.16%和0.36%。在ImageNet上,他們的模型比全精確度的AlexNet模型要高出Top-1精確度的0.3%,而比以前的三元模型的精確度高3%。

原文鏈接:

https://heartbeat.fritz.ai/the-5-algorithms-for-efficient-deep-learning-inference-on-small-devices-bcc2d18aa806?gi=e03a7e08b72b

(*本文為AI科技大本營編譯文章,轉載請微信聯繫1092722531)