帶你讀論文系列之計算機視覺–ResNet和ResNeXt
ResNet 強!
ResNet釋出于2015年,目前仍有大量CV任務用其作為backbone(尤其是頂會實驗比較),而且目前很多網絡都在使用殘差子產品。
Deep Residual Learning for Image Recognition
https://arxiv.org/abs/1512.03385
代碼:
pytorch:https://github.com/fastai/fastai
tensorflow:https://github.com/tensorflow/models/tree/master/research/deeplab
網絡中的亮點:
- 超深的網絡結構(突破1000層)
- 提出Residual子產品
- 使用Batch Normalization加速訓練(丢棄Dropout)
引言
随着深度對于網絡的重要性,出現了一個問題:學些更好的網絡是否像堆疊更多的層一樣容易?回答這個問題的一個障礙是梯度消失/爆炸這個衆所周知的問題,它從一開始就阻礙了收斂。然而,這個問題通過标準初始化(normalized initialization),中間标準化層(intermediate normalization layers)和批量歸一化(BN)在很大程度上已經解決,這使得數十層的網絡能通過具有反向傳播的随機梯度下降(SGD)開始收斂。(ResNet解決的不是梯度消失/爆炸問題)
當更深的網絡能夠開始收斂時,暴露了一個退化問題:随着網絡深度的增加,準确率達到飽和,然後迅速下降。意外的是,這種退化不是由過拟合引起的,并且在适當的深度模型上添加更多的層會導緻更高的訓練誤差。
在本文中,我們通過引入深度殘差學習架構解決了退化問題。我們明确地讓這些層拟合殘差映射,而不是希望每幾個堆疊的層直接拟合期望的底層映射。我們假設殘差映射比原始的、未參考的映射更容易優化。在極端情況下,如果一個恒等映射是最優的,那麼将殘差置為零比通過一堆非線性層來拟合恒等映射更容易。
恒等快捷連接配接(Identity shortcut connections)既不增加額外的參數也不增加計算複雜度。
我們發現:1)我們極深的殘差網絡易于優化,但當深度增加時,對應的“簡單”網絡(簡單堆疊層)表現出更高的訓練誤差;2)我們的深度殘差網絡可以從大大增加的深度中輕松獲得準确性收益,生成的結果實質上比以前的網絡更好。
殘差表示。在圖像識别中,VLAD是一種通過關于字典的殘差向量進行編碼的表示形式,Fisher矢量可以表示為VLAD的機率版本。它們都是圖像檢索和圖像分類中強大的淺層表示。對于矢量量化,編碼殘差矢量被證明比編碼原始矢量更有效。
在低級視覺和計算機圖形學中,為了求解偏微分方程(PDE),廣泛使用的Multigrid方法将系統重構為在多個尺度上的子問題,其中每個子問題負責較粗尺度和較細尺度的殘差解。Multigrid的替代方法是階層化基礎預處理,它依賴于表示兩個尺度之間殘差向量的變量。已經被證明這些求解器比不知道解的殘差性質的标準求解器收斂得更快。這些方法表明,良好的重構或預處理可以簡化優化。
殘差學習
關于退化問題的反直覺現象激發了這種重構。如果添加的層可以被建構為恒等映射,更深模型的訓練誤差應該不大于它對應的更淺版本。退化問題表明求解器通過多個非線性層來近似恒等映射可能有困難。通過殘差學習的重構,如果恒等映射是最優的,求解器可能簡單地将多個非線性連接配接的權重推向零來接近恒等映射。
在實際情況下,恒等映射不太可能是最優的,但是我們的重構可能有助于對問題進行預處理。如果最優函數比零映射更接近于恒等映射,則求解器應該更容易找到關于恒等映射的抖動,而不是将該函數作為新函數來學習。我們通過實驗顯示學習的殘差函數通常有更小的響應,表明恒等映射提供了合理的預處理。
恒等映射足以解決退化問題,是以Ws(1x1卷積)僅在比對次元時使用。殘差函數的形式是可變的。
ResNet引入殘差網絡結構(residual network),即在輸入與輸出之間(稱為堆積層)引入一個前向回報的shortcut connection,這有點類似與電路中的“短路”,也是文中提到identity mapping(恒等映射y=x)。原來的網絡是學習輸入到輸出的映射H(x),而殘差網絡學習的是F(x)=H(x)−x。殘差學習的結構如下圖所示:
作者在文中提到:深層網絡的訓練誤差一般比淺層網絡更高;但是對一個淺層網絡,添加多層恒等映射(y=x)變成一個深層網絡,這樣的深層網絡卻可以得到與淺層網絡相等的訓練誤差。由此可以說明恒等映射的層比較好訓練。
我們來假設:對于殘差網絡,當殘差為0時,此時堆積層僅僅做了恒等映射,根據上面的結論,理論上網絡性能至少不會下降。這也是作者的靈感來源,最終實驗結果也證明,殘差網絡的效果确實非常明顯。
但是為什麼殘差學習相對更容易?從直覺上看殘差學習需要學習的内容少,因為殘差一般會比較小,學習難度小。另外我們可以從數學的角度來分析這個問題,首先殘差單元可以表示為:
其中 x_{l} 和 x_{l+1} 分别表示的是第 l 個殘差單元的輸入和輸出,注意每個殘差單元一般包含多層結構。F 是殘差函數,表示學習到的殘差,而h表示恒等映射, f 是ReLU激活函數。基于上式,我們求得從淺層 l 到深層 L 的學習特征為:
利用鍊式規則,可以求得反向過程的梯度:
式子的第一個因子表示的損失函數到達 L 的梯度,小括号中的1表明短路機制可以無損地傳播梯度,而另外一項殘差梯度則需要經過帶有weights的層,梯度不是直接傳遞過來的。殘差梯度不會那麼巧全為-1,而且就算其比較小,有1的存在也不會導緻梯度消失。是以殘差學習會更容易。
網絡架構
簡單網絡。卷積層主要有3×3的濾波器,并遵循兩個簡單的設計規則:(i)對于相同的輸出特征圖尺寸,層具有相同數量的濾波器;(ii)如果特征圖尺寸減半,則濾波器數量加倍,以便保持每層的時間複雜度。我們通過步長為2的卷積層直接執行下采樣。
我們的模型與VGG網絡相比,有更少的濾波器和更低的複雜度。我們的34層基準有36億FLOP(乘加),僅是VGG-19(196億FLOP)的18%。
在每個卷積之後和激活之前,我們采用批量歸一化(BN)。
ImageNet 的更深的殘差函數 F。左圖:ResNet-34 的積木塊(在 56×56 特征圖上),如下圖所示。右圖:ResNet-50/101/152 的“瓶頸”建構塊。
圖像被調整大小,其較短的邊在 [256,480] 中随機采樣以進行縮放。從圖像或其水準翻轉中随機采樣 224×224 的裁剪,減去每個像素的平均值 。使用了标準顔色增強。我們在每次卷積之後和激活之前采用批量歸一化(BN)。初始化權重并從頭開始訓練所有普通/殘差網絡。我們使用 SGD,mini-batch 大小為 256。學習率從 0.1 開始,當誤差平穩時除以 10,模型最多訓練 60×10的4 次疊代。我們使用 0.0001 的權重衰減和 0.9 的動量。我們不使用 dropout。
在測試中,為了進行比較研究,我們采用了标準的10-crop測試。為了獲得最好的結果,我們采用完全卷積形式,并對多個尺度的分數進行平均(圖像被調整為短邊在{224,256,384,480,640})。
ImageNet驗證集上的single-model結果的錯誤率(%)(測試集上的報告除外)。
集合的錯誤率 (%)。top-5 錯誤在 ImageNet 的測試集上,由測試伺服器報告。
在CIFAR-10上的訓練。虛線表示訓練誤差,粗線表示測試誤差。左邊:普通網絡。普通110的誤差高于60%,沒有顯示。中:ResNets。右:有110層和1202層的ResNet。
CIFAR-10上各層響應的标準偏差(std)。響應是每個3×3層的輸出,在BN之後和非線性之前。頂部:各層按其原始順序顯示。底部:響應按降序排列。
總結
1、當堆積層的輸入x和輸出y不同次元的時候,即f是一個從低維向高維的映射時,這個時候不能簡單的添加恒等映射作為shortcut connection,需要加上一個線性投影Ws,等于一個連接配接矩陣,這種結構稱為投影結構。
2、殘差網絡不僅可以運用到全連接配接層,還可以用到卷積層。
3、作者做了對比投影結構與恒等結構對實驗結果的實驗。發現投影結構對效果有細微提升,但是應該歸功于投影連接配接增加的額外參數。
4、作者測試了1000層的殘差網絡,測試結果比110層更差,但是訓練誤差卻與110層相似,造成這種現象應該是過拟合,對于小型的資料集,1000多層的網絡屬于殺雞牛刀了,如果真的需要用到這麼深的網絡,可能需要更強的正則化。
5、ResNet在目标分類上有了非常好的泛化性能,作者将它應用到目标檢測領域,将Faster R-CNN的基礎網絡用VGG-16與ResNet-101對比,性能均有大幅提升。
帶你讀論文系列之計算機視覺–VGG
帶你讀論文系列之計算機視覺–AlexNet
ResNeXt
Aggregated Residual Transformations for Deep Neural Networks
https://arxiv.org/abs/1611.05431
代碼和模型公布在
https://github.com/facebookresearch/ResNeXt
亮點
1.提出簡潔、高度子產品化的網絡
2.主要特色是聚合變換
3.block都一緻,超參數很少
4.cardinality 來衡量模型複雜度
5.ImageNet上發現,增加cardinality可提高網絡性能且比增加深度和寬度更高效
6.ILSVRC第二名,5K 和COCO超越ResNet
前言
ResNet網絡的更新版:ResNeXt。提出ResNeXt的主要原因在于:傳統的要提高模型的準确率,都是加深或加寬網絡,但是随着超參數數量的增加(比如channels數,filter size等等),網絡設計的難度和計算開銷也會增加。是以本文提出的 ResNeXt 結構可以在不增加參數複雜度的前提下提高準确率,同時還減少了超參數的數量(得益于子子產品的拓撲結構)。
首先提到VGG,VGG主要采用堆疊網絡來實作,之前的 ResNet 也借用了這樣的思想。然後提到 Inception 系列網絡,簡單講就是 split-transform-merge 的政策,但是 Inception 系列網絡有個問題:網絡的超參數設定的針對性比較強,當應用在别的資料集上時需要修改許多參數,是以可擴充性一般。
網絡 ResNeXt,同時采用 VGG 堆疊的思想和 Inception 的 split-transform-merge 思想,但是可擴充性比較強,可以認為是在增加準确率的同時基本不改變或降低模型的複雜度。這裡提到一個名詞cardinality,原文的解釋是the size of the set of transformations,如下圖 Fig1 右邊是 cardinality=32 的樣子,這裡注意每個被聚合的拓撲結構都是一樣的(這也是和 Inception 的差别,減輕設計負擔)。
附上原文比較核心的一句話,點明了增加 cardinality 比增加深度和寬度更有效,這句話的實驗結果在後面有展示:
相關工作
1、多分支網絡廣泛應用;ResNets可以被認為是兩個分支網絡,其中一個分支是身份映射。深度神經決策森林是具有學習分裂函數的樹模式多分支網絡;深度網絡決策樹也是多分支結構multi-path有群衆基礎。
2、分組卷積有廣泛應用;幾乎沒有證據表明分組卷積可提升網絡性能。
3、模型壓縮有廣泛研究;本文不同于模型壓縮,本文設計的結構自身就有很強的性能和低計算量。
4、模型內建是有效的提高精度的方法;本文模型并不是模型內建,因為各子產品的訓練是一起同時訓練的,并不是獨立的。
網絡結構
列舉了 ResNet-50 和 ResNeXt-50 的内部結構,另外最後兩行說明二者之間的參數複雜度差别不大。
左)ResNet-50。(右)帶有32×4d模闆的ResNeXt-50(使用圖3(c)中的重構)。括号内是殘塊的形狀,括号外是舞台上堆疊的塊數。“C=32”建議分組卷積有32個組。這兩個模型之間的參數數量和FLOPs相似。
這些塊具有相同的拓撲結構,并且受VGG/ResNet啟發的兩個簡單規則的限制:(i)如果生成相同大小的空間圖,則這些塊共享相同的超參數(寬度和過濾器大小),以及(ii)每個當空間圖按因子2下采樣時,塊的寬度乘以因子2。第二條規則確定計算複雜性,以FLOP(浮點運算,在#乘加),對于所有塊大緻相同。
3種不同不同的 ResNeXt blocks
ResNeXt的等效建構塊。(a):聚合殘差變換,與圖1右側相同。(b):等效于(a)的塊,實作為早期串聯。©:等效于(a,b),實作為分組卷積。加粗的符号突出了重新制定的變化。一層表示為(#輸入通道,過濾器大小,#輸出通道)。
fig3.a:aggregated residual transformations;
fig3.b:則采用兩層卷積後 concatenate,再卷積,有點類似 Inception-ResNet,隻不過這裡的 paths 都是相同的拓撲結構;
fig 3.c:采用了一種更加精妙的實作,Group convolution分組卷積。
作者在文中明确說明這三種結構是嚴格等價的,并且用這三個結構做出來的結果一模一樣,在本文中展示的是fig3.c的結果,因為fig3.c的結構比較簡潔而且速度更快。
(左):聚合深度=2的轉換。(右):一個等效的塊,稍微寬一些
ResNeXt在不增加參數及計算量的情況提高了精度。
分組卷積
Group convolution 分組卷積,最早在AlexNet中出現,由于當時的硬體資源有限,訓練AlexNet時卷積操作不能全部放在同一個GPU處理,是以作者把feature maps分給多個GPU分别進行處理,最後把多個GPU的結果進行融合。
有趣的是,分組卷積在當時可以說是一種工程上的妥協,因為今天能夠簡單訓練的AlexNet。在當時很難訓練, 顯存不夠,Hinton跟他的學生不得不把網絡拆分到兩張GTX590上面訓練了一個禮拜,當然,兩張GPU之間如何通信是相當複雜的,幸運的是今天tensorflow這些庫幫我們做好了多GPU訓練的通信問題。就這樣Hinton和他的學生發明了分組卷積. 另他們沒想到的是:分組卷積的思想影響比較深遠,目前一些輕量級的SOTA(State Of The Art)網絡,都用到了分組卷積的操作,以節省計算量。
疑問:如果分組卷積是分在不同GPU上的話,每個GPU的計算量就降低到 1/groups,但如果依然在同一個GPU上計算,最終整體的計算量是否不變?
實際上并不是這樣的,Group convolution本身就大大減少了參數,比如當input_channel= 256, output_channel=256,kernel size=3x3:不做分組卷積的時候,分組卷積的參數為256x256x3x3。
當分組卷積的時候,比如說group=2,每個group的input_channel、output_channel=128,參數數量為2x128x128x3x3,為原來的1/2.
最後輸出的feature maps通過concatenate的方式組合,而不是elementwise add. 如果放到兩張GPU上運算,那麼速度就提升了4倍.
實驗結果
ImageNet-1K的訓練曲線。(左):ResNet/ResNeXt-50,保留了複雜性(41億FLOPs,2500萬參數);(右)。保留複雜性的ResNet/ResNeXt-101(78億FLOPs,4400萬參數)。
在ImageNet-1K 上進行的消融實驗。(頂部):保留複雜性的ResNet-50(41 億FLOPs);(底部):保留複雜性的ResNet-101(78億FLOPs)。誤差率是在224×224像素的單一作物上評估的。
當FLOPs的數量增加到ResNet-101的2倍時,在ImageNet-1K上的比較。錯誤率是在224×224像素的單一作物上評估的。突出顯示的因素是增加複雜性的因素。
總結:
- ResNeXt結合了inception與resnet的優點(其實還有分組卷積),既有殘缺結構(便于訓練)又對特征層進行了concat(對特征多角度了解)。這就類似于模型融合了,把具有不同優點模型融合在一起,效果的更好。
- 核心創新點就在于提出了 aggregrated transformations,用一種平行堆疊相同拓撲結構的blocks代替原來 ResNet 的三層卷積的block,在不明顯增加參數量級的情況下提升了模型的準确率,同時由于拓撲結構相同,超參數也減少了,便于模型移植。
參考文章:
https://www.jianshu.com/p/11f1a979b384
https://www.cnblogs.com/FLYMANJB/p/10126850.html