一文弄懂Resnet

解讀

作為在2015年ImageNet比賽分類任務中的冠軍,Resnet在目標分割,檢測,識別等大展拳腳,更是直接影響了學術界和工業界發展方向。如此厲害的論文,那就站在巨人的肩膀上研究其好在哪裡吧。

核心:提出殘差塊思想(去掉相同主體部分,突出微小變化)

一文弄懂Resnet

圖上彎曲的線是跳層連接(shortcut connection),也就是論文說的identity mapping,曲線之外部分叫residual mapping。輸出結果 H(x)=F(x) +x,x是輸入shortcut連接,H是輸出,F(x)就是殘差部分(當然在論文中具體使用比這複雜)。


在詳細說殘差之前,先說下深度對網絡的影響,也就是殘差出現的由來。

我們都知道,當網絡的層數較少時,卷積並不能很好的提取出特徵向量,top錯誤率也就下不來。很自然的,大家都想到了加深網絡,當網絡的層數越多,能提取到的特徵也就越豐富,語義信息越好。

然而簡單增加深度,會導致梯度消失/爆炸問題,儘管使用了例如

歸一化,dropout等彌補措施,可也導致了網絡的退化,深度越深準確率卻在下降,看下圖:

一文弄懂Resnet

可以明顯看到隨著網絡層數增加,error反而更大。為了解決這個問題,作者提出了殘差思想並通過實驗去驗證它。

殘差的本質是隨著網絡層度增加,我們要讓網絡不會變壞,作者認為殘差讓網絡獲得了更好性能(實際上殘差有沒有獲得更好性能,這個真不好說,也可能是網絡更深得到了更好的特徵信息,但至少可以確定殘差使網絡不在退化)。

♂ 我們來先來看下殘差網絡的原理(此圖來源於網絡)

一文弄懂Resnet

嗯……原理部分推導估計大家也並不想細看,總結一下就是在求導時多加1,➕1好處就是梯度不會消失(求導不為0),這樣殘差就可以更容易學習,下面舉個栗子F(x)殘差到底怎麼做。

  • F是求和前網絡映射,H是從輸入到求和後的網絡映射(輸出)。
  • 比如把10映射到10.1,
  • 引入殘差前是F'(10)=10.1,
  • 引入殘差後是H(10)=10.1, H(10)=F(10)+10, F(10)=0.1。
  • F'和F都表示網絡參數映射,引入殘差後的映射對輸出的變化更敏感。比如原來是從10.1到10.2,映射F'的輸出增加了1/101=1%,而對於殘差結構從10.1到10.2,映射F是從0.1到0.2,增加了100%。後者輸出變化對權重的調整作用更大,自然效果更好。

♀ 在看下殘差實際效果,也就是實驗部分。

一文弄懂Resnet


一文弄懂Resnet

從這這兩幅圖可以清楚看到,更深的網絡錯誤率越低。


論文中實際使用的殘差結構

一文弄懂Resnet

實驗證明殘差塊需要兩層以上才能起到提升。左圖一般用於resnet-34以下,右圖用在50,101這種深度。

目的一目瞭然,就是為了降低參數的數目,第一個1x1的卷積把256維channel降到64維,然後在最後通過1x1卷積恢復,參數數目:1x1x256x64 + 3x3x64x64 + 1x1x64x256 = 69632,不使用(左圖)就是兩個3x3x256的卷積,參數數目: 3x3x256x256x2 = 1179648,差了16.94倍。

還有一個問題,論文中在做殘差時會遇到通道數不一致問題,如下圖。

一文弄懂Resnet

虛線部分,通道數不一致。解決辦法是什麼呢?作者通過給 x 調整維度實現,具體計算公式:y = F(x) + Wx, W是卷積操作。

具體結構圖

一文弄懂Resnet

從18到152層,最常用的是50和101。這裡層數是指卷積或者全連接層,而激活層或者Pooling層沒有計算在內。

在實驗細節方面,作者講述的不多(超參數設定見論文)。不過網上有大神實現了其代碼,Ryan Dahl 使用tensorflow實現,如下圖。

一文弄懂Resnet

圖片一目瞭然,網絡就是N個此圖的疊加,不在做過多解釋。


實驗結果對比

一文弄懂Resnet

很明顯可以看到隨著網絡加深,性能越來越好。但是一味加深深度,誤差同樣也會再次變大。作者在Cifar-10上做實驗進行了證明,至於原因作者認為是網絡過深,發生了過擬合


總結

Resnet的出現,顛覆了以往網絡結構的設計、網絡的深度總是受到梯度影響。而殘差的出現使網絡的深度不在受到限制並且能夠保證性能。如果要說缺點的話,儘管用了1*1來減少參數量,但是網絡深度依然決定其參數量還是大,所以對硬件要求比較高……


公眾號解讀先行一步「深度學習框架點滴」

我是休柏,向陽花開。


分享到:


相關文章: