神經網絡(十一) 殘差網絡
前言
我們都知道增加網絡的寬度和深度可以很好的提高網絡的性能,深的網絡一般都比淺的的網絡效果好,比如說一個深的網絡A和一個淺的網絡B,那A的性能至少都能跟B一樣,為什麽呢?因為就算我們把A的網絡參數全部遷移到B的前面幾層,而B後面的層只是做一個等價的映射,就達到了A網絡的一樣的效果。一個比較好的例子就是VGG,該網絡就是在AlexNex的基礎上通過增加網絡深度大幅度提高了網絡性能。
但事實真的是這樣的嗎?不然,通過實驗我們發現,當網絡層數達到一定的數目以後,網絡的性能就會飽和,再增加網絡的性能就會開始退化,但是這種退化並不是由過擬合引起的,因為我們發現訓練精度和測試精度都在下降,這說明當網絡變得很深以後,深度網絡就變得難以訓練了。
介紹
ResNet的出現其實就是為了解決網絡深度變深以後的性能退化問題。
ResNet就是用這種跳躍結構來作為網絡的基本結構。為什麽要使用這種結構呢?作者認為,本來我們要優化的目標是H(x)=F(x)+x(x就是該結構的輸入)但是通過這種結構以後就把優化的目標由H(x)轉化為H(x)-x。
那麽問題又來了,優化目標轉化後又有什麽用呢,為什麽可以通過這種方式來解決退化問題呢?我們之前說到,深網絡在淺網絡的基礎上只要上面幾層做一個等價映射就可以達到淺網絡同樣的效果,但是為什麽不行呢,就是因為我們的算法很難將其訓練到那個程度,也就是說沒辦法將上面幾層訓練到一個等價映射,以至於深網絡最後達到了一個更差的效果。那麽這時,我們把訓練目標轉變,由原來的H(x)轉為H(x)-x(殘差網絡本質)
也就是說,在一個網絡中(假設有5層),如果前面四層已經達到一個最優的函數,那第五層就是沒有必要的了,這時我們通過這種跳躍結構,我們的優化目標就從一個等價映射變為逼近0了,逼近其他任何函數都會造成網絡退化。通過這種方式就可以解決網絡太深難訓練的問題。
事實上,resnet是“shortcut connections”的在connections是在恒等映射下的特殊情況,它沒有引入額外的參數和計算復雜度
實現
殘差塊的結構如下圖:
它有二層,如下表達式,其中σ代表非線性函數ReLU
然後通過一個shortcut,和第2個ReLU,獲得輸出y
當需要對輸入和輸出維數進行變化時(如改變通道數目),可以在shortcut時對x做一個線性變換Ws,如下式,然而實驗證明x已經足夠了,不需要再搞個維度變換,除非需求是某個特定維度的輸出,如文章開頭的resnet網絡結構圖中的虛線,是將通道數翻倍。
實驗證明,這個殘差塊往往需要兩層以上,單單一層的殘差塊(y=W1x+x)並不能起到提升作用。
殘差網絡的確解決了退化的問題,在訓練集和校驗集上,都證明了的更深的網絡錯誤率越小,如下圖
實際中,考慮計算的成本,對殘差塊做了計算優化,即將兩個3x3的卷積層替換為1x1 + 3x3 + 1x1, 如下圖。新結構中的中間3x3的卷積層首先在一個降維1x1卷積層下減少了計算,然後在另一個1x1的卷積層下做了還原,既保持了精度又減少了計算量。
神經網絡(十一) 殘差網絡