介紹
Resnet模型可謂是CNN分類模型中效果最效、應用最廣泛讽膏、在業(yè)界最為成功的深度學習模型之一桨醋。
它出道以來有許多的變形棚瘟。像最初論文中提出的Resnet v1,后來由Torch framework實現中改良過的Resnet v1.5喜最,以及今天在這篇博文里將要詳細描述的Resnet v2偎蘸。
Resnet v1
對于Resnet v1,大家應該不陌生。區(qū)區(qū)也曾在此系列的一篇博文中有詳細講述過它(可見經典分類CNN模型系列其四:Resnet)迷雪。
當然在處理不同類型數據集(如CIFAR10或Imagenet)時限书,它一般會有兩種不同的類型表示。如下圖所示章咧,分別為用于處理CIFAR10與Imagenet的Resnet v1中所用的Residual模塊倦西。
可以看同它們的主要差別在于處理Imagenet這種較復雜case時,為了計算量減省考慮赁严,而引入了1x1 conv的bottleneck模塊扰柠。
Resnet v1.5
Data scientist在實用Torch來實現Resnet v1時,發(fā)現若在下采樣時將原來在1x1 conv上作的工作挪到中間的3x3 conv上來進行(即使3x3 conv的步長為2)疼约,可以比原來的Resnet v1實現
得到更快卤档、更好、更穩(wěn)定的結果程剥。當下的所謂Resnet v1實現本質上都已經是這里說的最先在Torch上實現過的Resnet v1.5劝枣。
但是因為它將下采樣的工作向后推遲到了中間的3x3,因此每次訓練iteration倡缠,它需要花去更多的時間哨免,算下來整個training需要的時間其實它比原來的Resnet v1實現還要多上12%,另外其在
進行后期推理工作時也會使得整個throughput下降約6%昙沦。但為此而換來的準確率的穩(wěn)定提升還是值得的琢唾。
Resnet v2
Resnet v2是Resnet v1原來那幫Microsoft的作者們進一步研究、理論分析Residual模塊及它在整體網絡上的結構盾饮,并對它進行大量實現論證后得到的成果采桃。
只看其殘差模塊與Resnet v1中所使用的差別還是挺簡單的,可見于下圖丘损。
簡言之普办,在Resnet v2中它將BN/ReLu這些activation操作挪到了Conv(真正的weights filter操作)之前。
如果你只是想明白Resnet v2與Resnet v1之間的區(qū)別徘钥,以便于決定去自己使用衔蹲,那么看到此就已足夠了,不必再向下看呈础,多余的時間大可以去踢踢球舆驶,聽聽歌,讀些金庸而钞。沙廉。
(致敬94歲后含笑而逝的文化巨人,作為80后的一員臼节,我曾讀過他的每一本小說撬陵,精神曾在他塑造的武俠世界中很是享受過珊皿。)。
如果你想明白為何要這樣做巨税,并想學習下別人是如何針對具體問題是如何理論上分析蟋定,并不斷設計改進的模型進行實驗的,那么可以接著向下讀垢夹。
Identity mapping函數的最優(yōu)選擇
Identity mapping理論上的優(yōu)勢
首先先上來一串與殘差模塊相關的一串公式吧溢吻。
下面公式1维费,2表示了典型的殘差模塊概念果元。yl為l層elementwise sum后的輸出,xl為此層的輸入犀盟,F(xl, Wt)為殘差處理模塊(就是1x1 conv -> 3x3 conv ->1x1 conv的這坨東東)而晒。
然后xl+1表示的是第l+1層的輸入,它是通過對l層的輸出進行f函數變換后得到的(在Resnet v1中f為ReLu)阅畴。h為Identity mapping倡怎,在Resnet v1中直接將h(xl) = xl這樣處理了。
如果f也是identity mapping贱枣,像h一樣直接將輸出等于輸入监署,那么可得到下式3。進行遞歸考慮整個模型又可得到公式4纽哥。
基于上面公式4與backward propagation钠乏,我們可以得到此時的gradient計算公式5。
至此公式總算可以告一段落了春塌∠埽總結下吧。
從上面公式4與5中可以看出只壳,在此模型下(直接將h作為identity mapping)俏拱,信息可以從任一Unit向前或向后直接、透明地傳輸給下一Unit吼句。
Idnetity mapping競爭對手的不堪
作者為了表明Identity mapping在Residual模塊中的最優(yōu)锅必,舉了許多其它的h映射函數來進行理論與實現分析,結果它們紛紛敗北惕艳,無一幸免搞隐。這五個陣亡者可見于下表。
下表為Identity mapping秒掉這些競爭對手的戰(zhàn)績尔艇。
Activation函數的輸用
在原來的Resnet v1中每個殘差模塊的elementwise sum后就會有一個ReLu activation尔许。顯然不能滿足像上面分析過的那樣將f作為identity mapping(直接 y = x)的需求。
為了將Elementwise sum后的ReLu去掉终娃,作者又開始動起了腦筋味廊。他們試著將ReLu/BN這些Activation函數的位置不斷變動(考慮到讓殘差能夠表示其功能本身需要的(-∞, +∞),同時也
努力考慮pre-activation/after-activation可能對前后Residual模塊的影響)余佛,如下為幾經折騰后的幾種變形與所得到的實驗結果柠新。
終于他們異常欣喜地發(fā)現在將BN + ReLu放到Conv之前后,模型訓練的速度加塊了辉巡、精度提高了恨憎、也更容易回避overfitting的問題了。(大功告成=奸埂)
下面為Pre-activation residual unit的構造過程憔恳。
實驗結果
不論是CIFAR10,還是Imagenet上净蚤,擁有較多層的钥组,使用了Pre-activation residual unit的resnet v2都取得了比resnet v1(或resnet v1.5)更好的結果。
下面可看出在Imagenet上Resnet v2即使與當時剛剛提出沒多久的Inception v3相比結果也有不小優(yōu)勢今瀑。
參考文獻
- Deep Residual Learning for Image Recognition, Kaiming-He, 2015
- Identity Mappings in Deep Residual Networks, Kaiming-He, 2016
- https://github.com/mlperf/training/tree/master/image_classification/tensorflow/official/resnet
- https://github.com/facebook/fb.resnet.torch