輕量級網(wǎng)絡如MobileNet還適合繼續(xù)剪枝操作,進一步壓縮模型嗎?
來源丨h(huán)ttps://www.zhihu.com/question/343562568/answer/2514880247編輯丨極市平臺 導讀
分享一篇ICML2022文章,關(guān)于實現(xiàn)硬件友好方式壓縮網(wǎng)絡的新范式,其能在基于MobileNetV2的網(wǎng)絡上進行剪枝,且在移動端/邊緣端Google Pixel 3/Raspberry Pi 4的性能超過通道和層剪枝SOTA方法。
分享一篇ICML2022文章,關(guān)于實現(xiàn)硬件友好方式壓縮網(wǎng)絡的新范式,其能在基于MobileNetV2的網(wǎng)絡上進行剪枝,且在移動端/邊緣端Google Pixel 3/Raspberry Pi 4的性能超過通道和層剪枝SOTA方法。由萊斯大學&Meta提出的《DepthShrinker:一種面向增強實際硬件效率的緊湊型神經(jīng)網(wǎng)絡的新的壓縮范式》。
文章鏈接: https://arxiv.org/abs/2206.00843
項目鏈接: https://github.com/RICEEIC/DepthShrinker
高效的深層神經(jīng)網(wǎng)絡(DNN)模型配備緊湊型算子(例如深度卷積),降低DNN的理論復雜度(例如總的權(quán)重/計算量),同時保持較好的模型準確度。然而,現(xiàn)有高效的DNN在實現(xiàn)其承諾提高實際硬件效率方面是有限的,由于其常用的緊致算子的硬件利用率低。在這項工作中,我們提出一種新的壓縮范式,用于開發(fā)真正的硬件高效DNN,從而在保持模型準確性的同時提高硬件效率。有趣的是,我們觀察到一些DNN層的激活函數(shù)有助于DNN的訓練優(yōu)化和提升準確度,可以在不影響模型準確度的情況下,在訓練后以適當?shù)姆绞饺コ?。受此啟發(fā),我們提出了DepthShrinker,開發(fā)硬件友好型緊致網(wǎng)絡,通過將具有不規(guī)則計算模式的現(xiàn)有高效DNN的基本構(gòu)建塊收縮為密集的,從而實現(xiàn)網(wǎng)絡的緊致化,硬件利用率大大提高,從而實現(xiàn)真正的硬件效率。令人興奮的是, 我們的DepthShrinker框架實現(xiàn)了硬件友好緊湊型網(wǎng)絡,超過現(xiàn)有SOTA高效DNN和壓縮方法,例如,準確度提高3.06%,在Tesla V100實現(xiàn)1.53× 現(xiàn)有逐通道剪枝方法MetaPruning的吞吐量。
以下為文章詳細解讀:
1 文章提出的的深度收縮框架1.1 概述關(guān)鍵理念。 DepthShrinker旨在開發(fā)真正的硬件 高效的DNN,通過刪除冗余激活功能,然后合并連續(xù)線性操作。關(guān)鍵理念是通過刪除帶有兩個激活函數(shù)的反向殘差塊(Sandler等人2018),即大部分高效DNN的基本構(gòu)建塊,整個塊合并成一個密集的卷積層,卷積核大小與原始塊的深度卷積相同,輸入/輸出通道數(shù)與原始塊相同。
框架概述。 為了實現(xiàn)上述目標,存在兩個重要的挑戰(zhàn):哪些激活函數(shù)需要去除,如何在剩余激活函數(shù)較少的情況下恢復準確度。為了解決這些問題, 建立在現(xiàn)有SOTA高效DNN之上的深度收縮器集成了三個階段的工作,如圖2所示:(1)識別冗余激活函數(shù),(2)去除已識別的激活函數(shù)并微調(diào)階段(1)生成的DNN和(3)合并在前一階段刪除激活函數(shù)后的網(wǎng)絡,以得到最終的網(wǎng)絡。請注意,我們在公開可用的預訓練模型之上應用DepthShrinker,以下為常見模型壓縮方法(He等人2018;Wen等人2016年;Han等人2015;Jacob等人2018)。
圖2 DepthShrinker三個階段設計的整體框架。
1.2 階段1:識別冗余激活函數(shù)為了識別不重要的激活函數(shù),預定義的標準如分層修剪(Li等人2016;Wen 等人2016)對于不同層耦合的激活函數(shù)是不合適的, 比如去除前面層的激活函數(shù)可能會更改后面層的特征分布。因此,我們提出了一種可微搜索方法來了解所有激活函數(shù)的重要性,通過考慮其聯(lián)合影響而實現(xiàn),靈感來自最近的剪枝工作(Kang&Han2020;Ramanujan等人2020; Fu等人2021)。
搜索方法概述。 我們的搜索方法指定可學習掩碼(N是激活函數(shù)的總數(shù))到所有激活函數(shù),其用作激活函數(shù)代理的重要性得分。在搜索過程中更新m時,應考慮不同激活函數(shù)的耦合情況,同時確保m的稀疏性足夠高,例如應高于 (1 ? k/N),其中k是剩余激活函數(shù)的數(shù)量,以滿足合并后階段的目標效率(見第1.4節(jié))。在DepthShrinker中,搜索方法聯(lián)合學習掩碼m和模型權(quán)重θ。
搜索方法表示。 推導最佳θ和m本質(zhì)上是一個雙層優(yōu)化問題(Liu等人2018)。在DepthShrinker中,我們將其近似為一級優(yōu)化方式(Xie等人2018;Hu等人2020;Bi等人2020年)共同更新θ和m:
其中|是損失函數(shù), 和 是第 i個輸入和標簽對, (這里是y尖號) 是在參數(shù) 和激 活掩碼 下的預測標簽。為了達到目標稀疏性 , 我們通過在正向過程中僅激活 的前 個元素來對 m施加 約束。具體而言, 我們采用二進制掩碼 (這里是m尖號)使用元素1和 0 來 近似前 個元素, 否則直接進行前向, 而m中的所有元素都是通過直通更新估計,Bengio等人2013 年)進行更新。特別地, 前向函數(shù)可以表示為:
其中 (這里是m尖號) 是第一個1層的網(wǎng)絡函數(shù),?是函數(shù)合成的運算符, 是激活函數(shù), 是一個變換(例如卷積或其他線性操作), 其由 參數(shù)化。等式 (2) 中的二進制掩碼使得第I層 中的激活函數(shù)完全啟用或禁用。在反向傳播過程中, 我們直接傳遞二進制掩碼的梯度 (這里是m 尖號)至 , 即 (這里是m尖號)。因為只有對應于掩碼 的前 個值的激活函數(shù)參與前
搜索方法實現(xiàn)。 我們的搜索方法進行兩種設置:(1)塊收縮和(2)m的延遲感知衰減。對于前者,由于我們的目標是將整個反向殘差塊合并為一個密集卷積,我們共享對應于一個塊中的兩個激活函數(shù)的掩碼值m,即刪除或保留兩個激活功能。對于后者,我們對m的每個元素額外增加衰減,其通過相應成本塊的權(quán)重來進行加權(quán)。在這項工作中,我們直接采用搜索過程中在RTX 2080Ti GPU上預先測量的延遲,使其對于平臺感知,以增強更長搜索時間的效率。
1.3 階段2:如何微調(diào)在上述搜索過程之后,具有最不重要m的激活函數(shù)被去除,并進行微調(diào)以恢復精度。
自由額外添加激活函數(shù)。 密集卷積后沒有了激活函數(shù),是因為反向殘余塊(Sandler等人2018)僅包含兩個激活函數(shù)。為了提高所達到的準確度,我們在每次合并后,在每個密集卷積后額外添加一個激活函數(shù)(本工作中使用ReLU6),其硬件成本可以忽略不計。
自蒸餾。 在DepthShrinker中,我們在微調(diào)期間啟用自蒸餾機制,即在原始網(wǎng)絡的激活函數(shù)指導下進行知識蒸餾(Hinton等人2015),以進一步提高生成網(wǎng)絡的準確度。需要注意的是,我們僅將原始網(wǎng)絡作為教師網(wǎng)絡,沒有引入額外的模型。
1.4 階段3:如何合并微調(diào)移除不重要的激活函數(shù)后的網(wǎng)絡,最后一步是合并相鄰的線性操作(例如卷積/全連接, 平均池化或BN層)。
合并兩個相鄰層。 在不喪失一般性的情況下, 這里我們考慮兩個相鄰的卷積層, 輸入特征 , 中間特征 , 輸出特征 , 以及第一層和 第二層的卷積核權(quán)重為 和 被移除, 并假定:
上述兩層可合并為一層。假設層 和 的步長均為 1 , 我們得到:
其中 和
其中 是大小為 的合并核。請注意, 如果層 和 的步長大于1, 則卷積核仍然可 以合并為一個步長為 、核大小為 的卷積 核。
合并反轉(zhuǎn)殘差塊。 從上面的分析可以看出,當連續(xù)的卷積層合并到一個卷積層時,產(chǎn)生的卷積層的輸入輸出通道僅由第一卷積層中的輸入通道數(shù)量和最后一個卷積層中的輸出通道數(shù)量決定,而不需要考慮中間層結(jié)構(gòu)。結(jié)果是,反向殘差塊的設計規(guī)則(Sandler等人2018),即三個卷積層的通道數(shù)先擴展后減少,自然有利于我們的深度收縮器。我們相信該方法由于未來的硬件高效DNN設計。
1.5 DepthShrinker:展開然后收縮上述DepthShrinker的常規(guī)設計為,即利用不重要的激活功能可在訓練后適當去除,不會損害推理準確度。令人興奮的是,這種方式也可以用來改進DNN訓練。具體而言,我們建議通過對給定DNN先擴展后收縮策略進行訓練,則將其命名為DepthShrinker。在深度收縮訓練中,我們首先(1)將一個或一些卷積層展開為反轉(zhuǎn)殘差塊,由于在擴展模型中增加了過參數(shù)化,則有利于訓練優(yōu)化,(2)訓練擴展的DNN,然后(3)應用DepthShrinker合并上述新引入的塊,用于恢復原始網(wǎng)絡結(jié)構(gòu)。該訓練計劃可以被視為用于增強原始DNN的復雜度,有利于其訓練優(yōu)化,從而得到可實現(xiàn)的準確性,同時推理效率保持不變。
2 實驗2.1 網(wǎng)絡和數(shù)據(jù)集我們將DepthShrinker應用于MobileNetV2(Howard等人2017)和EfficientNet-Lite(Google2020),即EfficientNet的硬件高效變體(Tan&Le 2019)系列,在ImageNet數(shù)據(jù)集之上(Russakovsky等人2015)進行實驗。
2.2 和SOTA剪枝方法的基線對比和通道剪枝方法基線對比結(jié)果如表2和表3所示。
表2 DepthShrinker與SOTA通道剪枝方法MetaPruning對比結(jié)果。
表3 DepthShrinker與SOTA通道剪枝方法AMC對比結(jié)果。
和層剪枝基線對比結(jié)果如圖3所示。
圖3 DepthShrinker與SOTA層剪枝方法基線對比結(jié)果。
合并前后塊的延遲可視化結(jié)果如圖4所示,內(nèi)存可視化如圖5所示。
圖4 MobileNetV2-1.4合并前(實線)/后(虛線)的延遲可視化。
圖5 內(nèi)存可視化。
2.3 和SOTA高效DNN方法基線對比和高效DNN方法對比如圖6所示。
圖6 與高效DNN方法對比結(jié)果。
2.4 消融實驗預訓練和額外添加激活函數(shù)貢獻如表4所示。
表4 預訓練和額外添加激活函數(shù)貢獻結(jié)果。
隨機搜索比較如表2和表3所示。
CPU設備(實驗使用Google Pixel3和Raspberry Pi 4) 上的實驗結(jié)果如表5所示。
表5 CPU設備Google Pixel 3和Raspberry Pi 4的測試結(jié)果。
DepthShrinker評估結(jié)果如表6所示。
表6 DepthShrinker評估結(jié)果。
本文僅做學術(shù)分享,如有侵權(quán),請聯(lián)系刪文。
*博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權(quán)請聯(lián)系工作人員刪除。