DenseNet 學習心得

Ray Lin
學以廣才
Published in
7 min readJun 14, 2018

CNN出現後,後續發展很快。DenseNet便是其一,論文於2016年發表。大綱如下,如果卷積網絡包含接近輸入的層和接近輸出的層之間有較短連接,則卷積網絡可以更深入,更精確和有效地進行訓練。DenseNet便是基於這樣想法而設計的,它以前饋方式(feed-forward)將每層連接到每個其他層。而具有L層的傳統卷積網絡具有L個連接,而每個層與其後一個層之間,又有 L(L + 1)/2 個直接連接。對於每個圖層,所有前面的圖層的特徵圖都用作輸入,並且它自己的特徵圖也用作所有後續圖層的輸入。如下圖:

DenseNet的優點有:

  1. 緩解梯度消失問題(vanishing-gradient problem)。
  2. 加強特徵傳播,鼓勵特徵重用。
  3. 大幅減少參數數量。

在 CIFAR-10,CIFAR-100,SVHN和ImageNet 驗證中,能以較少的計算達到高性能。程式也已分享在GITHUB上。看完論文的概述,我先學習CNN的發展過程。了解歷史便可以知道,為啥DenseNets有上述的三個優點了。

細究DenseNet,是讓l層的輸入直接影響到之後的所有層,它的輸出為:Xl=Hl([x0,x1,…,xl−1]),其中[x0,x1,…,xl− 1]就是將之前的feature map以通道的維度進行合併(特徵重用)。並且每一層都包含之前所有層的輸出信息,因此其只需要很少的特徵圖計算就夠了。這種dense connection相當於每一層都直接連接input和loss,因此就可以減輕梯度消失現象,這樣更深網絡不是問題。

Hl(.)是複合函數,包含BN(Batch Normalization),ReLU, 3X3 Conv

Pooling 會導致 Feature-maps 大小的變化,所以需進行維度匹配。參考ResNet幾種處理方法,1)補零,2)projection。在DenseNet中,按照pooling劃分,在每個區域中進行dense block連結,如下圖。

Dense Block 內部如下圖:

Grow rate也就是H(.)函數產生的feature map的數目。

Bottleneck layers

每個layer只產生k個feature maps。在之前的grow rate中,論文就用一個公式表示輸入feature maps的數量:k0 + k(L-1)。這邊用類似於ResNet進行引入1x1卷積核進行降維,從而降低計算複雜度。那麼第二種DenseNet的Hl(.)模型重新命名為DenseNet-B,表示如下:
BN-ReLu-Conv(1x1)-BN-ReLu-Conv(3x3).
Note:論文的實驗中,作者將1x1卷積的固定輸出在4k feature-maps。其中k=k0 + kx (L-1)

Compression
作者在過度層(Transition Layer)也實行降低feature map的數量。如果一個Dense Block有 m 個 feature-maps,作者設計 一個 [θm] 來輸出特徵圖,其中0<θ≤1被稱為壓縮因子,當θ=1時,經過過度層的特徵圖數量不變,實驗中設置θ=0.5。

DenseNet 架構如下:

實驗結果

論文有提到,在沒有壓縮或瓶頸層(Bottleneck layers)的情況下,隨著L和k的增加,DenseNets仍然表現出error減少的趨勢。這讓作者認為DenseNets可以利用更大更深層模型。

對於 over-fitting 的部分:

  1. 實驗數據表示,更有效地使用參數,讓DenseNet不易over-fitting。
  2. 在C10,k = 12到k = 24產生的參數的4倍增長導致誤差從5.77%適度增加到5.83%。 瓶頸和壓縮層似乎可以有效應對這種趨勢。

圖4中的左圖比較所有DenseNets變體的參數效率的實驗結果。以達到相同的準確度來看,DenseNet-BC僅需要ResNets的大約1/3的參數(中間圖)。圖4中的右圖顯示,僅有 0.8 M 可訓練參數的DenseNet-BC能夠達到的準確度,與具有 10.2 M 參數的1001層ResNet相當。

對於每個block的每個卷積層,作者也計算了每層平均權重的絕對值,並在下圖顯示了所有三個Dense Block的熱圖。可以發現:

  1. 同一個Dense Block中,早期的卷積層所提取的特徵,確實有被整個Block中的卷積層所使用。
  2. 過渡層(Transition layer)的權重,也分佈在前一個Dense Block內的所有層上。這顯示Block的最後一層還是有接收到第一層少許的資料訊息。
  3. 二個和第三個Dense Block內的圖層均將最小權重分配給過渡圖層(三角形頂部row)的輸出,這顯示過渡圖層會輸出許多冗餘特徵。這可解釋DenseNet-BC正好壓縮了這些冗餘特徵。
  4. 雖然最右側的最後一個分類層,也使用了整個Dense Block的權重。但似乎有 "一個較高的權重集中在後期層的趨勢",顯示可能會有一些更高級的特徵圖會產生於在後期的網絡層。

作者在論文中,提出許多有趣的討論與總結:

  1. 最近,一種可以成功訓練1202層ResNet的隨機深度(stochastic depth)被提出。隨機深度通過在訓練過程中隨機丟掉一些層來優化深度殘差網絡的訓練過程。這表明深度(殘差)網絡中並不是所有的層都是必要的,有很多層是冗餘的。DenseNet的一部分就受到了該結論的啟發。
  2. DenseNets不是用很深或者很寬的網絡來獲得呈現圖像辨識能力,而是通過特徵的重複使用來得到網絡的隱含信息,獲得更容易訓練、參數效率更高的稠密模型。
  3. GooLeNet使用了“inception”模塊,將不同尺寸的濾波器產生的特徵,進行組合連接不同層的特徵,但DenseNets更簡單,也更高效。
  4. 表面上,DenseNets和ResNets很像。但在feature-maps連接的部分,一個是進行拼接,一個是求和。這個小改變卻給這兩種網絡結構的性能,帶來很大的差異。
  5. 將網絡特徵的重複利用,可得到更簡化的模型。
  6. 稠密卷積網絡可以提升準確率的一個解釋是,由於更短的連接,每一層都可以從損失函數中獲得監督信息。可以將DenseNets理解為另一種 “深度監督”(deep supervision)
  7. DenseNets的損失函數值和梯度不是很複雜,這是因為所有層之間共享了損失函數。
  8. 稠密卷積網絡與殘差網絡的隨機深度正則化(stochastic depth regularzation)之間有著有趣的關係。
  9. DenseNets可以很自然的將自身映射(identity mappings)、深度監督(deep supervision)和深度多樣化(diversified depth)結合在一起。由於簡化了內部表徵和降低了特徵冗餘,DenseNets可能是目前CNN非常不錯的特徵提取器。

說到DenseNet的明顯缺點,就是訓練很佔記憶體,不過也已有方式解決了。到這邊終於學習完整個DenseNet。

--

--

Ray Lin
學以廣才

善歌者,使人繼其聲;善教者,使人繼其志。其言也,約而達,微而臧,罕譬而喻,可謂繼志矣