1. 程式人生 > >深度殘差網路 ResNet

深度殘差網路 ResNet

作為 CVPR2016 的 best paper,何凱明的文章【1】針對深層網路梯度彌散導致的SGD優化難題,提出了 residual(殘差)結構,很好的解決了模型退化問題,在50層、101層、152層甚至1202層的網路上測試均獲得了很好的效果。

應用了ResNet的錯誤率大大低於其他主流深度網路(圖1)

          這裡寫圖片描述
                       圖1.ResNet網路在 ImageNet15上獲得冠軍

網路模型

一個很顯然的事實是:越深的網路表達能力越強。但隨著深度的提高,梯度彌散的現象越明顯,導致SGD無法收斂,最終精度反而下降(圖2)

               這裡寫圖片描述


                 圖2. 常規56層網路無論訓練還是測試,精度都比20層網路差

針對該問題,方法提出一個 Residual(殘差)結構,對於1000多層的網路也能保持很好的訓練效果(雖然此時已經出現了過擬)

                    這裡寫圖片描述
               圖3. 殘差結構直接將輸入 x 接入輸出,相當於引入了一個恆等對映

如圖3所示,假設原始網路要學的函式為H(x) ,作者將其分解為H(x)=F(x)+x
分解後原始網路(圖3垂直向下的流程)擬合F(x),盤支(圖3彎曲的 shortcut connection)

圖4為 VGG-19、34層普通網路和34層新增殘差的網路結構

                  這裡寫圖片描述
          圖4. 相較於普通網路,ResNet 只需增加 shortcut connection(虛線是將通道數乘以2)

作者的實驗表明,殘差結構需要2層以上才會有效果,如下式中Ws 表示的線性變換也僅是統一輸入輸出的維度,對訓練效果提升沒有幫助

y=F(x,Wi)+Wsx
圖5是作者使用 ResNet 的實驗效果

       這裡寫圖片描述
                     圖5. ResNet網路(右)與普通網路(左)的訓練誤差

為什麼 ResNet 起作用

這裡需要回答兩個問題:

  • 一是為什麼分解為H(x)=F(x
    )+x
    (實際優化的是F(x)=0);
  • 二是為什麼分解後能解決梯度渙散的問題

對於第一個問題,作者並沒有從原理上做解釋,而是通過實驗證明其是最優的。知乎上關於為什麼用 x 而不是 0.5x 或者其他的一個回答是:“實踐發現機器學習要擬合的(target function)函式 f(x) 經常是很接近同一對映函式的。”但我不能理解。

對於第二個問題,有以下3種解釋:
1)由於網路權重初始值往往在0附近,因此優化F(x)=0是有天然優勢的。
  一個比喻是:假設要擬合的函式是一根直線(在這裡就是H(x)),那麼用一根直線(殘差結構x)和一些微小的折線(F(x))來疊加肯定比單純的用直線或者折線擬合要容易優化的多

2)比如把 5 對映到 5.1
  如果普通網路,則是F(5)=5.1
  引入殘差後為H(5)=5.1H(5)=F(5)+5,那麼F(5)=0.1
  可以看到,普通網路輸入輸出的“梯度”僅為2%,而殘差網路的對映F增加了100%

3)這篇文章從另一個角度理解殘差:將其看做一個投票系統

      這裡寫圖片描述
                       圖6. 殘差網路可以分解為多鍾路徑組合的網路

如圖6所示,殘差網路其實是很多並行子網路的組合。因此雖然表面上看 ResNet 可以做到很深,但這個組合裡大部分網路路徑其實都幾種在中間的路徑長度上。

圖7通過各個路徑長度上包含的網路數乘以每個路徑的梯度值,統計了 ResNet 真正起作用的路徑

                    這裡寫圖片描述
                     圖7. 真正起作用的路徑長度不到20層

因此,“ResNet 只是表面上看起來很深,事實上網路卻很淺”。“ResNet 沒有真的解決深度網路的梯度渙散問題,其實質就是一個多人投票系統”。

程式碼實現

作者在 github 上放出了 caffe 下的網路模型,並且介紹了第三方在其他平臺的實現

【1】He K, Zhang X, Ren S, et al. Deep residual learning for image recognition[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2016: 770-778.