非常深的網絡是很難訓練的,因爲存在梯度消失和梯度爆炸的問題;
由於網絡太深,反向傳播求導相乘項較多,當激活函數導數小於1,且初始權重不大時,過多的小數項(0~1.0)相乘結果趨於0,導致梯度消失;
當初始權重較大,激活函數接近1,這時容易導致梯度爆炸;
遠眺鏈接:可以從某一網絡層獲取激活,然後迅速反饋給另外一層,甚至是神經網絡的更深層;
利用遠眺鏈接構建能夠訓練深度網絡ResNets,有時超過100層;
殘差塊
將直接向後拷貝到網絡深層,,連接點在ReLu非線性激活前,線性激活之後
這樣的非線性輸出就變成
也就是說加上了這個殘差塊;
這個叫捷徑(shorcut),有時候會聽到另一個術語“遠眺鏈接”(skip connection),就是指跳過一層或好幾層,
將信息傳遞到神經網絡的更深層。
ResNet發明者發現用殘差塊可以訓練更深網絡,所以構建一個ResNet網絡就是通過將很多這樣的殘差塊堆積在一起,形成一個深度神經網絡。
殘差網絡Residual Network
如上圖所示,5個殘差塊鏈接在一起,構成一個殘差網絡;(除去藍色手寫部分,即是添加殘差塊之前的普通網絡plain network)
對比普通網絡,使用標準優化算法訓練一個普通網絡,如果沒有多餘的殘差,或者遠眺鏈接,憑經驗可知,隨網絡層數增加,
訓練錯誤會先增加後減小(如上圖左),而理論上應該訓練的越來越好纔對,因爲理論上網絡越深越好。
實際上,對於普通網絡,網絡越深,用優化算法越難訓練,出現錯誤越多;
有了ResNets就不一樣,即使網絡再深,訓練的表現也不錯,甚至有人在1000多層的神經網絡做過實驗。
這種方式有助於解決梯度消失和梯度爆炸的問題;讓我們可以在訓練更深網絡的時候,又能保證良好的性能。
也許從另外一個角度看,網絡會變得臃腫,但是ResNet確實在訓練深度網絡方面非常有效;
爲什麼ResNet能有如此好表現呢?
通常來講,一個網絡深度越深,它在訓練集上訓練的效率就會有所減弱,這也是有時候我們不希望加深網絡的原因。而事實並非如此,至少在訓練 ResNets
網絡時,並非完全如此,舉個例子。
如圖,爲方便說明,假設都是採用ReLu激活函數,在一個大網絡big NN後面添加兩層,
如果使用L2正則化會壓縮的值,對b應用權重衰減也有同樣效果,雖然不常用;
這裏假設w=0,b=0,這幾項就沒了,
也就是這個遠眺鏈接是我們很容易得出恆等式,
這意味着即使給神經網絡增加了這兩層,網絡的效率不遜色於普通網絡,因爲學習恆等式相對容易;
而相對普通網絡,添加殘差網絡可以學習到更多隱藏參數;
因此創建類似的殘差網絡可以提升網絡性能。
另一個值得注意,和一般具有相同維度,之所以能實現跳躍鏈接是因爲same卷積保留了維度,所以很容易得出跳躍鏈接,並輸出兩個相同維度的向量。
如果輸入和輸出有不同維度,那麼就會生出一個矩陣,將和維度統一。
ResNet
2015年ImageNet優勝者,由微軟研究院開發
https://arxiv.org/pdf/1512.03385.pdf
下面是從論文中截取的網絡
上圖是個普通網絡,輸入一張圖片,結果多個卷基層,最後輸出一個softmax.
添加跳躍鏈接(same卷積保留了網絡維度),就構成一個殘差網絡。
ResNet in Keras
from keras.applications.resnet50 import ResNet50
model = ResNet50(weights='imagenet', include_top=False)