@
0. 論文鏈接
1. 概述
從AlexNet出現后,后面的模型包括VGG,GoogLe-Net等都是想辦法讓網絡邊更寬更深,因為大量的實驗證明網絡更深更寬它的性能會更好。比較容易想到的是一味的增加深度會使得梯度爆炸/消失,但這問題在很大程度上使用標准化初始賦值跟中間層(BN)解決。但經過實驗發現,如果一味的堆疊層數,性能反而會更差(無論在訓練集還是測試集上)。
在上述背景下,作者提出了一種殘差網絡,即當前layer不只從上一層獲取輸入,也從前面某一層獲取輸入,這種“捷徑”不會增加額外的參數或者計算量,同時可以現有的庫進行構建而不用做改進。如下圖:
作者在ImageNet使用了152層的殘差網絡,最終獲得了 3.57%的top-5 error,然后獲得了各種第一。之前的工作也有與“Residual Representation” 與 “Shortcut Connections”相關的,他們的研究也證明了在不同尺度上進行殘差學習有助於模型的收斂與性能, Shortcut Connections有助於防止梯度消失/爆炸(Google-Net直接連接輔助分類器)
2. 殘差學習
讀了好一會才理解文章中構建殘差塊的動機與想法是什么,主要還是讀的文章少了,對了“underlying mapping”,“identity mapping”等的理解產生了奇異,導致久久不能理解文中的表達的意思。下面詳細的說一下殘差學習這方面。
首先,按照正常的想法, 在一個淺層模型加一些其他的layer他的訓練錯誤率最高不能高過原來的淺層網絡,因為如果淺層網絡已經是最優的了, 那么我完全可以后面添加的layer自身映射(identity mapping),前面的layer相當於直接從最優淺層網絡復制過來,這樣即使是深層網絡其實相當於原來的淺層網絡,中間某些層來學習前面網絡的某一層,學習的輸入feature map本身,可是經過大量實驗發現網絡層增加后錯誤率會高不少,如下圖:
愷明大神從這種反常的線性中得到了啟發,是不是對於通過幾層非線性layer去學習“自身映射”有一定的困難,因此他提出了一種殘差學習的方式:
假設通過幾個非線性層可以擬合任意復雜函數(這也是神經網絡一直討論與爭議的一個點,不過好像今年的ICML有一篇文章證明了在網絡足夠寬的情況下,確實可以擬合任意復雜函數),用\(H(X)\)表示一些堆疊網絡層要擬合的最優映射,\(X\)表示這幾層layer中第一層的輸入,那么假設那一些堆疊網絡層可以擬合\(H(X)\)的話,當然也可以擬合殘差函數\(F(X) := H(X)-X\)(假設輸入與輸出的維數相同),因此原來要擬合函數也就是\(F(X) + X\),極端一點,如果自身映射是最優的,那么相對用幾個堆疊的非線性網絡去擬合一個identity mapping,把殘差(\(F(X)\))逼近於0更容易一點。
3. Identity Mapping by shortcuts
可以把一個殘差塊表示成如下所示:
其中x跟y是殘差塊中間堆疊layer的輸入與輸出, \(F(x, \{W_i\})\)代表要學習的殘差函數。因為這里必須保證x與 \(F(x, \{W_i\})\)輸出的維度相同,因此如果維度不同可以通過\(W_s\)來調節相同的維度,殘差塊通常包含2,3或者更多的layers,一層相當於一個線性映射,效果不好。對於卷積層,其實就是將對應的兩個feature map相加,channel by channel。
4. Network Architectures
對於網絡結構,文章中的結構圖十分清晰:
網絡參數圖:
“bottleneck” building block:
使用這種block速度更快,減少運算量,兩個1x1卷積用來先減少維度讓3x3計算再恢復原來的維度,這樣可以減少計算。
普通網絡
遵循兩個設計規則:(關於第二條看不太懂)
- 對於相同的尺寸的輸出feature map,每層必須含有相同數量的過濾器。
- 如果feature map的尺寸減半,則過濾器的數量必須翻倍,以保持每層的時間復雜度。
通過觀察可以看到,網絡直接通過卷積層(stride=2)進行下采樣,網絡末端以全局的均值池化層結束,有1000路的全連接層(Softmax激活)。含有權重的網絡層的總計為34層
另外,當輸入輸出尺寸發生增加時(圖3中的虛線的快捷連接),我們考慮兩個策略:
(a)快捷連接仍然使用自身映射,對於維度的增加用零來填補空缺。此策略不會引入額外的參數;
(b)\(W_s\)(之前公式介紹過的)被用來匹配尺寸(靠1×1的卷積完成)。
對於這兩種選項,當快捷連接在兩個不同大小的特征圖譜上出現時,用stride=2來處理。
5. 訓練細節
ImageNet中我們的實現遵循[21,40]的實踐。調整圖像大小,其較短的邊在[256,480]之間進行隨機采樣,用於尺度增強[40]。224×224裁剪是從圖像或其水平翻轉中隨機采樣,並逐像素減去均值[21]。使用了[21]中的標准顏色增強。在每個卷積之后和激活之前,我們采用批量歸一化(BN)[16]。我們按照[12]的方法初始化權重,從零開始訓練所有的簡單/殘差網絡。我們使用批大小為256的SGD方法。學習速度從0.1開始,當誤差穩定時學習率除以10,並且模型訓練高達\(60×10^4\)次迭代。我們使用的權重衰減為0.0001,動量為0.9。根據[16]的實踐,我們不使用丟棄[13]。
在測試階段,為了比較學習我們采用標准的10-crop測試[21]。對於最好的結果,我們采用如[40, 12]中的全卷積形式,並在多尺度上對分數進行平均(圖像歸一化,短邊位於\(\{224, 256, 384, 480, 640\}\)中)。
PS: 因為要復現Resnet,所以這一段直接找了網上的翻譯
6. 實驗
具體可以看論文這里主要可以看幾個數據,首先解釋一下集中shortcut:
A 零填充捷徑用來增加維度,所有的捷徑都是沒有參數的自身捷徑
B 投影捷徑用來增加維度,其他的捷徑都是沒有參數的自身捷徑。
C 所有的捷徑都是投影捷徑
實驗如下:
可以發現,C比BA要好很多,但是實驗中大多用的是B,特別是在深度ResNet中,因為用C維度太大,時間計算量都太大。
另外比較plain Net的實驗如下,可以發現沒有ResNet網絡更深性能反而不好: