① 模型壓縮簡述
如今學術界新提出的神經網路模型越來越大,而在實際應用中很多模型都要被部屬在移動端。移動端的存儲空間以及算力都有限,無法運行太大的模型,所以模型壓縮這個概念就應運而生。本文簡單介紹一下在演算法(軟體)層面的模型壓縮方法和paper,不涉及硬體上的技巧。內容大多來自2020年李宏毅老師的課程。
目前在演算法層面模型壓縮主要有四個流派,簡介如下:
剪枝思想加入神經網路中。將網路中不重要的weight和neuron(網路中每層的層數)刪除。
傳說中的知識蒸餾。利用已經訓練好的大模型來指導小模型。主要用在分類任務上。
從數據存儲角度節省空間,將存儲參數的浮點數壓縮為更小的單位,用更少的位來表示值。
調整結構/使用特殊的結構來節省參數,後面再詳細介紹。
前面提到了刪除不重要的weight和neuron。對於權重來說,他的范數(比如L1或L2)大小可以看出重要程度:范數太小,不重要。對於神經元,不同輸入下的輸出是0的頻率可以看出重要程度:經常輸出0,不重要。刪完之後,對新的模型進行fine-tune。這是剪枝最基礎的思路,具體每層剪幾個,低於多少要剪掉不同paper有提出不同演算法。注意可以迭代多次刪除,不要一次刪除太多。在實踐中,刪除神經元的方式更容易被執行計算。
下面兩張圖是對於剪枝降低了參數的示意圖:
至於為什麼不直接訓練小的模型,因為大的網路容易訓練,小的網路容易陷入局部最優,所以就把大網路裁剪成小網路而不是直接訓練小網路。
當然可以剪枝的部分不限於weight和neuron,對於剪枝完之後模型的處理方法也有新的發現。下面給出相關的paper list:
Pruning Filters for Efficient ConvNets(ICLR 2017)
Learning Efficient Convolutional Networks Through Network Slimming(ICCV2017)
Filter Pruning via Geometric Median for Deep Convolutional Neural Networks Acceleration(CVPR2019)
The Lottery Ticket Hypothesis:Finding Sparse,Trainable Neural Networks(ICLR2019)
Rethinking the value of network pruning(ICLR2019)
Deconstructing Lottery Tickets:Zeros,Signs,and the Supermask(ICML2019)
通過已訓練好的teacher模型訓練student模型,指導/學習的過程在這里被抽象為蒸餾(distillation)。可以蒸餾模型的輸出,直接匹配logits,或者蒸餾模型中間輸出的特徵feature,直接匹配feature或者學習feature如何轉換 。
先說最經典的,對logits的蒸餾。結構如下圖:
至於為什麼要在softmax前除T,paper給的解釋是讓softmax的輸出更平滑(意為輸入更加類似soft target,而不是one-hot那樣的hard target)。知識蒸餾還有一個有趣的點就是讓小的模型還學會了不同輸出label間的關系,比如在mnist模型可以學會label1和7很相似。
對於logits distillation的研究還有Deep Mutual Learning,Born Again Neural Networks,Improved Knowledge Distiilation via Teacher Assistant等研究,在下面的paperlist也有列出。
接下來簡單介紹feature distillation。
類似的研究還有Similarity-Preserving Knowledge Distiilation,下面是paper list:
Distilling the knowledge in a Neural Network(NIPS2014)
Deep Mutual Learning(CVPR2018)
Born Again Neural Networks(ICML2018)
Improved Knowledge Distiilation via Teacher Assistant(AAAI2020)
Paying More Attention to Attention:Improving the Performance of Convolutional Neural Networks via Attention Transfer(ICLR2017)
Relational Knowledge Distiilation(CVPR2019)
Similarity-Preserving Knowledge Distiilation(ICCV2019)
可以用的方法有權重聚類,如下圖:
也可以用一些經典的方法比如哈夫曼編碼。
還有一種方法是使權重全都是+1或-1:
調整結構來節省參數的圖示如下:
對於卷積結構也類似,傳統的卷積結構需要3x3x2x4=72個參數,而以下結構只需要18+8=26個:
著名的模型有SqueezeNet,MobileNet,ShuffleNet,Xception。
② 知識蒸餾綜述:網路結構搜索應用
【GiantPandaCV導語】知識蒸餾將教師網路中的知識遷移到學生網路,而NAS中天然的存在大量的網路,使用KD有助於提升超網整體性能。兩者結合出現了許多工作,本文收集了部分代表性工作,並進行總結。
知識蒸餾可以看做教師網路通過提供soft label的方式將知識傳遞到學生網路中,可以被視為一種更高級的label smooth方法。soft label與hard label相比具有以下優點:
那麼知識蒸餾在網路結構搜索中有什麼作用呢?總結如下:
知識蒸餾在很多工作中作為訓練技巧來使用,比如OFA中使用漸進收縮訓練策略,使用最大的網路指導小網路的學習,採用inplace distillation進行蒸餾。BigNAS中則使用三明治法則,讓最大的網路指導剩下網路的蒸餾。
目標:解決教師網路和學生網路的匹配問題(知識蒸餾中教師網路和學生網路匹配的情況下效果更好)。
在知識蒸餾中,選擇不同的教師網路、不同的學生網路的情況下,最終學生網路的性能千差萬別。如果學生網路和教師網路的容量相差過多,會導致學生難以學習的情況。Cream這篇文章就是為了解決兩者匹配問題。
普通的SPOS方法如左圖所示,通過采樣單路徑子網路進行訓練。右圖則是結合了知識蒸餾的方法,Cream提出了兩個模塊:
Cream中心思想是,子網路可以在整個訓練過程中協作學習並相互教導,目的是提高單個模型的收斂性。
消融實驗如下:
目標:通過教師引導各個block特徵層的學習,根據loss大小評判各子網的性能。
這是一篇將NAS和KD融合的非常深的一個工作,被CVPR20接收。之前寫過一篇文章進行講解,這里簡單回顧一下。
DNA是兩階段的one-shot NAS方法,因此其引入蒸餾也是為了取代普通的acc指標,提出了使用子網路與教師網路接近程度作為衡量子網性能的指標。
在訓練的過程中,進行了分塊蒸餾,學生網路某一層的輸入來自教師網路上一層的輸出,並強制學生網路這一層的輸出與教師網路輸出一致(使用MSELoss)。在搜索過程結束後,通過計算各子網路與教師網路的接近程度來衡量子網路。
目標:通過改進KL divergence防止學生over estimate或者under estimate教師網路。
上圖展示了OFA,BigNAS等搜索演算法中常用到的蒸餾方法,子網使用的是KL divergence進行衡量,文中分析了KL 散度存在的局限性:即避零性以及零強制性。如下公式所示,p是教師的邏輯層輸出,q是學生邏輯層輸出。
AlphaNet提出了一個新的散度衡量損失函數,防止出現過估計或者低估的問題。如下所示,引入了 。
其中 不為0或者1,這樣如下圖所示:
藍色線對應example 2表示,當 為負值,如果q過估計了p中的不確定性, 的值會變大。
紫色線對應example 1表示,當 為正數,如果q低估了p中的不確定性, 的值會變大
同時考慮兩種情況,取兩者中最大值作為散度:
目標:提出了衡量學生網路和教師網路 內部激活相似度 衡量指標,通過表徵匹配可以用來加速網路結構搜索。
這部分其實是屬於知識蒸餾分類中基於關系的知識,構建的知識由不同樣本之間的互作用構成。
具體的指標構成如上圖所示,是一個bsxbs大小的矩陣,這個在文中被稱為Representational Dissmilarity Matrix,其功能是構建了激活層內部的表徵,可以通過評估RDM的相似度通過計算上三角矩陣的關系系數,比如皮爾遜系數。
該文章實際上也是構建了一個指標P+TG來衡量子網的性能,挑選出最優子網路。
如上圖所示,RDM的計算是通過衡量教師網路的feature以及學生網路的feature的相似度,並選擇選取其中最高的RDM相似度。通過構建了一組指標,隨著epoch的進行,排序一致性很快就可以提高。
目標:固定教師網路,搜索最合適的學生網路。
對於相同的教師網路來說,不同的架構的學生網路,即便具有相同的flops或者參數,其泛化能力也有所區別。在這個工作中選擇固定教師網路,通過網路搜索的方法找到最優的學生網路,使用L1 Norm優化基礎上,選擇出與教師網路KL散度差距最小的學生網路。
目標:在給定教師網路情況下,搜索最合適的學生網路。
神經網路中的知識不僅蘊含於參數,還受到網路結構影響。KD普遍方法是將教師網路知識提煉到學生網路中,本文提出了一種架構感知的知識蒸餾方法Architecture-Aware KD (AKD),能夠找到最合適提煉給特定教師模型的學生網路。
Motivation: 先做了一組實驗,發現不同的教師網路會傾向於不同的學生網路,因此在NAS中,使用不同的教師網路會導致模型傾向於選擇不同的網路結構。
AKD做法是選擇使用強化學習的方法指導搜索過程, 使用的是ENAS那種通過RNN采樣的方法。
目標:從集成的教師網路中學習,並使用NAS調整學生網路模型的容量。NAS+KD+集成。
這篇文章之前也進行了講解,是網路結構搜索,知識蒸餾,模型集成的大雜燴。
詳見: https://blog.csdn.net/DD_PP_JJ/article/details/121268840
這篇文章比較有意思,使用上一步中得到的多個子網路進行集成,可以得到教師網路,然後使用知識蒸餾的方法來引導新的子網路的學習。關注重點在於:
AdaNAS受Born Again Network(BAN)啟發, 提出Adaptive Knowledge Distillation(AKD)的方法以輔助子網路的訓練。
集成模型選擇 :
從左到右代表四次迭代,每個迭代中從搜索空間中選擇三個模型。綠色線框出的模型代表每個迭代中最優的模型,AdaNAS選擇將每個迭代中最優subnet作為集成的對象。
最終集成的時候還添加了額外的weight參數w1-w4:
最終輸出邏輯層如下所示:(這個w權重也會被訓練,此時各個集成網路的權重是固定的,只優化w)
Knowledge Distillation
目標:解決知識蒸餾的效率和有效性,通過使用特徵聚合來引導教師網路與學生網路的學習,網路結構搜索則是體現在特徵聚合的過程,使用了類似darts的方法進行自適應調整放縮系數。ECCV20
文章總結了幾種蒸餾範式:
最後一種是本文提出的方法,普通的特徵蒸餾都是每個block的最後feature map進行互相蒸餾,本文認為可以讓教師網路的整個block都引導學生網路。
具體如何將教師網路整個block中所有feature map進行聚合,本文使用的是darts的方法進行動態聚合信息。(a) 圖展示的是對group i進行的可微分搜索過程。(b)表示從教師到學生的路徑loss構建,使用的是CE loss。(c)表示從學生到教師網路的路徑loss構建,使用的是L2 Loss。其中connector實際上是一個1x1 卷積層。
(ps: connector讓人想到VID這個工作)