1. 程式人生 > >深度學習模型壓縮方法綜述(三)

深度學習模型壓縮方法綜述(三)

前言

在前兩章,我們介紹了一些在已有的深度學習模型的基礎上,直接對其進行壓縮的方法,包括核的稀疏化,和模型的裁剪兩個方面的內容,其中核的稀疏化可能需要一些稀疏計算庫的支援,其加速的效果可能受到頻寬、稀疏度等很多因素的制約;而模型的裁剪方法則比較簡單明瞭,直接在原有的模型上剔除掉不重要的filter,雖然這種壓縮方式比較粗糙,但是神經網路的自適應能力很強,加上大的模型往往冗餘比較多,將一些引數剔除之後,通過一些retraining的手段可以將由剔除引數而降低的效能恢復回來,因此只需要挑選一種合適的裁剪手段以及retraining方式,就能夠有效的在已有模型的基礎上對其進行很大程度的壓縮,是目前使用最普遍的方法。然而除了這兩種方法以外,本文還將為大家介紹另外兩種方法:基於教師——學生網路、以及精細模型設計的方法。

基於教師——學生網路的方法

基於教師——學生網路的方法,屬於遷移學習的一種。遷移學習也就是將一個模型的效能遷移到另一個模型上,而對於教師——學生網路,教師網路往往是一個更加複雜的網路,具有非常好的效能和泛化能力,可以用這個網路來作為一個soft target來指導另外一個更加簡單的學生網路來學習,使得更加簡單、引數運算量更少的學生模型也能夠具有和教師網路相近的效能,也算是一種模型壓縮的方式。

  • Distilling the Knowledge in a Neural Network 論文地址 
    較大、較複雜的網路雖然通常具有很好的效能,但是也存在很多的冗餘資訊,因此運算量以及資源的消耗都非常多。而所謂的Distilling就是將複雜網路中的有用資訊提取出來遷移到一個更小的網路上,這樣學習來的小網路可以具備和大的複雜網路想接近的效能效果,並且也大大的節省了計算資源。這個複雜的網路可以看成一個教師,而小的網路則可以看成是一個學生。 
    這裡寫圖片描述

     
    這個複雜的網路是提前訓練好具有很好效能的網路,學生網路的訓練含有兩個目標:一個是hard target,即原始的目標函式,為小模型的類別概率輸出與label真值的交叉熵;另一個為soft target,為小模型的類別概率輸出與大模型的類別概率輸出的交叉熵,在soft target中,概率輸出的公式調整如下,這樣當T值很大時,可以產生一個類別概率分佈較緩和的輸出: 
    這裡寫圖片描述 
    作者認為,由於soft target具有更高的熵,它能比hard target提供更加多的資訊,因此可以使用較少的資料以及較大的學習率。將hard和soft的target通過加權平均來作為學生網路的目標函式,soft target所佔的權重更大一些。 作者同時還指出,T值取一箇中間值時,效果更好,而soft target所分配的權重應該為T^2,hard target的權重為1。 這樣訓練得到的小模型也就具有與複雜模型近似的效能效果,但是複雜度和計算量卻要小很多。 
    對於distilling而言,複雜模型的作用事實上是為了提高label包含的資訊量。通過這種方法,可以把模型壓縮到一個非常小的規模。模型壓縮對模型的準確率沒有造成太大影響,而且還可以應付部分資訊缺失的情況。

  • Paying More Attention to Attention: Improving the Performance of Convolutional Neural Networks via Attention Transfer 論文地址 
    作者借鑑Distilling的思想,使用複雜網路中能夠提供視覺相關位置資訊的Attention map來監督小網路的學習,並且結合了低、中、高三個層次的特徵,示意圖如下: 
    這裡寫圖片描述
    教師網路從三個層次的Attention Transfer對學生網路進行監督。其中三個層次對應了ResNet中三組Residual Block的輸出。在其他網路中可以借鑑。 這三個層次的Attention Transfer基於Activation,Activation Attention為feature map在各個通道上的值求和,基於Activation的Attention Transfer的損失函式如下: 
    這裡寫圖片描述 
    其中Qs和Qt分別是學生網路和教師網路在不同層次的Activation向量,作者提出在這裡在這裡對Q進行標準化對於學生網路的訓練非常重要。 
    除了基於Activation的Attention Transfer,作者還提出了一種Gradient Attention,它的損失函式如下: 
    這裡寫圖片描述 
    但是就需要兩次反向傳播的過程,實現起來較困難並且效果提升不明顯。 基於Activation的Attention Transfer效果較好,而且可以和Hinton的Distilling結合。 
    目前已有基於Activation的實現原始碼:https://github.com/szagoruyko/attention-transfer

