重读经典:《Deep Residual Learning for Image Recognition》
ResNet論文逐段精讀【論文精讀】
這是李沐博士論文精讀的第二篇論文,這次精讀的論文是ResNet。ResNet 是 CVPR2016 的最佳論文,目前谷歌學術顯示其被引用數已經達到了90000+。
ResNet論文鏈接為:https://arxiv.org/abs/1512.03385。
1.第一遍
首先是論文標題,論文標題中文意思是:深度殘差學習的圖像識別。論文標題指出了關鍵詞:Residual Learning,殘差是數理統計中常用到的一個詞。
下面是論文的作者,本篇論文作者全部為中國學者,這四個人現在都很有名了。一作也是 CVPR 2009 的最佳論文獲得者,目前在Facebook AI Research任研究科學家;二作、三作當時是微軟亞洲研究院的實習生,目前二作在曠視工作,三作在蔚來工作,通信作者目前是曠視研究院院長。
下面是論文摘要,摘要總共11句話。
- 第1句話就提出了論文要解決的問題,更深的神經網絡很難訓練。
- 第2、3句介紹了論文使用的方法,提出了一個殘差學習框架使深的神經網絡更容易訓練, 網絡中的層對層輸入的殘差函數進行學習。
- 4-7句為在ImageNet上的比賽結果,論文設計的152層網絡取得了3.57%的錯誤率,獲得了比賽第一名。
- 第8句,作者在CIFAR-10 數據集上進行了100層和1000層網絡的實驗分析。
- 9-11句,其它比賽結果,在ILSVRC和COCO 2015比賽上獲得了ImageNet檢測任務,定位任務,COCO檢測和分割任務的第一名。
由于 CVPR2016 要求提交論文正文在8頁以內,從摘要可以看出,作者做的實驗是比較多的,因此本篇論文沒有結論部分(不建議大家學習)。
在讀第一遍時,可以順帶看看論文中重要的圖和表,如論文第一頁中的圖,可以看到更深的神經網絡反而有更高的錯誤率,這也是作者要解決的問題。第一遍讀完后,可以決定后面是否再讀第二遍論文,鑒于本篇論文的實驗結果如此厲害,因此我們進行第二遍閱讀。
2.第二遍
首先是Introduction部分,總共9段。第一段介紹故事背景,第二段引出第一個問題:堆疊更多的層數以后網絡是否學習效果更好?但是堆疊更多的層后往往會遇到梯度爆炸、梯度消失問題,會從一開始就阻止收斂。好在這個問題可以通過歸一化初始化或中間層歸一化來解決。第三段介紹了另一個問題:當網絡開始收斂時,往往會出現退化現象。隨著網絡深度的增加,準確率趨近飽和,然后迅速下降。意外的是,這不是由于過擬合造成的,更深的模型反而會有更高的訓練誤差(如圖1所示)。
第4-6段,為了解決深度學習的退化問題,作者提出了深度殘差學習框架,讓網絡層去擬合殘差映射。如果我們想要得到的映射為 H(x)\mathcal{H}(\mathbf{x})H(x),則我們讓添加的非線性網絡層去擬合殘差映射 F(x):=H(x)?x\mathcal{F}(\mathbf{x}):=\mathcal{H}(\mathbf{x})-\mathbf{x}F(x):=H(x)?x,則原始的映射就可以寫成 F(x)+x\mathcal{F}(\mathbf{x})+\mathbf{x}F(x)+x。殘差映射的實現可以通過圖2所示的連接塊實現,跳躍連接是一個恒等映射,沒有引入額外的參數和計算復雜度,整個網絡很容易實現(最初ResNet是使用Caffe庫實現的)。
后面三段是本文設計的網絡在ImageNet、CIFAR-10、COCO數據集上的實驗結果,大量的實驗結果表明作者設計的殘差學習框架的通用性,一方面不僅使得網絡更容易優化,另一方面隨著網絡深度的增加,網絡復雜度并沒有明顯增加,準確率卻會提高很多。
下面是Deep Residual Learning部分。這里要理解各種ResNet是如何形成的。網絡設計原則為:(i)對于相同的輸出特征圖尺寸,卷積層具有相同數量的卷積核;(ii)如果特征圖尺寸減半,則卷積核數量加倍,以便保持每層的時間復雜度。通過步長為2的卷積層直接執行下采樣。下面以ResNet-34為例進行介紹:
- 首先是第一個卷積層,卷積核大小為 7×77\times77×7,卷積核個數為64,步長為2;
- 然后是第二個卷積層,卷積核大小為 3×33\times33×3,卷積核個數為64,步長為2;
- 接著是三個殘差連接塊,每一個連接塊由兩層卷積網絡組成,卷積核大小為 3×33\times33×3,卷積核個數為64;
- 然后是四個殘差連接塊,每一個連接塊由兩層卷積網絡組成,卷積核大小為 3×33\times33×3,卷積核個數為128;
- 接著是六個殘差連接塊,每一個連接塊由兩層卷積網絡組成,卷積核大小為 3×33\times33×3,卷積核個數為256;
- 然后是三個殘差連接塊,每一個連接塊由兩層卷積網絡組成,卷積核大小為 3×33\times33×3,卷積核個數為512;
最后是全局平均池化層和具有softmax的1000維度的全連接層,這樣整個網絡包含 1+1+(3+4+6+3)×2=341+1+(3+4+6+3)\times2=341+1+(3+4+6+3)×2=34 個卷積層。盡管網絡深度相比VGG-19要深了許多,但是FLOPs只是VGG-19的18%左右。
從表1可以看到, ResNet-18和ResNet-34具有相同的殘差連接塊,每個連接塊包含兩個卷積層。而ResNet-50/101/152的每個連接塊包含3個卷積層。作者把這種連接塊稱為bottleneck(如下圖所示),這里主要使用了1×11\times11×1的卷積核,主要是用于匹配特征圖維度以及從實踐出發能夠承擔的起訓練時間。(之前聽過論文通信作者的一個報告,據說這個網絡訓練時間為一個月,具體一個月是指純訓練還是指訓練+測試+調參就不太清楚了)。
然后是Implementation部分,作者是參考AlexNet和VGG來進行訓練。首先對圖像的短邊進行尺度擴大,擴大到 [256,480][256,480][256,480],然后和AlexNet一樣,隨機選擇 224×224224\times224224×224 大小的圖案。作者在這里使用到了batch normalization (BN) 技術;然后作者按照自己的另一篇文章來進行初始化并從零開始訓練(如果對作者之前工作不了解的話還要再去看作者的文章了解如何對網絡初始化,對第一次看到這篇文章的讀者來說增加了閱讀難度,不過作者可能也是因為受到篇幅影響,不想再過多介紹)。梯度下降使用了SGD,mini-batch大小為256,總共進行了 60×10460\times10^460×104 次迭代(目前很少有這樣的寫法了,都是介紹訓練了多少個epochs)。為了得到最好的實驗結果,作者在多個尺度上進行評估,然后取平均分。
最后是Experiments部分,從論文中可以看到作者做了大量實驗。首先是ImageNet Classification,首先評估了plain-18/34兩個網絡,從表2可以看到,plain-34網絡比plain-18有更高的錯誤率,從圖4左圖也可以看到,在訓練過程中,出現了退化現象,隨著網絡深度的增加,訓練誤差反而變大。作者在論文中解釋到:退化現象應該不是梯度消失引起的,因為整個訓練使用了BN來訓練,也查驗了反向傳播時梯度幅值也是正常的,作者懷疑可能是因為更深的網絡有著更低的收斂速度,影響著訓練誤差的減小,這個問題未來會進一步研究。
接著是ResNet-18/34兩個網絡的評估,從表2和圖4右圖可以觀察到三個現象:
- 網絡越深,訓練誤差反而越小,退化問題可以通過殘差學習得到解決;
- 與plain-34網絡相比,訓練誤差下降了3.5%,隨著網絡深度的不斷增加,網絡性能進一步提高;
- 與palin-18/34網絡相比,殘差網絡收斂速度更快;
然后是恒等跳躍連接和投影跳躍連接的對比,可以看到三種連接都有助于提高網絡性能,但是為了不增加網絡結構的復雜度,作者這里主要選擇恒等跳躍連接進行后續的實驗。
下面是ResNet-50/101/152網絡的評估,首先可以看到,盡管網絡深度不斷增加,但是復雜度依然低于VGG-16/19。
隨著網絡深度的不斷增加,錯誤率不斷下降,同時在訓練過程中也沒有出現退化現象,在單個模型上取得了4.49%的錯誤率,在ImageNet2015比賽上,通過集成6個不同的模型,取得了3.57%的錯誤率(這是一個很了不起的結果,因為ImageNet數據集在人工標注時,可能就會有1%的錯誤率。)
最后總結一下,ResNet解決了網絡訓練退化的問題,找到了可以訓練更深網絡的辦法,目前已經成為了深度學習中最重要的一種模型。
在視頻的最后,李沐博士從梯度的角度對殘差學習理論進行了闡述,我這里使用吳恩達老師的講義來進一步補充。
假設有一個很大的神經網絡,其輸入為 X\mathbf{X}X,輸出為 a[l]{a}^{[l]}a[l] 。給這個神經網絡再添加殘差塊,輸出為a[l+2]{a}^{[l+2]}a[l+2]。假設整個網絡中都選用 ReLU 作為激活函數,因此輸出的所有激活值都大于等于0。?a[l]{a}^{[l]}a[l] 與 a[l+2]{a}^{[l+2]}a[l+2] 之間的函數關系為:
z[l+1]=W[l+1]a[l]+b[l+1]a[l+1]=g(z[l+1])z[l+2]=W[l+2]a[l+1]+b[l+2]a[l+2]=g(z[l+2]+a[l])z^{[l+1]} = W^{[l+1]}a^{[l]} + b^{[l+1]}\\ a^{[l+1]} = g(z^{[l+1]}) \\ z^{[l+2]} = W^{[l+2]}a^{[l+1]} + b^{[l+2]}\\ a^{[l+2]} = g(z^{[l+2]} + a^{[l]}) z[l+1]=W[l+1]a[l]+b[l+1]a[l+1]=g(z[l+1])z[l+2]=W[l+2]a[l+1]+b[l+2]a[l+2]=g(z[l+2]+a[l])
當發生梯度消失時,即殘差塊網絡沒有學到有用信息,W[l+2]≈0W^{[l+2]}\approx0W[l+2]≈0,b[l+2]≈0b^{[l+2]}\approx0b[l+2]≈0,則有:
a[l+2]=g(a[l])=ReLU(a[l])=a[l]a^{[l+2]} = g(a^{[l]}) = ReLU(a^{[l]}) = a^{[l]} a[l+2]=g(a[l])=ReLU(a[l])=a[l]
因此,殘差塊的使用不會降低網絡性能。而如果沒有發生梯度消失時,訓練得到的非線性關系會使得網絡性能進一步提高。(關于殘差網絡的理論更深解釋,也有很多相關的研究,感興趣的讀者可以查閱對應文獻。)
[雙語字幕]吳恩達深度學習deeplearning.ai
總結
以上是生活随笔為你收集整理的重读经典:《Deep Residual Learning for Image Recognition》的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (6)递归
- 下一篇: Apollo进阶课程㊷丨Apollo实战