總結近期CNN模型的發展(一)
1.前言
好久沒有更新專欄了,最近因為項目的原因接觸到了PyTorch,感覺打開了深度學習新世界的大門.閑暇之餘就用PyTorch訓練了最近在圖像分類上state-of-the-art的CNN模型,正好在文章中總結如下:
- ResNet [1, 2]
- Wide ResNet [3]
- ResNeXt [4]
- DenseNet [5]
- DPNet [9]
- NASNet [10]
- SENet [11]
- Capsules [12]
本文復現了上述論文在CIFAR數據集(包括cifaro10和cifar100)上的結果([9]除外),代碼已經放在github上了:
junyuseu/pytorch-cifar-models這篇主要介紹前四個結構.
2.分析與復現結果
2.1 ResNet
ResNet是近年來CNN結構發展中最為關鍵的一個結構,後面非常多的insight都是在resnet基礎上進行改進,也有非常多的論文旨在分析殘差結構的有效性.ResNet的成功首先得益於其結構的簡單有效,其次得益於它的廣泛適用.一個簡單的殘差塊如下圖所示:
這個單元用可以由以下公式來表述:
在resnet的大多數結構塊中, 亦即恆等映射,只有非常少的幾個需要進行維度匹配而使用了1x1的卷積層來增加維度,而f則是ReLU函數.
假設從上一層傳來的loss為 ,利用反向傳播規則,有:
注意到 這一項,它使得梯度在層層傳播中不致產生彌散情況,這可以一定程度上解釋殘差學習的有效性.
通過復現[1]中ResNet在cifar10上的結果,得到下表:
和原論文作對比,會發現復現結果均優於論文中的結果,1202層的網路也嘗試跑了,可能由於沒有按照原文中的學習率設置,導致結果一直不收斂,為節省GPU資源,就沒有跑完最終結果,表明ResNet在極深情況下也會遇到優化問題,不過一般情況下也不會用到這麼深的結構.
為解決上述問題,[2]中提出了PreAct的殘差結構,如下圖所示:
顧名思義,PreAct是指在卷積層之前使用BN和激活函數(ReLU),如上,我們給出這種結構的公式表示:
以上結構具有更加巧妙的形式,根據 ,遞推地,則有:
對於任意地深層L和淺層l成立,
這個公式有一些很好的性質,
i).任意深層單元 可以用任意淺層單元 加上一個殘差函數的和來表示;
ii). ,任意深層單元 是之前所有殘差函數加和的結果(再加上 輸入層)
假設loss函數是 ,根據反向傳播,有:
如果我們忽略PreActResNet中的很少的用於增加維度的層,那麼該公式表明:不管網路有多深,整個網路中的梯度流不會產生彌散問題.
下述實驗結果也證明了這一點:
除了1001層的網路,上述結果均得到了比原論文中更好的結果,從該表中可以得出,
1.在網路極深情況下,PreAct單元比普通的殘差單元要更加有效
2.即使是1000層的網路,使用同樣的超參數設置,PreAct網路依然可以很好的收斂;
2.2 Wide ResNet
ResNet表明通過增加深度,網路可以得到更好的性能,而這一篇的insight則在於探究寬度對於網路性能的影響.首先我們說明一下什麼是寬度.對於卷積層來說,寬度是指輸出維度,如ResNet50的第一個卷積層參數為(64,3,7,7),寬度即輸出維度也就是64.而對於一個網路來說,寬度則是指所有參數層的總體輸出維度數.為了便於研究,通常通過一個倍率係數k來控制一個網路的寬度,如下表所示:
[3]的實驗結果表明增加寬度,網路的性能也能得到提升.甚至一個14層深的寬殘差網路可以達到比1001層深的殘差網路更好的性能.同時,由於GPU的並行運算特性,在參數數量級一致的情況下,WRN(wide resnet縮寫)的訓練效率要遠遠高於ResNet.復現結果如下:
復現結果均優於論文中結果.
2.3 ResNeXt
ResNeXt是Kaiming組的大作.[4]中提出除了深度和寬度以外,"基數"也是影響網路性能的一個重要因素.基數是什麼呢?如下圖所示
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的一種特例.
原文中,作者實現了所有這三種架構,並驗證了它們的等價性.所以在復現過程中,我們只復現架構C,因為通過使用組卷積,這種架構最易於實現.復現結果如下:
在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數據集上的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 |