深度神經網路的壓縮和正則化
深度神經網路已經成為解決計算機視覺、語音識別和自然語言處理等機器學習任務的最先進的技術。儘管如此,深度學習演算法是計算密集型和儲存密集型的,這使得它難以被部署到只有有限硬體資源的嵌入式系統上。
為了解決這個限制,可以使用深度壓縮來顯著地減少神經網路所需要的計算和儲存需求。例如對於具有全連線層的卷積神經網路(如Alexnet和VGGnet),深度壓縮可以將模型大小減少35到49倍。即使對於全卷積神經網路(如GoogleNet和SqueezeNet),深度壓縮也可以將模型大小減少10倍。而且上述兩種壓縮情況都不會降低模型預測的精度。
當前的訓練方法有不足之處
壓縮模型而不丟失其精確度意味著在訓練好的模型中有嚴重的冗餘,這說明當前的訓練方法有不足之處。為了解決這個問題,我和來自NVIDIA的JeffPool、百度的Sharan Narang和Facebook的Peter Vajda合作開發了“密集-稀疏-密集”(DSD)的訓練方法。這是一種新的方法,它首先通過稀疏約束的優化方法將模型正則化,然後通過恢復和重新訓練被剪枝的連線的權重來提高預測精度。在測試時,由DSD訓練得到的最終模型仍然跟原始密集型模型具有相同的架構和維度,並且DSD訓練不會增加任何推理開銷。我們對主流的神經網路(如CNN / RNN / LSTM)架構用DSD訓練方法進行了影象分類、影象描述和語音識別的實驗,發現模型有顯著的效能改進。
在本文中,我們會首先介紹深度壓縮,然後介紹“密集-稀疏-密集”(DSD)訓練方法。
深度壓縮
深度壓縮的第一步是“突觸剪枝”。 人類大腦是有這一剪枝過程的。從嬰兒時期到成年,人腦會有5成的突觸會被修剪掉。
類似的規則是否適用於人工神經網路呢?答案是肯定的。在早期的工作中,網路剪枝已經被證明是一種減少網路複雜度和過度擬合的有效方法。這種方法也適用於現代神經網路。首先我們通過常規神經網路訓練來學習網路連線權重。然後我們會剪枝權重值較小的連線:即刪除網路中權重值低於某一閾值的所有連線。最後,我們重新訓練網路,得到剩餘稀疏連線的權重值。剪枝方法使AlexNet和VGG-16模型的引數數量分別減少了9倍和13倍。
圖1. 剪枝一個神經網路。所有圖片由Song Han 友情提供
深度壓縮的下一步是權重共享。我們發現神經網路對低精度權重值具有非常高的容忍度:極度粗略的權重值並不會降低預測精度。如圖2所示,藍色權重值最初為2.09、2.12、1.92和1.87,然後讓它們共享相同的權重值2,網路的預測精確度仍然不受影響。因此我們可以只儲存非常少量的權重值,稱之為“編碼本”。並讓許多其他權重共享這些相同的權重值,且只在碼本中儲存其索引即可。
索引可以用非常少的位元數來表示。例如在下圖中存在四種顏色,因此僅需要兩位來表示一個權重而不用原來的32位。另一方面,編碼本佔用的儲存空間幾乎可以忽略不計。我們的實驗發現,就權衡壓縮比和精度而言,這種權重共享技術是優於線性量化的方法的。
圖2. 訓練權重共享的神經網路
圖3顯示了使用深度壓縮的總體結果。Lenet-300-100和Lenet-5是在MNIST資料集上評估的,而AlexNet、VGGNet、GoogleNet和SqueezeNet是在ImageNet資料集上評估的。壓縮比從10倍到49倍不等。即使對於那些全卷積神經網路(如GoogleNet和SqueezeNet),深度壓縮仍然可以將它們壓縮一個數量級。我們重點看一下SqueezeNet,它比有相同預測精度的AlexNet少50倍的引數,但仍然還可以再壓縮10倍使其模型大小隻有470KB,這使它可以很容易地在片上SRAM裡使用。而訪問SRAM比DRAM更快更節能。
我們還嘗試了其他壓縮方法,例如基於低秩近似的方法,但是壓縮比沒有那麼高。你可以在Deep Compression的論文中找到完整的討論。
圖3 深度壓縮的實驗結果
DSD訓練
深度神經網路可以被大量剪枝和壓縮的事實意味著我們當前的訓練方法具有一些侷限性。它不能充分利用密集模型的全部容量來找到最佳區域性最小值,而一個剪枝過的有著更少神經突觸的稀疏模型也可以達到相同的精度。這帶來了一個問題:我們是否可以通過恢復並重新學習這些權重來達到更好的精度嗎?
讓我們拿奧運會田徑比賽的訓練做個比喻。教練首先會讓跑步運動員在高海拔的山地上訓練,那裡會有很多的限制:低氧、寒冷等。結果當跑步運動員再次返回平原地區時,他的速度就會有提高。對於神經網路來說也是相同的道理:給定嚴格約束的稀疏訓練方法得到的網路模型有跟密集網路模型一樣的效能。一旦你解除了這些約束,模型可以工作得更好。
理論上,以下是DSD訓練能行之有效的因素:
1.避開鞍點:
優化深度網路最大的困難之一是鞍點的擴散。 DSD訓練方法通過剪枝和重新密集化的框架來避開鞍點。對收斂的模型做剪枝干擾了模型學習的模式並使得網路模型能夠避開鞍點,這使模型有機會可以收斂到一個更好的區域性或全域性最小值。這個想法也跟“模擬退火”演算法類似。雖然模擬退火演算法在搜尋圖上隨著概率降低而隨機跳躍,但是DSD訓練方法會確定性的偏離收斂值。這一收斂值是通過在第一次密集模型訓練階段中去除小權重值和增強稀疏支援得到的。
2.正規化和稀疏訓練:
稀疏訓練步驟中的稀疏正規化將模型優化降維到較低維空間,在這個空間中的損失函式表面更平滑並且對噪聲更魯棒。很多數值實驗證實了稀疏訓練和最終DSD方法可以降低方差和減少誤差。
3. 強大的重新初始化:
權重初始化在深度學習中起著重要的作用。傳統的訓練方法只有一次初始化的機會,而DSD方法在訓練過程中給模型優化第二次(或更多)的機會。它基於更魯棒的稀疏訓練結果來重新初始化。我們基於稀疏模型結果來重新構建密集網路,這可以理解為剪枝權重的零初始化。其它的初始化方法也值得嘗試。
4. 打破對稱性:
隱藏單元的置換對稱性會使權重對稱,因此在訓練中容易相互影響。在DSD方法中,權重剪枝打破了與權重相關的隱藏單元的對稱性,而且在最終的密集模型中是不對稱的。
我們在幾個主流的CNN/RNN/LSTM模型上進行了影象分類、影象描述和語音識別資料集的實驗,發現這種“密集-稀疏-密集”的訓練流程能夠顯著地提高模型精度。我們的DSD訓練方法採用了三個步驟:密集,稀疏,密集。圖4展示了每個步驟。
圖4 密集-稀疏-密集的訓練流程
1.初始的密集訓練:
第一個“密集”步驟通過在密集網路上的常規網路訓練來學習連線權重。然而跟傳統訓練不同的是,該“密集”步驟的目的不是學習連線權重的最終值,而是學習哪些連線是重要的。
2. 稀疏訓練:
“稀疏”步驟會剪枝掉權重值較低的連線並重新訓練稀疏網路。我們對試驗中的所有層都使用相同的稀疏度,因此會有一個單一的超引數:稀疏度(sparsity)。我們對每一層的引數進行排序,從網路中去掉最小的N* sparsity個稀疏引數,將密集網路轉換為稀疏網路。我們發現稀疏比率為50%-70%的效果非常好。然後我們重新訓練稀疏網路,這可以在稀疏約束下完全復原模型的精度。
3. 最終的密集訓練:
最後的“密集”步驟會恢復已剪枝的連線,使網路再次變的密集。這些之前剪枝的連線會初始化為零並重新訓練。恢復被剪枝的連線增加了網路的維度,並且更多的引數更容易使網路的鞍點向下滑動以獲得更好的區域性最小值。
我們將DSD訓練方法應用於各種型別的神經網路和不同領域的資料集。 我們發現DSD訓練方法提高了所有這些神經網路的精確度。 神經網路選自CNN、RNN和LSTM;資料集是從影象分類、語音識別和影象描述領域中選擇的, 結果如圖5所示。DSD模型可以在DSD Model Zoo上下載。
圖 5. DSD訓練提高了預測精度
生成影象描述
我們把在影象描述任務中使用DSD訓練方法的效果做了視覺化(見圖6)。我們把DSD訓練方法應用於NeuralTalk中,NeuralTalk是一個用於生成影象自然語言描述的長短時記憶模型(LSTM)。基準模型不能很好的描述圖片1、4和5。例如圖片1,基準模型將女孩錯誤地描述為男孩,並且把女孩的頭髮錯誤地描述為巖牆。稀疏模型可以在圖片中識別出有一個女孩,而DSD模型可以進一步識別出鞦韆。
在第二張圖片中,DSD訓練方法可以識別出運動員正在嘗試投籃,而基準模型只能描述成運動員正在打球。值得注意的是稀疏模型有時比DSD 模型表現得更好。在最後一張圖片中,稀疏模型能夠正確地識別出泥潭,而DSD模型只能從背景中識別出森林。DSD訓練方法的優良效能不僅限於這些例子,此論文的附錄中提供了更多的由DSD訓練方法生成的影象描述結果。
圖6. DSD訓練方法提高影象描述的效能的視覺化展現
稀疏模型的優點
用於把深度神經網路壓縮為較小模型的深度壓縮和用於神經網路正則化的DSD訓練方法都是利用模型稀疏性來實現更小的模型或者更高的預測精度的技術。除了模型大小和預測精度,我們還研究了可以利用稀疏性的其他兩個方面:速度和能耗,這超出了本文的討論範圍。讀者可以檢視EIE論文作為進一步的參考。
Song Han
Song Han是史丹佛大學Bill Dally教授的5年級博士生。他專注於機器學習和計算機體系架構的交叉領域的節能深度學習。Song提出的深度壓縮技術可以將最先進的卷積神經網路模型的大小壓縮10倍到49倍,也可以把SqueezeNet壓縮到只有470KB,這使得模型完全可用於片上SRAM上。他提出的DSD訓練流程提高了很多神經網路的預測精度。他設計的EIE(高效推理引擎)是在壓縮的稀疏神經網路模型上直接推理的硬體架構體系,這種引擎比GPU的速度提高了13倍而能耗降低了3000倍。他的工作已經在TheNextPlatform、TechEmergence、Embedded Vision和O'Reilly上發表。並且他的論文獲得了ICLR’16的最佳論文獎。
相關文章
- 深度神經網路(DNN)的正則化神經網路DNN
- 深度神經網路的壓縮與加速神經網路
- 當前深度神經網路模型壓縮和加速都有哪些方法?神經網路模型
- 神經網路最佳化篇:詳解正則化(Regularization)神經網路
- 模型壓縮:識別感知的深度神經網路通道裁剪 | 論文分享模型神經網路
- 《神經網路和深度學習》系列文章二十五:過擬合與正則化(2)神經網路深度學習
- 如何優化深度神經網路?優化神經網路
- 神經網路和深度學習神經網路深度學習
- FSNet:利用卷積核概要進行深度卷積神經網路的壓縮卷積神經網路
- 綜述論文:當前深度神經網路模型壓縮和加速方法速覽神經網路模型
- 神經網路損失函式中的正則化項L1和L2神經網路函式
- 【深度學習篇】--神經網路中的卷積神經網路深度學習神經網路卷積
- 讓機器“刪繁就簡”:深度神經網路加速與壓縮神經網路
- 神經網路和深度學習(1):前言神經網路深度學習
- 騰訊AI Lab參與提出EAD:基於彈性網路正則化的深度神經網路對抗樣本攻擊AI神經網路
- 吳恩達《優化深度神經網路》課程筆記(3)– 超引數除錯、Batch正則化和程式設計框架吳恩達優化神經網路筆記除錯BAT程式設計框架
- 白話深度神經網路神經網路
- 吳恩達《最佳化深度神經網路》課程筆記(3)– 超引數除錯、Batch正則化和程式設計框架吳恩達神經網路筆記除錯BAT程式設計框架
- 《神經網路和深度學習》系列文章三十八:深度神經網路為何很難訓練?神經網路深度學習
- 神經網路和深度學習簡史(全)神經網路深度學習
- 深入研究神經網路和深度學習神經網路深度學習
- 神經網路和深度學習簡史(一)神經網路深度學習
- 利用進化方法自動生成神經網路:深度進化網路DENSER神經網路
- 深度剖析卷積神經網路卷積神經網路
- 《神經網路和深度學習》系列文章三十:如何選擇神經網路的超引數神經網路深度學習
- 【深度學習篇】--神經網路中的池化層和CNN架構模型深度學習神經網路CNN架構模型
- 【深度學習】神經網路入門深度學習神經網路
- 再聊神經網路與深度學習神經網路深度學習
- 深度學習與圖神經網路深度學習神經網路
- AI之(神經網路+深度學習)AI神經網路深度學習
- 如何用Python和深度神經網路識別影象?Python神經網路
- 4種除錯深度神經網路的方法除錯神經網路
- 神經網路初始化神經網路
- 《神經網路和深度學習》系列文章七:實現我們的神經網路來分類數字神經網路深度學習
- 深度學習——正則化深度學習
- 【人工神經網路基礎】為什麼神經網路選擇了“深度”?神經網路
- 寫給人類的機器學習四、神經網路和深度學習機器學習神經網路深度學習
- Nginx網路壓縮 CSS壓縮 圖片壓縮 JSON壓縮NginxCSSJSON