小結

教師學生網路的方法,利用一個性能較好的教師網路,在神經元的級別上,來監督學生網路的訓練,相當於提高了模型引數的利用率。其實可以這麼來理解,我們一般訓練一個神經網路就像是要爬一座山,你的target就是山頂的終點線,給了你一個目標,但是需要你自己去摸索如何找到通往終點的路,你就需要不斷學習不斷嘗試,假如你的體力有效,可能就難以達到目標;但是如果這個時候有一個經驗豐富的老司機,他以及達到過終點,那麼他就可以為你指明一條上山的路,或者在路上給你立很多路標,你就只要沿著路標上山就好了,這樣你也能夠很容易的到達山頂,這就是教師——學生網路的意義。

基於精細模型設計的方法

上述幾種方法都是在已有的效能較好模型的基礎上,在保證模型效能的前提下儘可能的降低模型的複雜度以及運算量。除此之外,還有很多工作將注意力放在更小、更高效、更精細的網路模組設計上,如SqueezeNet的fire module,ResNet的Residual module,GoogLenet的Inception Module,它們基本都是由很小的卷積(1*1和3*3)組成,不僅引數運算量小,同時還具備了很好的效能效果。

  • MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications 論文地址 
    這篇論文是Google針對手機等嵌入式裝置提出的一種輕量級的深層神經網路,取名為MobileNets。核心思想就是卷積核的巧妙分解,可以有效減少網路引數。所謂的卷積核分解,實際上就是將a × a × c分解成一個a × a × 1的卷積和一個1 ×1 × c的卷積,,其中a是卷積核大小,c是卷積核的通道數。其中第一個a × a × 1的卷積稱為Depthwise Separable Convolutions,它對前一層輸出的feature map的每一個channel單獨進行a × a 的卷積來提取空間特徵,然後再使用1 ×1 的卷積將多個通道的資訊線性組合起來,稱為Pointwise Convolutions,如下圖: 
    這裡寫圖片描述 
    這樣可以很大程度的壓縮計算量: 
    這裡寫圖片描述 
    其中DK為原始卷積核的大小,DF為輸入feature map的尺寸, 這樣相當於將運算量降低DK^2倍左右。 
    MobileNet中Depthwise實際上是通過卷積中的group來實現的,其實在後面也會發現,這些精細模型的設計都是和group有關。本文的原始碼:https://github.com/shicai/MobileNet-Caffe

  • Aggregated Residual Transformations for Deep Neural Networks 論文地址 
    作者提出,在傳統的ResNet的基礎上,以往的方法只往兩個方向進行研究,一個深度,一個寬度,但是深度加深,模型訓練難度更大,寬度加寬,模型複雜度更高,計算量更大,都在不同的程度上增加了資源的損耗,因此作者從一個新的維度:Cardinality(本文中應該為path的數量)來對模型進行考量,作者在ResNet的基礎上提出了一種新的結構,ResNeXt: 
    這裡寫圖片描述 
    上圖中兩種結構計算量相近,但是右邊結構的效能更勝一籌(Cardinality更大)。 
    這裡寫圖片描述
    以上三種結構等價,因此可以通過group的形式來實現ResNeXt。其實ResNeXt和mobilenet等結構性質很相近,都是通過group的操作,在維度相同時降低複雜度,或者在複雜度相同時增加維度,然後再通過1*1的卷積將所有通道的資訊再融合起來。因此全文看下來,作者的核心創新點就在於提出了 aggregrated transformations,用一種平行堆疊相同拓撲結構的blocks代替原來 ResNet 的三層卷積的block,在不明顯增加引數量級的情況下提升了模型的準確率,同時由於拓撲結構相同,超引數也減少了,便於模型移植。本文的原始碼:https://github.com/facebookresearch/ResNeXt

  • ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices 論文地址 
    作者提出,雖然MobileNet、ResNeXt等網路能夠大大的降低模型的複雜度,並且也能保持不錯的效能,但是1 ×1卷積的計算消耗還是比較大的,比如在ResNeXt中,一個模組中1 ×1卷積就佔據了93%的運算量,而在MobileNet中更是佔到了94.86%,因此作者希望在這個上面進一步降低計算量:即在1 ×1的卷積上也採用group的操作,但是本來1 ×1本來是為了整合所有通道的資訊,如果使用group的操作就無法達到這個效果,因此作者就想出了一種channel shuffle的方法,如下圖: 
    這裡寫圖片描述
    如上圖b和c,雖然對1 ×1的卷積使用了group的操作,但是在中間的feature map增加了一個channel shuffle的操作,這樣每個group都可以接受到上一層不同group的feature,這樣就可以很好的解決之前提到的問題,同時還降低了模型的計算量,ShuffleNet的模組如下: 
    這裡寫圖片描述 
    作者使用了不同的group數進行實驗,發現越小的模型,group數量越多效能越好。這是因為在模型大小一樣的情況下,group數量越多,feature map的channel數越多,對於小的模型,channel數量對於效能提升更加重要。 
    最後作者將shufflenet的方法和mobilenet的方法進行了比較,效能似乎更勝一籌: 
    這裡寫圖片描述

