(深度學習)ResNet之殘差學習

Ben Hu
4 min readJan 31, 2020

--

以下我想要分享我學習什麼是Resnet的一些心得。

先看Resnet剛剛發佈時的表現

很明顯,Resnet 透過增加層數來達到更好的低錯誤率的表現。但其他人怎麼沒想到?因為增加layer會遇到”困難”,而Resnet就是解決這個”困難”才得以增加的層數。什麼困難?下面讓我慢慢道來。

首先,當我們直接增加層數時,錯誤率反而更高。

因為是訓練資料就發生這個現象,不是過度擬和的問題。如果不是overfit, 那這是因為梯度消失或爆炸嗎?也不是,因為也已經採用類似Batch Norm或drop out等很多手段。這個現象,資料科學家們取了一個名字,叫做退化Degradation。你可以說這是一個,深層網路會遇到的退化問題(Degradation problem)。

因此就開始有很多研究者開始試圖解決這個問題,最後何大神想出一個方法,使用殘差學習。

殘差學習?

首先讓我們假設,如果你多堆一層,但這一層的結果和上一層一樣,從邏輯上來說,這樣基本上當然不會出現退化是吧。這一層,我們叫做 Identify maping, 恆等映射。這個概念等等會用到。

殘差學習單元

讓我們先建立以下的概念:

輸入是x

學到的特徵是H(x)

我們定義一個新的名詞,叫做殘差 Residual

Residual = H(x) - x

殘差的概念很直覺吧? 就是學到的特徵和原本的輸入的差異。

既然是Residual = H(x) - x,Residual 也是X的函數,所以也寫作F(x), 那F(x) = H(x) - x

原本學習是這樣的。 x → H(x)

已經知道 F(x) = H(x) - x

所以學習也可以這樣寫:x → F(x) + x

因為H(x) = F(x) + x

用文字來說明的話,

輸入→特徵

變成:輸入→ 輸入 + 殘差

這樣有什麼好處嗎?

如果今天我們多一層,什麼都沒有學到。那殘差就是0

那多這一層,想想我們上面介紹過的,當殘差=0的時候,輸入→ 輸入,這一層就叫做恆等映射,因此,多這一層如果沒學到新的特徵,也不會讓模型退化。實際上當然不會剛好等於0, 而是可以增加很多層,而每一層都可以學到一些新的更複雜的特徵。

現在應該可以大概看懂這個圖了吧?

殘差學習單元

意思就是,我們把學習分解成 X 和 殘差,如果沒學到,那就只是恆等映射。如果有學到,就是新的特徵。透過這種方式,我們就可以持續的把模型長的更深! (數學部分可以看這篇

因為這個圖和短路的電路圖很像。所以有人又把這個叫做短路機制。

最後附上下圖。Resnet算是VGG下一代的網路,因此這邊可以看到Resnet就是VGG的基礎上進行修改。

更多Resnet的細節,可以看下面這篇參考文章。本文就是基於此篇文章的一個心得筆記喔。

--

--

Ben Hu

What I cannot create, I do not understand — Richard Feynman