總結近期CNN模型的發展(一)

1.前言

好久沒有更新專欄了,最近因為項目的原因接觸到了PyTorch,感覺打開了深度學習新世界的大門.閑暇之餘就用PyTorch訓練了最近在圖像分類上state-of-the-art的CNN模型,正好在文章中總結如下:

  1. ResNet [1, 2]
  2. Wide ResNet [3]
  3. ResNeXt [4]
  4. DenseNet [5]
  5. DPNet [9]
  6. NASNet [10]
  7. SENet [11]
  8. Capsules [12]

本文復現了上述論文在CIFAR數據集(包括cifaro10和cifar100)上的結果([9]除外),代碼已經放在github上了:

junyuseu/pytorch-cifar-modelsgithub.com圖標

這篇主要介紹前四個結構.

2.分析與復現結果

2.1 ResNet

ResNet是近年來CNN結構發展中最為關鍵的一個結構,後面非常多的insight都是在resnet基礎上進行改進,也有非常多的論文旨在分析殘差結構的有效性.ResNet的成功首先得益於其結構的簡單有效,其次得益於它的廣泛適用.一個簡單的殘差塊如下圖所示:

殘差結構塊

這個單元用可以由以下公式來表述:

y_l = h(x_l) + mathcal{F}( x_l, mathcal{W}_l),

 x_{l+1} = f(y_l),

在resnet的大多數結構塊中, h(x_l)=x_l 亦即恆等映射,只有非常少的幾個需要進行維度匹配而使用了1x1的卷積層來增加維度,而f則是ReLU函數.

假設從上一層傳來的loss為 mathcal{E} ,利用反向傳播規則,有:

frac {partial mathcal{E}} {partial x_l} = frac {partial mathcal{E}} {partial x_{l+1}} frac {partial x_{l+1}} {partial y_l} frac {partial y_l} {partial x_l} = frac {partial mathcal{E}} {partial x_{l+1}} f

[ f

注意到 1+ frac {partial} {partial x_l} mathcal F(x_l, mathcal W_l) 這一項,它使得梯度在層層傳播中不致產生彌散情況,這可以一定程度上解釋殘差學習的有效性.

通過復現[1]中ResNet在cifar10上的結果,得到下表:

在cifar10上復現ResNet結果

和原論文作對比,會發現復現結果均優於論文中的結果,1202層的網路也嘗試跑了,可能由於沒有按照原文中的學習率設置,導致結果一直不收斂,為節省GPU資源,就沒有跑完最終結果,表明ResNet在極深情況下也會遇到優化問題,不過一般情況下也不會用到這麼深的結構.


為解決上述問題,[2]中提出了PreAct的殘差結構,如下圖所示:

(a)普通的殘差結構塊,(b)PreAct殘差結構塊

顧名思義,PreAct是指在卷積層之前使用BN和激活函數(ReLU),如上,我們給出這種結構的公式表示:

x_{l+1} =x_{l} + mathcal{F}( x_{l}, mathcal{W}_{l}) ,

以上結構具有更加巧妙的形式,根據 x_{l+2} = x_{l+1} + mathcal{F}( x_{l+1}, mathcal{W}_{l+1})=x_{l} + mathcal{F}( x_{l}, mathcal{W}_{l}) + mathcal{F}( x_{l+1}, mathcal{W}_{l+1}) ,遞推地,則有:

x_L=x_l+sum_{i=l}^{L-1}{mathcal F(x_i,mathcal W_i)} 對於任意地深層L和淺層l成立,

這個公式有一些很好的性質,

i).任意深層單元 x_L 可以用任意淺層單元 x_l 加上一個殘差函數的和來表示;

ii). x_L=x_0+sum_{i=0}^{L-1}{mathcal F(x_i,mathcal W_i)} ,任意深層單元 x_L 是之前所有殘差函數加和的結果(再加上 x_0 輸入層)

假設loss函數是 mathcal{E} ,根據反向傳播,有:

frac {partial mathcal{E}} {partial x_l} = frac {partial mathcal{E}} {partial x_{L}} frac {partial x_{L}} {partial x_l} = frac {partial mathcal{E}} {partial x_{L}} (1+ frac {partial} {partial x_l}sum_{i=l}^{L-1}{mathcal F(x_i,mathcal W_i})),

如果我們忽略PreActResNet中的很少的用於增加維度的層,那麼該公式表明:不管網路有多深,整個網路中的梯度流不會產生彌散問題.

下述實驗結果也證明了這一點:

在cifar數據集上復現PreActResNet結果

除了1001層的網路,上述結果均得到了比原論文中更好的結果,從該表中可以得出,

1.在網路極深情況下,PreAct單元比普通的殘差單元要更加有效

2.即使是1000層的網路,使用同樣的超參數設置,PreAct網路依然可以很好的收斂;

2.2 Wide ResNet

寬殘差結構塊

ResNet表明通過增加深度,網路可以得到更好的性能,而這一篇的insight則在於探究寬度對於網路性能的影響.首先我們說明一下什麼是寬度.對於卷積層來說,寬度是指輸出維度,如ResNet50的第一個卷積層參數為(64,3,7,7),寬度即輸出維度也就是64.而對於一個網路來說,寬度則是指所有參數層的總體輸出維度數.為了便於研究,通常通過一個倍率係數k來控制一個網路的寬度,如下表所示:

Wide ResNet在cifar數據集上的網路結構

[3]的實驗結果表明增加寬度,網路的性能也能得到提升.甚至一個14層深的寬殘差網路可以達到比1001層深的殘差網路更好的性能.同時,由於GPU的並行運算特性,在參數數量級一致的情況下,WRN(wide resnet縮寫)的訓練效率要遠遠高於ResNet.復現結果如下:

