〖想觀看更多中文論文導讀,至[論文速速讀]系列文章介紹可以看到目前已發布的所有文章!〗
前言
paper: https://arxiv.org/pdf/1512.03385.pdf
ResNet,ILSVRC 2015年的冠軍,透過有名的Residual block降低了梯度在深層時會gradient vanish的問題,成功的達到了歷代CNN model都不能到的深度(152層)。
這篇paper發表於CVPR 2016,搜尋這篇paper,會發現被cite的次數高達了57446次!
(和之前文章相同,本篇論文導讀主要在架構和classification上,所以沒有提到ResNet在detection的部分,有興趣的讀者可以再自己去看原文。)
Abstract
We present a residual learning framework to ease the training of networks that are substantially deeper than those used previously.
提出了一個殘差訓練框架,使得能夠訓練更深的模型。同時他們證明了residual network可以更好地優化和透過達到更深的深度來提高準確度。
最後他們成功達到VGG層數的8倍,也就是152層,並使用了ensemble model的情況下達到了該年的ILVRC第一名。
Introduction
近代的研究指出模型的深度是設計時一個非常重要的考量,許多學者們透過較多層數的模型取得了一些較好的研究成果。
Driven by the significance of depth, a question arises: Is learning better networks as easy as stacking more layers?
An obstacle to answering this question was the notorious problem of vanishing/exploding gradients [1, 9], which hamper convergence from the beginning
隨著模型深度變成一個很重要的issue,大家開始思考:
是不是只要簡單的加深層數,就能學習到一個好的網路?
這個問題會牽涉到模型在深層的情況下容易造成gradient vanishing / exploding的問題,在近期的一些研究中,發現可以透過normalization有效的降低這種問題,使得模型仍然能夠有效運作。
當深層模型能夠有效收斂的時候,大家發現了另一個問題:退化(degradation),當深度增加的時候,準確度會到達飽和並且快速地下降
Unexpectedly, such degradation is not caused by overfitting, and adding more layers to a suitably deep model leads to higher training error
意外的是,這種現象並不是overfitting引起的,而是在深層的時候,模型參數的誤差造成的影響會越來越大,如同蝴蝶效應般所導致。
- 就自己的理解來解釋一下這一段,如果是overfitting現象,我們合理的猜測我們應該可以得到一個training loss越來越低但validate loss越來越高的loss曲線
- 但就下面的實驗我們並沒有發現這件事,loss在train/valid都持續在下降,但明顯就是比20層的高了一個error gap
下圖是簡單的用3x3 Conv來進行疊加模型,然後實驗了在20層和56層時的結果,可以看到56層的error都比20層高
- 那個error突然下降的地方並不是這張圖想呈現的重點,不過其實我蠻好奇這個部分的,我猜想可能是因為在訓練一定的epoch後走到了一個山谷導致error瞬間降低很多的緣故
這個現象很奇怪ㄋㄟ,為什麼深層的模型error curve硬是多了一個gap?
讓我們從一個簡單的case來思考:
- 首先,先考慮一個較淺層的神經網路架構做為對照組
- 和一個較深層的神經網路架構
該case存在一個solution可以來達成建構這個較深層的架構: 也就是新添加一個identity mapping來增加層數。由於深層的模型具有更大的solution space,理論上他不應該有更高的training error,至少也應該有個跟淺層一樣的training error(也就是identity mapping case)
- identity mapping到底是什麼概念? 可以想成我新增了一層,但新增一層後output卻和沒新增是相同的(該層單純將資訊完整地往下一層傳遞),我們可以稱該層是一個identity mapping
這個solution搭配實驗顯示了其實在深層模型訓練時最佳化模型是有一定的困難的,並且目前的solutions都不太容易解決這個現象。
所以他們就提出Residual block來想辦法解決這個問題。
Residual learning framework
Residual block的架構如下:
假設我們的input x經過兩層layer後我們期望他學到的特徵是$H(x)$ (desired underlying mapping)
實際上x經過兩層後不一定能完全學到$H(x)$,我們把理想跟實際上學到的差距稱之Residual
我們把Residual用$F(x)$ (residual mapping)來稱呼
所以現在模型的目標變成學習residual mapping了。
…
如果你看到這邊是這個表情的話,下面讓我試著來用白話一點的方式來敘述:
原本我們希望我們的網路層可以學習到我們期望的特徵$H(x)$,不過上面也說了其實學習上是有困難的,尤其在深層網路的時候
- 就像爸爸總是希望你考100分,所以請了一個家教希望能把你交到100分的程度,那對老師來說他的目標是”把你教到100分”
所以我們不如轉換思維,把目標分解,希望添加的網路層只需要學習自身$x$到$H(x)$的差距就好,學習$H(x)-x$,也就是$F(x)$的這個部分,這邊作者假設相較於學習$H(x)$,學習$F(x)$更加容易優化
- 如果你本身就可以考70分了,那新來的家教就可以只需要把目標放在”把你成績提高30分”就好了
To the extreme, if an identity mapping were optimal, it would be easier to push the residual to zero than to fit an identity mapping by a stack of nonlinear layers.
值得一提的是,最極端的狀況下,$x$如果已經完美的fit $H(x)$ (也就是說這層什麼都不學就是最佳解時),那麼$F(x)$當作0即可,因為他根本不用學習任何東西。把$F(x)$當作0比透過一堆非線性層來直接fit $x \rightarrow H(x)$容易多了。
- 也就是如果你本來就可以考100分了,那老師就很開心,直接薪水小偷當起來,他根本不用教你什麼
上面介紹完了residual learning framework的部分,在實作上也非常簡單,透過“shortcut connection”就可以達成
- 在deep learning框架中簡單的透過
torch.add()
ortf.add()
來完成 - shortcut connection幾乎不會帶來額外的cost,因為沒有任何新增的參數,頂多也就是那少少的一個法運算
- 實作上要注意shape不對等的case(因為有些層的stride=2會縮小shape),此時就會搭配萬能的1x1 Conv來解決,下面會提到
Related Work
Residual Representations
介紹了一些之前的相關研究,我覺得我上面Residual講得夠清楚了,所以這裡跳過!
These methods suggest that a good reformulation or preconditioning can simplify the optimization.
相關related works指出,好的重構或預處理可以簡化最佳化的困難度。
Shortcut Connection
shortcut其實也在不少的研究上被提出過,用來解決gradient vanishing / exploding的問題。
- 如果還記得GoogleNet的朋友應該可以很直覺地想到他們就是在auxiliary classifiers的設計中就是把中間層的output直接接到classifier上
- 還有另一個related work是highway networks,一個gated-shortcut機制,有興趣的再去看吧
再強調一次,在本文中他們認為深層網路學不好的主因不是gradient vanishing / exploding沒(問題可以透過parameter normalization / initialization來達到一定程度的克服),但不可否認的是shutcut的設計本身也可以一定程度的解決該現象,來看一下梯度的計算:
$H(x) = F(x) + x$,$H(x)$對$x$的梯度變成了
$\frac{\delta{H}}{\delta{x}}$上再額外加上$\frac{\delta{x}}{\delta{x}}=1$的部分
Deep Residual Learning
Introduction解釋過的部分這裡就會跳過,主要來介紹網路架構的部分。
Network Architectures
先放架構,網路那麼長截圖很難欸…想看的人請自己放大後把你的頭往右旋轉90度,不然就給我乖乖去看原文
為了和ResNet比較,需要有個對照組,也就是Plain Network
- 基於VGG的架構設計,大部分都是3x3 Conv
- 相同input shape的layer具有相同數量的filter
- 如果shape減半,則filter size加倍,以保持相同的時間複雜度
- 最後接個GAP和softmax
- 不知道GAP的去看NIN那篇論文吧…什麼你還沒看過NIN這篇論文?! 快去看[論文速速讀]Network In Network
而對於ResNet
- 就是在Plain Network上加上shortcut connection
- 值得一提的是,架構中的黑色虛線代表input shape改變了(stride=2),此時$x$和$H(x)$會因為input shape(或者說dimension)不同無法直接相加,他們考慮了兩個做法:
- (A) 硬加:dimension不足的地方我補0給你,給我硬加喔
- (B) 萬能的1x1 Conv: 什麼你還沒看過NIN這篇論文?! 快去看[論文速速讀]Network In Network
- 1x1 Conv實作細節可以參考我寫的[Pytorch]逐步解釋ResNet34程式碼
Implementation
前處理和參數設置的部分,跳過。
Experiments
ImageNet Classification
做ImageNet分類時的網路架構圖,這個是用表格呈現的,不用再看到瞎掉
這是Top1 error rate
這是error curve
左邊的圖示對照組,右邊是ResNet,細線代表training error而粗線代表valid error,好了我們來看圖說故事:
- 在左邊的圖中,深層網路的error比淺層還高,發現了模型退化的問題
- 和前面討論過的一樣:在具有較大solution space的深層網路不應該學的比淺層差,在optimization過程中遇到了困難
- 在右邊的圖中,深層模型的error比淺層低了!代表網路有好好最佳化喔~棒棒噠
他們認為這個現象跟vanishing gradients無關,因為他們有加入BN,並且做了一些驗證。實驗數據其實也表明,儘管是plain network,仍然有一定程度的準確率,所以模型仍然是work的。關於造成的原因會在以後繼續研究。
ImageNet講完了,對於其他dataset的實驗就不在提起(我好懶喔…放過我吧QQ),有興趣的可以參考原文。下面將會講一些和dataset無關的實驗分析。
Deeper Bottleneck Architectures
Identity vs. Projection Shortcuts
對於shortcut的實作方式他們也比較了三種做法
- zero-padding shortcuts are used for increasing dimensions, and all shortcuts are parameterfree
- projection shortcuts are used for increasing dimensions, and other shortcuts are identity
- all shortcuts are projections
1的方法是我們最熟悉的,也就是沒有新增任何參數的版本,但在實驗中方案3的效果比較好。
儘管在實驗中發現3的效果最好(可能是因為projections額外的參數帶來的好處),但他們在後續的實驗還是採用了1的方案,因為沒有額外參數的設計對於接下來要把模型變得更深的實驗非常重要。
Deeper Bottleneck Architectures
接下來他們考慮把模型弄的跟長頸鹿一樣長,可是礙於資源有限,慾望無窮(公民課本有教),所以他們把ResNet的building block結構改了一下,變成了bottlenet building block
簡單來說,就是先透過1x1 Conv降維,降低3x3 Conv計算上的負擔,然後再用1x1 Conv升維變回原本的shape。
- 在這種設計下,如果是使用Projection Shortcuts,你會發現shortcut mapping連接的都是高維度的dimension,會有大量的參數需要被計算
透過bottlenet building block,ResNet-50、ResNet-101就誕生了,然後還是要來嗆一下VGG:
儘管我們都這麼深了(?),複雜度仍然比你的VGG16 / VGG19低喔
最後放個實驗結果:
Analysis of Layer Responses
這張圖顯示了各種模型的response deviations
- The responses are the outputs of each 3×3 layer, after BN and before other nonlinearity (ReLU/addition)
These results support our basic motivation (Sec.3.1) that the residual functions might be generally closer to zero than the non-residual functions
可以發現到ResNet系列的response相對較小,應證了之前的假設: residual function比non-residual functions更能學到identify mapping的關係(也就是residual趨近0的效果)
此外,越深層的ResNet有越小的response,代表層數越深的時候,透過resdidual block的機制,越來越多層會將residual mapping的部分降低(也就是越來越多層開始選擇做少少事就好,當個薪水小偷)來控制模型的最佳化機制。
Exploring Over 1000 layers
“好想知道能不能再深入喔><”
有錢人的幸福就是這麼樸實無華,他們最後設計了一個1202層的ResNet。
結果發現效果比152層的差,他們認為這是overfitting造成的(這麼小的dataset幹嘛用這麼大的模型)
是說…你真的搞出1202層我們也沒辦法用啦..
結論
哇喔終於打完了,其實這些論文的概念都大概知道,可是要把一篇論文讀完所花的時間還是很久QQ
最後,來做個總結吧!
在ResNet這篇文章中探討了深層神經網路模型會遇到的問題
- 不是梯度爆炸/消失所造成的,儘管確實會影響,但在Batch Normalization等技術出來後該issue被有效的改善
- 也不是overfitting,因為模型確實有一定程度的效果
- 他們認為這個現象起因於模型退化(degradation),在深層模型中造成最佳化的複雜度大大增加
透過identity mapping來分解原本要優化的目標,基於這個想法提出了ResNet,ResNet可以帶來什麼好處?
- 沒有額外參數: identity mapping只是一個簡單的shortcut connection,沒有任何需要訓練的參數,降低了模型的複雜度並可以訓練更多層
- 自適應深度: 根據前面的敘述你會發現,根據$x$的狀況,模型可以動態調整每一層$F(x)$要學習的目標
- 如果網路模型夠淺: 那可以讓每一層的模型專注在學習特徵表達,也就是$F(x)$要學到一些representation
- 如果網路模型很深: 那可以讓某些層當薪水小偷,也就是$F(x)\rightarrow0$,做個identity mapping的功用將$x$往下傳就好。反正深層模型的solution space那麼大,讓其他人做事就好
- 減輕gradient vanishing / exploding的現象: 儘管論文說這不是造成深層模型訓練困難的主因,但shortcut機制確實能夠減緩梯度爆炸/消失的問題
在模型的實踐上
- ResNet-18, ResNet-34採用的是一般的building block
- ResNet-50, ResNet-101, ResNet-152採用的是bottleneck build block,為了降低模型的複雜度
- 關於ResNet-34的Pytorch實作分析,可以參考[Pytorch]逐步解釋ResNet34程式碼