封面:thisisengineering raeng on unsplash
本文是對**「to prune, or not to prune: exploring the efficacy ofpruning for model compression」的摘抄。
在這裡可以找到**原文。
背景對於資源有限的移動終端裝置來說,內容頻寬通常是乙個重要的限制因素。模型壓縮至少有兩點好處:減少耗電的記憶體訪問次數;同等頻寬下提公升壓縮模型引數的獲取效率。剪枝將不重要的模型權重歸零,實現了模型壓縮的同時只帶來了較小的質量損失。剪枝之後的模型是稀疏的,在支援稀疏矩陣加速運算的硬體上可以進一步獲得加速效果。
在模型記憶體足跡(memory footprint)一定的前提下,如何獲得最準確的模型,是本文的核心內容。作者通過對比兩種模型來回答這個問題。第一種,先訓練乙個大模型,然後通過剪枝將其轉換為乙個強稀疏模型;第二種,直接訓練乙個非稀疏模型,尺寸與稀疏模型相當。在具體的模型架構與任務上,作者做出以下選擇:
相關工作
90年代的剪枝通過將權重置零時網路損失函式增量的二階泰勒級數近似來實現。最近的工作中,基於數量級的權重剪枝開始流行。這種方式簡單易行,並且適用於大型網路與資料集。本文通過剪去最小數量級的權重來控制模型稀疏程度。這種策略不需要人工選擇權重閾值,不僅適用於cnn也可以用於lstm。
方案作者在tensorflow的基礎上實現了訓練中剪枝。針對每乙個選定的layer,增加同尺寸同形狀的二元mask變數作為該layer的權重張量,並決定在哪個權重引數參與網路的前向傳播。同時,在訓練圖中注入運算元對該層的權重按照絕對值大小排序,將最小的權重置零直到該層的稀疏程度達到預定指標。反向傳播的梯度同樣會經過該二元mask,但是不會更新被置零的權重。
稀疏程度隨著訓練的程序逐漸增加,並滿足公式:
其中si為初始稀疏率,sf為最終稀疏率,n為修剪總步數,t為訓練步數,δt為修剪頻率。
二元mask每δt更新一次,這有助於網路的準確率從修剪後的狀態逐步恢復。作者的實驗表明當δt的取值在100到1000之間時剪枝對最終的模型質量影響可以忽略。一旦模型達到預定的稀疏指標,權重mask停止更新。按照稀疏率變化公式,訓練早期頻繁剪枝,隨著訓練進展,剪枝的頻率越來越低——因為可供剪枝的權重越來越少。如下圖所示。
實際剪枝過程中,網路會先訓練若干epoch或者載入乙個已經訓練好的網路,這就決定了t0。引數n則很大程度上取決於學習率曲線。作者觀察到隨著學習率的下降,剪枝後的模型準確率可能會很難恢復過來。反過來,過高的學習率則可能導致權重在收斂到較優值之前被剪掉。因此需要將兩者緊密結合起來。例如上圖中,對inception v3剪枝的過程安排在學習率相對較大的階段。
下圖則展示了訓練過程中模型準確率的變化。對於稀疏率達87.5%的模型,隨著稀疏程度的上公升,模型經歷了「幾乎災難性」的衰退,但是隨後又很快恢復了過來。這種現象在高稀疏率的模型中更加常見。
下表展示了稀疏程度與模型準確率之間的關係。隨著稀疏程度的增加,模型的準確率開始下降。不過即便有一半的權重被裁剪,模型的準確率也只下降了一點。
比 較「大稀疏」與
「小密實」模型
對於緊湊模型來說剪枝仍然是有效的,可以與width multiplier相比。同等大小的模型,稀疏模型優於非稀疏模型。訓練也很簡單,只是初始學習率小10倍。
這一章節的模型都為常見模型,且資料較多,因此只說結論。感興趣的讀者可以查閱原文。另外兩個子章節涉及模型與影象無關,故此跳過。
討論稀疏模型的記憶體足跡包括非零引數的儲存以及索引它們所需的資料結構。模型剪枝可以減少非零引數之間的連線數,但是稀疏矩陣的儲存不可避免的減小了壓縮率。無論權重是否為0,二元mask稀疏矩陣都需要為之儲存1bit,同時還需要乙個向量儲存非0值。無論稀疏率的大小,這部分開銷無法避免。
另外,大稀疏模型比同體積非稀疏模型的表現更好。而且隨著模型規模的擴大,這種差異越發明顯。
總結經過剪枝之後的稀疏大模型要優於同體積的非稀疏模型。作者提出的遞進剪枝策略可以廣泛的應用於各種模型。有限資源環境下,剪枝是有效的模型壓縮策略。深度學習加速硬體應當將稀疏矩陣的儲存與運算提供支援。
tensorflow支援剪枝,請參閱官方文件:
針對hrnet的剪枝可能會晚一點。因為目前剪枝不支援 subclassed model。參見issue:
後剪枝之悲觀剪枝法
把一顆子樹 具有多個葉子節點 的分類用乙個葉子節點來替代的話,在訓練集上的誤判率肯定是上公升的,但是在新資料上不一定。於是我們需要把子樹的誤判計算加上乙個經驗性的懲罰因子。對於一顆葉子節點,它覆蓋了n個樣本,其中有e個錯誤,那麼該葉子節點的錯誤率為 e 0.5 n。這個0.5就是懲罰因子,那麼一顆子...
模型壓縮 剪枝
這篇文章是對自己關於模型壓縮進行學習的總結與歸納。在研究模型壓縮這一塊的內容這麼長時間,發現自己不夠深入,有些混亂,因此希望這篇文章可以讓自己的思路更加清晰。模型壓縮的方法中,包括剪枝,量化,多值網路,模型蒸餾等。其中剪枝的方法,應用的更多,此篇文章主要就說剪枝。剪枝最初是在決策樹學習演算法中,用於...
模型加速 關於模型加速的總結
模型加速的目標 a.increase inference speed 加快推理速度 應用層面 b.reduce model size 壓縮模型。關於模型的加速大致可以分為三個方面的加速 1 平台 支援層面 數 算 底層 2 訓練前 網路結構的設計 3 訓練後 在訓練好的模型上進行加速 因為模型加速包...