小結

本節的三篇論文都是對精細模型的設計方法,直接搭建出引數運算量小的模型,適用於嵌入式平臺,基本上都是通過group的方式來實現,確實能夠很大程度的將模型的計算量降到最低,尤其是最後一篇shufflenet,實際上利用了一個特徵融合的思路,在一個下模型中,分為更細的模型(group),再將這些更細的模型有效的融合起來,能夠充分的利用引數,而達到更好的壓縮效果。

結論

目前關於深度學習模型壓縮的方法有很多,本系列博文從四個角度來對模型壓縮的方法進行了介紹,總的來說,所列出的文章和方法都具有非常強的借鑑性,值得我們去學習,效果也較明顯。其中基於核稀疏化的方法,主要是在引數更新時增加額外的懲罰項,來誘導核的稀疏化,然後就可以利用裁剪或者稀疏矩陣的相關操作來實現模型的壓縮;基於模型裁剪的方法,主要是對已訓練好的網路進行壓縮,往往就是尋找一種更加有效的評價方式,將不重要的引數剔除,以達到模型壓縮的目的,這種壓縮方法實現簡單,尤其是regular的方式,裁剪效率最高,但是如何尋找一個最有效的評價方式是最重要的。基於遷移學習的方法,利用一個性能好的教師網路來監督學生網路進行學習,大大降低了簡單網路學習到不重要資訊的比例,提高了引數的利用效率,也是目前用的較多的方法。基於精細模型設計的方法,模型本身體積小,執行速度快,效能也不錯,目前小的高效模型也開始廣泛運用在各種嵌入式平臺中。 
總的來說,以上幾種方法可以結合使用,比如說先對引數進行結構化的限制,使得引數裁剪起來更加容易,然後再選擇合適的裁剪方法,考慮不同的評價標準以及裁剪策略,並在裁剪過程中充分考慮引數量、計算量、頻寬等需求,以及不同硬體平臺特性,在模型的效能、壓縮、以及平臺上的加速很好的進行權衡,才能夠達到更好的效果。