前面我們對常用的經典網絡進行了介紹,可以查看前面文章:淺入淺出TensorFlow 6 - 實現經典網絡
隨着網絡越來越深,大家發現,僅僅靠 BN、ReLU、DropOut 等 Trick無法解決收斂問題,相反,網絡的加深帶來參數的增加。
基於之前的實踐經驗,我們知道:網絡並不是越深越好,一方面過多的參數容易導致過擬合(當然樣本足夠多可以一定程度上解決這個問題);另一方面,訓練結果會在真值周圍變化,導致網絡震盪。
借鑑之前的經驗,我們在訓練分類器的時候,用到的 GBDT 和 xgBoost 的思維,藉助殘差來解決 震盪問題。
ResNet 全稱是 Residual Network,每一個節點學到的不再是參數本身,而是殘差,這就決定了網絡有可能無限加深,基線不變,後面的節點學到的是對前面節點的補充,雖然有震盪,但震盪範圍越來越小,直到趨於0。
ResNet 的網絡結構借鑑了 HighWay,添加一條從 input到output的路徑,也就是shortcut連接,這是關鍵之處。
該模塊用公式描述爲:
對於輸入 x,通過中間函數 F(x,w) 進行參數學習,F也就是我們說的殘差函數。
模塊中間對應兩個Layer,每個 Layer 處理一個乘累加和一個 ReLU,F(x)+x 是在x的基礎上實現快捷連接,連接後又實現了一個 ReLU。
最早的 ResNet 是由 MSRA團隊提出的一個 152 層的網絡,在2015年的 ILSVRC2015 取得了冠軍,來看效果對比:
比14年的 VGG 和 GoogLeNet 好了不少,錯誤率 3.57 相當的惹眼,它的網絡結構是什麼樣的呢?不用想,肯定是一大串(都饞了吧?)
多個 Block單元 組成的一大串,目前幾種常用的ResNet網絡包括:ResNet-50/101/152,當然層數越多計算量越大,基於ResNet的改進我們也提前瞭解下,包括 Google的 Inception-ResNet-V2, Kaiming 的 ResNeXt等。
ok,我們將在接下來的文章裏介紹 ResNeXt。