深度殘差網路 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所示,假設原始網路要學的函式為
分解後原始網路(圖3垂直向下的流程)擬合
圖4為 VGG-19、34層普通網路和34層新增殘差的網路結構
圖4. 相較於普通網路,ResNet 只需增加 shortcut connection(虛線是將通道數乘以2)
作者的實驗表明,殘差結構需要2層以上才會有效果,如下式中
圖5是作者使用 ResNet 的實驗效果
圖5. ResNet網路(右)與普通網路(左)的訓練誤差
為什麼 ResNet 起作用
這裡需要回答兩個問題:
- 一是為什麼分解為
H(x)=F(x (實際優化的是F(x)=0 ); - 二是為什麼分解後能解決梯度渙散的問題
對於第一個問題,作者並沒有從原理上做解釋,而是通過實驗證明其是最優的。知乎上關於為什麼用 x 而不是 0.5x 或者其他的一個回答是:“實踐發現機器學習要擬合的(target function)函式 f(x) 經常是很接近同一對映函式的。”但我不能理解。
對於第二個問題,有以下3種解釋:
1)由於網路權重初始值往往在0附近,因此優化
一個比喻是:假設要擬合的函式是一根直線(在這裡就是
2)比如把 5 對映到 5.1
如果普通網路,則是
引入殘差後為
可以看到,普通網路輸入輸出的“梯度”僅為2%,而殘差網路的對映
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.