跳轉到

3.2 ResNet 殘差神經網路

前言

本文將要介紹的是2015年 ILSVR 競賽冠軍的 ResNet(Residual Neural Network, 殘差網路)。ILSVR 是由 ImageNet 所舉辦的年度大規模視覺識別挑戰賽,自從2010年開辦以來全世界的人都想訓練一個影像分類器打敗人類的 5% 錯誤率的極限。值得一提的是2012年 AlexNet 問世後,開啟了卷積神蹟網路在深度學習的時代。之後的競賽大家都已深度學習網路為主,不斷地挑戰人類的 5% baseline。ResNet 是由微軟研究團隊所開發,它的特點是神經網路的輸入是可以跳耀式的傳遞到深層網路,這也間接的允許我們可以建立更深的神經網路使得模型能學習到更多特徵。當年冠軍的 ResNet 錯誤率為 3.57% 其深度是152層,約莫是 GoogLeNet 22層的七倍,但Top-5 error rate卻大幅降低了47%。

2015年的 ILSVRC 比賽變得異常激烈!2015 年 2 月 6 日,Microsoft 提出了 PReLU-Net [2],其錯誤率為 4.94%,超越了 5.1% 的人為錯誤率。五天後,即 2015 年 2 月 11 日,Google 在 arXiv(未提交給 ILSVRC)中提出了 BN-Inception / Inception-v2,其錯誤率為 4.8%。

ResNet 簡介

ResNet 主要是解決當神經網路疊的越深直到層數增加到某種程度時,模型的準確率不升反降的問題。這也間接說明了深度模型所造成的模型退化(degradation)情況。因此在不做任何技巧下模型準確率會先上升然後達到飽和,再持續增加深度時則會導致準確率下降。其原因不是過度擬合,而是增加訓練的網路層反而帶來的訓練誤差。如下圖 CIFAR-10 資料集訓練,在 train 或 test 情況下,56層會比20層產生更多的 error。

Residual Learning 主要解決什麼問題?

從上面那張實驗圖可以得知擁有56層網路錯誤率遠遠比20層還來得大。這很明顯不是過度擬合所造成的。另外梯度的爆炸/消失的問題通常都使用 Bacth Normalization 來解決。因此這個結果並不是過度擬和所和梯度消失所造成的,而這是一個退化問題。至於模型退化的主因,是非線性的激發函數 Relu 的存在,使得每次輸入到輸出的過程都幾乎是不可逆的造成資訊損失。因此殘差學習的初衷,其實是讓模型的內部結構至少有恆等對映(identity mapping)的能力。以保證在堆疊網路的過程中,網路至少不會因為繼續堆疊而產生退化。由下圖可以看到左邊是一般的神經網路,而右邊則是 ResNet。從中可以發現左邊是一直線,而 ResNet 具有跳躍連線把先前的輸入接到輸出做相加。

ResNet 解決網路退化的原理

殘差網路的分支就是在修正上一層的誤差。假設上一層輸出足夠好那殘差就為0,如果不夠好就該修正這個誤差。在 MobileNet v2 使用此技巧彌補高度非線性造成不可逆的訊息損失。另外再現今許多主流模型中也會使用到殘差學習這個技巧。

  • 深層梯度回傳順暢:恆等映射的一段的梯度為1,因此把深層梯度注入淺層防止梯度消失。
  • 類比其他機器學習模型(殘差學習):
    • 整體學習中的 boosting 方法,每個弱分類器都是在擬合前面模型輸出與真實答案之差。
    • 長短記憶神經網路(LSTM)的遺忘門
    • relu 激發函數
  • 傳統線性結構網路難以擬合恆等映射
    • 恆等映射即代表讓輸出和輸入一樣(什麼都不做)
    • skip connection 可以讓模型自行選擇要不要更新
  • skip connection 可以實現不同尺度特徵的組合
    • 造就了 FPN、DenseNet
  • ResNet 數學本質是用微分方程式的積分曲線去擬合系統的目標函數
  • 殘差網路相當於不同長度的神經網路組成的組合函數 (ensemble)
  • 殘差網路相當於一個差分放大器

Residual Block 結構

