Network Slimming——有效的通道剪枝方法(Channel Pruning)

"Learning Efficient Convolutional Networks through Network Slimming"這篇文章提出了一種有效的結構性剪枝方法,即規整的通道剪枝策略:在訓練期間,通過對網絡BN層的gamma係數施加L1正則約束,使得模型朝着結構性稀疏的方向調整參數。此時BN層的Gamma係數所起的作用,類似於信息流通道的開關係數,控制着信息流通道的開關閉合。完成稀疏訓練或者正則化之後,便可以按照既定的壓縮比(或剪枝率)裁剪模型,能夠生成低存儲佔用的精簡模型、並提升一定的加速比。該方法與其他模型壓縮方法(量化、低秩分解)結合使用,可以進一步提高壓縮比;與其他優化加速方法(TensorRT等)結合使用,可以提升推理速度;若推理精度損失過大,也可以結合知識蒸餾,有效恢復損失的精度。

上圖(圖1、圖2)顯示了Network Slimming的基本流程,屬於典型的迭代式過程(包含sparse-training、fine-tuning)。在channel-level實施的規整剪枝操作,能夠沿輸出通道維度裁剪當前層的3D filters,並沿輸入通道維度裁剪下一層的2D kernels。最終所生成的精簡模型能夠直接運行在成熟框架(Pytorch、MXnet或TensorFlow等)或硬件平臺上(GPU、FPGA等),無需特殊算法庫的支持。另外,在正則化期間,BN層Gamma係數的分佈經自動調整、稀疏化之後,有助於網絡結構的優化探索,即Network Slimming屬於自動剪枝策略。

Network Slimming的total loss設計如下:

在total loss中,除了基本的loss之外,引入了BN層Gamma係數的L1正則約束項,目的是爲了誘導BN層的稀疏化。其中L1約束函數g( ) 僅施加於BN層的Gamma係數,因此在反向傳播更新梯度時,Gamma係數的導數需要加上 [Gamma係數符號與懲罰係數的乘積項]。L1正則化的Pytorch代碼如下:

# additional subgradient descent on the sparsity-induced penalty term
def updateBN(model):
    for n, m in model.named_modules():
        if isinstance(m, nn.BatchNorm2d):
            m.weight.grad.data.add_(args.s*torch.sign(m.weight.data))  # L1

需要注意的是:稀疏化可以通過裸訓+L1正則化獲得,但需要較長的訓練週期;也可以通過fine-tuning+L1正則化獲得,此時微調本質是使BN層Gamma係數稀疏化、且儘量不破壞kernel weights的分佈,因此微調學習率不應過大、而懲罰係數相對較大,例如initial lr=0.001、lambda=0.001。

針對Resnet等包含BN層的CNN網絡,Network Slimming方法在Cifar10、ImageNet2012等數據集上均獲得了良好的壓縮效果。但是冗餘參數主要分佈在網絡的深層次,因此當壓縮比爲2倍時,實際加速比通常要小於2。當裁剪後精度損失嚴重時,該方法可以與知識蒸餾結合使用,通過原複雜模型的誘導訓練能夠恢復一定的精度。

論文地址:https://arxiv.org/abs/1708.06519

GitHub地址:https://github.com/foolwood/pytorch-slimming

-------- 知識蒸餾相關的討論可參考:

https://blog.csdn.net/nature553863/article/details/80568658

-------- 模型壓縮方面,更爲詳細的討論,請參考:

https://blog.csdn.net/nature553863/article/details/81083955

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章