2.4 残差网络为什么有用-深度学习第四课《卷积神经网络》-Stanford吴恩达教授
| 2.3 殘差網絡 | 回到目錄 | 2.5 網絡中的網絡以及1x1卷積 |
殘差網絡為什么有用 (Why ResNets work?)
為什么ResNets能有如此好的表現,我們來看個例子,它解釋了其中的原因,至少可以說明,如何構建更深層次的ResNets網絡的同時還不降低它們在訓練集上的效率。希望你已經通過第三門課了解到,通常來講,網絡在訓練集上表現好,才能在Hold-Out交叉驗證集或dev集和測試集上有好的表現,所以至少在訓練集上訓練好ResNets是第一步。
先來看個例子,上節課我們了解到,一個網絡深度越深,它在訓練集上訓練的效率就會有所減弱,這也是有時候我們不希望加深網絡的原因。而事實并非如此,至少在訓練ResNets網絡時,并非完全如此,舉個例子。
假設有一個大型神經網絡,其輸入為 XXX ,輸出激活值 a[l]a^{[l]}a[l] 。假如你想增加這個神經網絡的深度,那么用Big NN表示,輸出為 a[l]a^{[l]}a[l] 。再給這個網絡額外添加兩層,依次添加兩層,最后輸出為 a[l+2]a^{[l+2]}a[l+2] ,可以把這兩層看作一個ResNets塊,即具有捷徑連接的殘差塊。為了方便說明,假設我們在整個網絡中使用ReLU激活函數,所以激活值都大于等于0,包括輸入 XXX 的非零異常值。因為ReLU激活函數輸出的數字要么是0,要么是正數。
我們看一下 a[l+2]a^{[l+2]}a[l+2] 的值,也就是上節課講過的表達式,即 a[l+2]=g(z[l+2]+a[l])a^{[l+2]}=g(z^{[l+2]}+a^{[l]})a[l+2]=g(z[l+2]+a[l]) ,添加項 a[l]a^{[l]}a[l] 是剛添加的跳躍連接的輸入。展開這個表達式 a[l+2]=g(W[l+2]a[l+1]+b[l+2]+a[l])a^{[l+2]}=g(W^{[l+2]}a^{[l+1]}+b^{[l+2]}+a^{[l]})a[l+2]=g(W[l+2]a[l+1]+b[l+2]+a[l]) ,其中 z[l+2]=W[l+2]a[l+1]+b[l+2]z^{[l+2]}=W^{[l+2]}a^{[l+1]}+b^{[l+2]}z[l+2]=W[l+2]a[l+1]+b[l+2] 。注意一點,如果使用L2正則化或權重衰減,它會壓縮 W[l+2]W^{[l+2]}W[l+2] 的值。如果對 bbb 應用權重衰減也可達到同樣的效果,盡管實際應用中,你有時會對 bbb 應用權重衰減,有時不會。這里的 WWW 是關鍵項,如果 W[l+2]=0W^{[l+2]}=0W[l+2]=0 ,為方便起見,假設 b[l+2]=0b^{[l+2]}=0b[l+2]=0 ,這幾項就沒有了,因為它們( W[l+2]a[l+1]+b[l+2]W^{[l+2]}a^{[l+1]}+b^{[l+2]}W[l+2]a[l+1]+b[l+2] )的值為0。最后 a[l+2]=g(a[l])=a[l]a^{[l+2]}=g(a^{[l]})=a^{[l]}a[l+2]=g(a[l])=a[l] ,因為我們假定使用ReLU激活函數,并且所有激活值都是非負的, g(a[l])g(a^{[l]})g(a[l]) 是應用于非負數的ReLU函數,所以 a[l+2]=a[l]a^{[l+2]}=a^{[l]}a[l+2]=a[l] 。
結果表明,殘差塊學習這個恒等式函數并不難,跳躍連接使我們很容易得出 a[l+2]=a[l]a^{[l+2]}=a^{[l]}a[l+2]=a[l] 。這意味著,即使給神經網絡增加了這兩層,它的效率也并不遜色于更簡單的神經網絡,因為學習恒等函數對它來說很簡單。盡管它多了兩層,也只把 a[l]a^{[l]}a[l] 的值賦值給 a[l+2]a^{[l+2]}a[l+2] 。所以給大型神經網絡增加兩層,不論是把殘差塊添加到神經網絡的中間還是末端位置,都不會影響網絡的表現。
當然,我們的目標不僅僅是保持網絡的效率,還要提升它的效率。想象一下,如果這些隱藏層單元學到一些有用信息,那么它可能比學習恒等函數表現得更好。而這些不含有殘差塊或跳躍連接的深度普通網絡情況就不一樣了,當網絡不斷加深時,就算是選用學習恒等函數的參數都很困難,所以很多層最后的表現不但沒有更好,反而更糟。
我認為殘差網絡起作用的主要原因就是這些殘差塊學習恒等函數非常容易,你能確定網絡性能不會受到影響,很多時候甚至可以提高效率,或者說至少不會降低網絡的效率,因此創建類似殘差網絡可以提升網絡性能。
除此之外,關于殘差網絡,另一個值得探討的細節是,假設 z[l+2]z^{[l+2]}z[l+2] 與 a[l]a^{[l]}a[l] 具有相同維度,所以ResNets使用了許多same卷積,所以這個 a[l]a^{[l]}a[l] 的維度等于這個輸出層的維度。之所以能實現跳躍連接是因為same卷積保留了維度,所以很容易得出這個捷徑連接,并輸出這兩個相同維度的向量。
如果輸入和輸出有不同維度,比如輸入的維度是128, a[l+2]a^{[l+2]}a[l+2] 的維度是256,再增加一個矩陣,這里標記為 WsW_sWs? , WsW_sWs? 是一個256×128維度的矩陣,所以 Wsa[l]W_sa^{[l]}Ws?a[l] 的維度是256,這個新增項是256維度的向量。你不需要對 WsW_sWs? 做任何操作,它是網絡通過學習得到的矩陣或參數,它是一個固定矩陣,padding值為0,用0填充 a[l]a^{[l]}a[l] ,其維度為256,所以者幾個表達式都可以。
最后,我們來看看ResNets的圖片識別。這些圖片是我從何凱明等人論文中截取的,這是一個普通網絡,我們給它輸入一張圖片,它有多個卷積層,最后輸出了一個Softmax。
如何把它轉化為ResNets呢?只需要添加跳躍連接。這里我們只討論幾個細節,這個網絡有很多層3×3卷積,而且它們大多都是same卷積,這就是添加等維特征向量的原因。所以這些都是卷積層,而不是全連接層,因為它們是same卷積,維度得以保留,這也解釋了添加項 z[l+2]+a[l]z^{[l+2]}+a^{[l]}z[l+2]+a[l] (維度相同所以能夠相加)。
ResNets類似于其它很多網絡,也會有很多卷積層,其中偶爾會有池化層或類池化層的層。不論這些層是什么類型,正如我們在上一張幻燈片看到的,你都需要調整矩陣 WsW_sWs? 的維度。普通網絡和ResNets網絡常用的結構是:卷積層-卷積層-卷積層-池化層-卷積層-卷積層-卷積層-池化層……依此重復。直到最后,有一個通過softmax進行預測的全連接層。
以上就是ResNets的內容。使用1×1的過濾器,即1×1卷積,這個想法很有意思,為什么呢?我們下節課再講。
課程板書
| 2.3 殘差網絡 | 回到目錄 | 2.5 網絡中的網絡以及1x1卷積 |
總結
以上是生活随笔為你收集整理的2.4 残差网络为什么有用-深度学习第四课《卷积神经网络》-Stanford吴恩达教授的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2.3 残差网络-深度学习第四课《卷积神
- 下一篇: 2.5 网络中的网络及1x1卷积-深度学