在cifar數據集上復現Wide ResNet實驗結果

復現結果均優於論文中結果.

2.3 ResNeXt

ResNeXt是Kaiming組的大作.[4]中提出除了深度和寬度以外,"基數"也是影響網路性能的一個重要因素.基數是什麼呢?如下圖所示

左:一個殘差結構塊,右:一個ResNeXt結構塊(基數=32),每一層用#輸入維數,過濾器尺寸,#輸出維數表示

ResNeXt其實是一種多分支的卷積神經網路.多分支網路最初可見於Google的Inception結構.

基數在論文中的定義是轉換集的尺寸.這個定義可能還不是很好理解,我們先來了解一下組卷積(group convolution).

組卷積可以最早可以追溯到AlexNet[6].Krizhevsky等人使用組卷積的目的是為了將模型分布到兩個GPU上進行訓練.在AlexNet中,group size為2,最近的很多篇論文,包括Xception[7],MobileNet以及這篇ResNeXt,都是組卷積的應用.Xception的group size為輸入維數,這種組卷積也被稱為depthwise卷積.Xception和MobileNet均使用了深度可分離卷積,所謂深度可分離卷積,其實就是depthwise卷積加上pointwise卷積(也就是卷積核尺寸為1x1的卷積)

了解完組卷積之後,我們再來看一下ResNeXt中基數的概念.可以發現,基數其實就是組卷積中的group size,也就是組數.depthwise卷積其實是ResNeXt的一種特例.

ResNeXt的三種等價形式

原文中,作者實現了所有這三種架構,並驗證了它們的等價性.所以在復現過程中,我們只復現架構C,因為通過使用組卷積,這種架構最易於實現.復現結果如下:

在cifar數據集上復現ResNeXt實驗結果

在cifar10上的結果稍差於論文中結果,在cifar100上的結果均優於論文中結果,並得到了目前最低的錯誤率(17.11%)

2.4 DenseNet

DenseNet是CVPR 2017年的best paper.雖然DenseNet的影響不及ResNet那麼大,但是也提出了一種很有意義的insight. DenseNet的最大優勢在於優化梯度流.早在ResNet之後,[8]就指出在ResNet訓練過程中,梯度的主要來源是shortcut分支(這也側面驗證了我們之前關於殘差結構塊梯度傳播的推導).大家都知道在BP過程中保持梯度流的有效性,防止梯度爆炸/消失在訓練CNN時有多麼重要,既然shortcut如此有效,那麼為什麼不多加點呢?這就是 DenseNet 的核心思想:對之前每一層都加一個單獨的 shortcut,使得任意兩層之間都可以直接"溝通".也就是如下圖所示的結構:

在具體實現過程中,是使用channel wide的concat操作實現任意兩層之間互聯的.

DenseNet的總體結構如下圖所示:

具體的超參數設置可以參考論文和代碼實現,復現結果如下:

在cifar數據集上復現DenseNet實驗結果

復現結果基本達到(或超過)論文中的結果.最後的結果基本達到了現在cifar數據集上的state-of-the-art.

個人感覺DenseNet之所以不那麼火,是因為在ImageNet數據集上的效果不是非常好,相比於其他同等參數數量級的模型,如ResNeXt,SENet.

3.總結

從ResNet到WRN再到ResNeXt,分別驗證了深度,寬度,基數對於CNN模型的重要影響.從ResNet到PreActResNet再到DenseNet,通過對梯度流的不斷優化,得到了越來越好的效果.

本文在PyTorch上復現了上述4篇論文在cifar數據集上的實驗結果,得到了和原文一致甚至更好的結果,在cifar10上得到了3.41%的錯誤率,cifar100上得到了17.11%的錯誤率

Reference

[1] K. He, X. Zhang, S. Ren, and J. Sun. Deep residual learning for image recognition. In CVPR, 2016.

[2] K. He, X. Zhang, S. Ren, and J. Sun. Identity mappings in deep residual networks. In ECCV, 2016.

[3] S. Zagoruyko and N. Komodakis. Wide residual networks. In BMVC, 2016.

[4] S. Xie, G. Ross, P. Dollar, Z. Tu and K. He Aggregated residual transformations for deep neural networks. In CVPR, 2017

[5] H. Gao, Z. Liu, L. Maaten and K. Weinberger. Densely connected convolutional networks. In CVPR, 2017

[6] K. Alex, I. Sutskever, and G. Hinton. Imagenet classification with deep convolutional neural networks. In NIPS, 2012

[7] C. Fran?ois. Xception: Deep Learning with Depthwise Separable Convolutions. In arxiv, 2016

[8] V. Andreas, M. Wilber, and S. Belongie. Residual networks behave like ensembles of relatively shallow networks. In NIPS, 2016

[9] Y. Chen, J. Li, H. Xiao, X. Jin, S. Yan, J. Feng. Dual path networks. In NIPS, 2017

[10] B. Zoph, V. Vasudevan, J. Shlens, Q. Le. Learning transferable architectures for scalable image recognition. In arxiv, 2017

[11] J. Hu, L. Shen, G. Sun. Squeeze-and-excitation networks. In arxiv, 2017

[12] S. Sabour, N. Frosst, G. Hinton. Dynamic routing between capsules. In NIPS, 2017

推薦閱讀:

【筆記】Finding Tiny Faces
PyTorch中如何使用tensorboard可視化
深度學習入門該用PyTorch還是Keras?熱門公開課換框架背後的學問
python3.6.1及TensorFlow和PyTorch
知乎「看山杯」 奪冠記

TAG:深度学习DeepLearning | 卷积神经网络CNN | PyTorch |