Residual block 透過 shortcut connection 實現,如下圖所示使用 shortcut 將這個 block 的輸入和輸出進行一個 element-wise 的相加,這個簡單的加法並不會給網路增加額外的參數。當模型的層數加深時,這個簡單的結構能夠很好的解決退化問題。如果把網路設計為 H(x) = F(x) + x,即直接把恆等對映作為網路的一部分 。就可以把問題轉化為學習一個殘差函式F(x) = H(x) - x.

假設 Residual Block 的輸入為 x,則輸出 y 等於以下公式(左)。其中 F 是學習的目標,即輸出輸入的殘差。殘差部分是中間有一個 Relu 雙層權重(w1, w2),即公式(右)。

下圖為殘差網絡的結構,以 ResNet18 為例: - ResNet18、34 都是由 BasicBlock 組成的,並且從表中也可以得知,50層(包括50層)以上的 ResNet 才由 Bottleneck 組成。 - 所有類型的 ResNet 卷積操作的通道數(無論是輸入通道還是輸出通道)都是64的倍數。 - 所有類型的 ResNet 的卷積核只有 3x3 和 1x1 兩種。 - 除了公共部分(conv1)外,都是由4大塊組成(con2_x,con3_x,con4_x,con5_x)

眼尖的你可能會發現這些殘差網路有實線與虛線。這些虛線的代表這些 Block 前後的維度不一致,因為 ResNet18 參照了 VGG 經典的設計,每隔 x 層,空間上 /2 減半(downsample)但深度翻倍。為了解決深度不一致問題,論文中採用 1x1 的卷積層進行升維。

殘差網絡一般就是由下圖這兩個結構組成的。ResNet18、34 都是由 BasicBlock 組成的。50層以上的 ResNet 才由 Bottleneck 組成。兩者差別在於當有 1x1 卷積核的時候,我們稱 bottleneck,輸入和輸出都是高維度的但中間有降為過程。通常用於更深的如 101 這樣的網路中,目的是減少計算和引數量。

ResNet 神經網路可解釋分析

ResNet 反向傳播回傳的梯度相關性較好

在這篇論文 The Shattered Gradients Problem: If resnets are the answer, then what is the question?。就我們理解來說隨著網路加深因為激發函數導致相鄰像素回傳的梯度相關性會越來越低,最後接近白噪導致訓練時只會隨機擾動並無擬合作用。因此既然相鄰像素之間有局部相關性,我們會希望相鄰像素的梯度也應該局部相關。所以在這篇論文解釋 ResNet 梯度相關性衰減從 1/2L 增加為 1/√L,同時保持了梯度相關性。

ResNet 相當於幾個淺層網路的集成

這篇論文 Residual Networks Behave Like Ensembles of Relatively Shallow Networks 提到三個殘差網路堆疊起來相當於下圖中(b) 每個模塊都有兩條路,因此三個模塊將有2的三次方共八種路徑。因此這三個殘差網路可以視為這八條路徑的集成(彼此間獨立訓練)。除此之外訓練好模型後他們在測試階段棄掉幾個殘差模塊(Dropout)發現幾乎不影響結果。

總結

  • 深度殘差網路 ResNet 由微軟亞洲研究院發表
  • 2015 年 ImageNet 和 coco 競賽五項冠軍
  • CVPR 2016 最佳論文

論文筆記

  • 特徵提取的深度是解決電腦視覺眾多問題的核心。
  • 深度卷積神經網路已經在圖像分類領域有了顯著的進展與突破。
  • 在 ZFNet 中提到在深層的神經網路整合了低、中、高層不同尺度的特徵,最後在接上一個分類器完成端到端的分類。在低層的網路中提取圖像的邊緣、形狀、顏色。中層提取提取紋理。高層取得小物體上的特徵例如眼睛、輪子。
  • 特徵的層次可以透過將模型堆深,提供不同尺度特徵提升模型的豐富。
  • 在 VGG 和 GoogleNet 論文中指出網路深度的深度是非常重要的。
  • 何愷明: ResNet、PRelu、Mask R CNN、Faster R CNN、SPPNet、Group Normalization。
  • 梯度爆炸/消失可以使用適當初始化與 Batch Normalization 加快網路收斂。
  • 過去直接擬合 H(x) 現在擬合殘差 F(x)=H(x)-x。
  • 多層非線性網路層很難去擬合橫等映射。但殘差學習是可以。
  • 後面的網路只需要擬合前面網路的輸出與真實答案之間的殘差。
  • shortcut connection 並無額外的參數和計算複雜度。

