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