3 網路架構

  • /2 表示使用 stride=2 的卷積進行下採樣,取代 VGG 的池化,feature map 尺寸減半,通道數翻倍。
  • 最後一層採 GAP 進行一千分類。取代原本 VGG 的全連接層。
  • 實線表示相同維度直接加,虛線表示出現下採樣,必須小技巧讓 feature map 維度一致(論文提出三種實驗方法)。
  • 殘差分支出現下採樣(stride=2)時維度增加的(虛線)殘差補救方法,(A)padding 補 0,對於多出來的通道用 0 填充。(B) 使用 1*1 卷積。
  • 訓練時圖像增強:放大至 256*480 尺度接著透過 224*224 隨機裁切。或是隨機翻轉。
  • 影像前處理:減去所有圖片的均值。
  • 在每個卷基層後面以及激發函數前都添加 batch normalization。batch normalization 於 BN-Inception 被提出。
  • 訓練設定: SGD 優化器、mini-batch 256、learning rate 0.1 遇到瓶頸時/10、60萬 epoch、 decay 0.0001、momentum 0.9、不採用 dropout。
  • 在打比賽的時候採用遵循 AlexNet 10-crop testing,以及多尺度裁減與融合(fully-convolutional form) {224, 256, 384, 640} 最終結果為多此度的圖像預測結果求平均。

4 實驗

  • ImageNet 2012 classification dataset 1000 classes 總共有大約 128 萬張訓練圖像、50,000 張驗證圖像和 100,000 張測試圖像。
  • 使用再多迭代並不能解決網路退化問題:“數據本身決定了該類問題的上限,而模型只是逼近這個上限”、“模型結構本身決定了模型上限,而訓練條參只是在逼近這個上限”。
  • 論文中 RestNet 18 與 34 採用 (A) 方案:zero padding 進行下採樣 stride=2。沒有額外的參數量。
  • 34層的殘差網路比18層好,且深度越深性能越好。帶殘差的網路比不帶殘差的效果好。證明殘差可以搭建非常深的網路。
  • 在論文中比較 shortcut connection 用恆等映射 identity mapping(實線) 與 projection shortcut(虛線)。
  • 提出三種實驗 (A) 所有 shortcut 都是恆等映射,升維用 padding 補 0。(B) 實線用恆等映射,虛線遇到需要升維時用 11 卷積。(C) 所有 shortcut 都用 11 卷積。
  • B 比 A 好,但 A 在升維時用 padding 補 0,相當於丟失了 shortcut 分支的訊息。
  • C 又比 B 好,因為多了很多訓練參數。使得模型表示能力更好。
  • Bottleneck 網路先用 11 卷積降維,最後再用 11 卷積升維質原來深度。目的減少餐數量與計算量。在 Inception 結構也用相同方法。
  • RestNet 50、101、152 採用 B 方案 1*1 卷積投影增加維度。
  • 在 ILSVRC 競賽中提交的版本是 6 個不同深度的集成模型(18、34、50、101、152、152)。並得到 3.57%。
  • CIFAR-10 實驗每張圖像 32x32x3。五萬張訓練一萬測試共十種類別。實驗結果也是帶有殘差網路較好。
  • 做了每層殘差響應分佈分析,BN 層輸出的標準差相當於輸出信號大小。前幾層大後面越來越小。而且殘差網路比一般網路有更小的響應。因此可以得正越後層恆等映射足夠好的話他是會逐漸擬合成0。
  • 建構 1202層的殘差網路,雖然能收斂也沒有優化困難問題,但是測試集也沒有 110 層好。模型太深參數過多,表示空間過於大對小數據而言沒有必要。因此過擬合。
  • 殘差網路在目標檢測 PASCAL voc 和微軟 coco 資料集都有不錯成績
  • Dropout 在 AlexNet 被提出

Reference