殘差網(wǎng)絡為什么有用赔嚎?(Why ResNets work?)
為什么ResNets能有如此好的表現(xiàn)膘盖,我們來看個例子胧弛,它解釋了其中的原因,至少可以說明侠畔,如何構建更深層次的ResNets網(wǎng)絡的同時還不降低它們在訓練集上的效率结缚。
通常來講,網(wǎng)絡在訓練集上表現(xiàn)好软棺,才能在Hold-Out交叉驗證集或dev集和測試集上有好的表現(xiàn)红竭,所以至少在訓練集上訓練好ResNets是第一步。
先來看個例子喘落,之前我們了解到茵宪,一個網(wǎng)絡深度越深,它在訓練集上訓練的效率就會有所減弱瘦棋,這也是有時候我們不希望加深網(wǎng)絡的原因稀火。而事實并非如此,至少在訓練ResNets網(wǎng)絡時赌朋,并非完全如此凰狞,舉個例子篇裁。
假設有一個大型神經網(wǎng)絡,其輸入為X赡若,輸出激活值a^([l])达布。假如你想增加這個神經網(wǎng)絡的深度,那么用Big NN表示逾冬,輸出為a^[l] 黍聂。再給這個網(wǎng)絡額外添加兩層,依次添加兩層身腻,最后輸出為a^[l+2] 分冈,可以把這兩層看作一個ResNets塊,即具有捷徑連接的殘差塊霸株。為了方便說明雕沉,假設我們在整個網(wǎng)絡中使用ReLU激活函數(shù),所以激活值都大于等于0去件,包括輸入X的非零異常值坡椒。因為ReLU激活函數(shù)輸出的數(shù)字要么是0,要么是正數(shù)尤溜。
我們看一下a^[l+2] 的值倔叼,也就是上節(jié)課講過的表達式,即a^[l+2] =g(z^[l+2] +a^[l] )宫莱,添加項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] 授霸。
注意一點巡验,如果使用L2正則化或權重衰減,它會壓縮W^[l+2] 的值碘耳。如果對b應用權重衰減也可達到同樣的效果显设,盡管實際應用中,你有時會對b應用權重衰減辛辨,有時不會捕捂。這里的W是關鍵項,如果W^[l+2] =0斗搞,為方便起見指攒,假設b^[l+2] =0,這幾項就沒有了僻焚,因為它們(W^[l+2] a^[l+1] +b^[l+2] )的值為0允悦。最后a^[l+2] = g(a^([l]) )=a^[l] ,因為我們假定使用ReLU激活函數(shù)溅呢,并且所有激活值都是非負的澡屡,g(a^([l]) )是應用于非負數(shù)的ReLU函數(shù)猿挚,所以a^([l+2])=a^([l])。
結果表明驶鹉,殘差塊學習這個恒等式函數(shù)并不難绩蜻,跳躍連接使我們很容易得出a^[l+2] =a^[l] 。這意味著室埋,即使給神經網(wǎng)絡增加了這兩層办绝,它的效率也并不遜色于更簡單的神經網(wǎng)絡,因為學習恒等函數(shù)對它來說很簡單姚淆。盡管它多了兩層孕蝉,也只把a^([l])的值賦值給a^[l+2] 。所以給大型神經網(wǎng)絡增加兩層腌逢,不論是把殘差塊添加到神經網(wǎng)絡的中間還是末端位置降淮,都不會影響網(wǎng)絡的表現(xiàn)。
當然搏讶,我們的目標不僅僅是保持網(wǎng)絡的效率佳鳖,還要提升它的效率。
想象一下媒惕,如果這些隱藏層單元學到一些有用信息系吩,那么它可能比學習恒等函數(shù)表現(xiàn)得更好。而這些不含有殘差塊或跳躍連接的深度普通網(wǎng)絡情況就不一樣了妒蔚,當網(wǎng)絡不斷加深時穿挨,就算是選用學習恒等函數(shù)的參數(shù)都很困難,所以很多層最后的表現(xiàn)不但沒有更好肴盏,反而更糟科盛。
我認為殘差網(wǎng)絡起作用的主要原因就是這些殘差塊學習恒等函數(shù)非常容易,你能確定網(wǎng)絡性能不會受到影響叁鉴,很多時候甚至可以提高效率土涝,或者說至少不會降低網(wǎng)絡的效率,因此創(chuàng)建類似殘差網(wǎng)絡可以提升網(wǎng)絡性能幌墓。
除此之外,關于殘差網(wǎng)絡冀泻,另一個值得探討的細節(jié)是常侣,假設z^[l+2] 與a^([l])具有相同維度,所以ResNets使用了許多same卷積弹渔,所以這個a^[l] 的維度等于這個輸出層的維度胳施。之所以能實現(xiàn)跳躍連接是因為same卷積保留了維度,所以很容易得出這個捷徑連接肢专,并輸出這兩個相同維度的向量舞肆。
如果輸入和輸出有不同維度焦辅,比如輸入的維度是128,a^[l+2] 的維度是256椿胯,再增加一個矩陣筷登,這里標記為W_s,W_s是一個256×128維度的矩陣哩盲,所以W_s a^[l] 的維度是256前方,這個新增項是256維度的向量。你不需要對W_s做任何操作廉油,它是網(wǎng)絡通過學習得到的矩陣或參數(shù)惠险,它是一個固定矩陣,padding值為0抒线,用0填充a^([l])班巩,其維度為256,所以者幾個表達式都可以嘶炭。
最后趣竣,我們來看看ResNets的圖片識別。這些圖片是我從何凱明等人論文中截取的旱物,這是一個普通網(wǎng)絡遥缕,我們給它輸入一張圖片,它有多個卷積層宵呛,最后輸出了一個Softmax单匣。
如何把它轉化為ResNets呢?
只需要添加跳躍連接宝穗。這里我們只討論幾個細節(jié)户秤,這個網(wǎng)絡有很多層3×3卷積,而且它們大多都是same卷積逮矛,這就是添加等維特征向量的原因鸡号。所以這些都是卷積層,而不是全連接層须鼎,因為它們是same卷積鲸伴,維度得以保留,這也解釋了添加項z^[l+2] +a^[l] (維度相同所以能夠相加)晋控。
ResNets類似于其它很多網(wǎng)絡汞窗,也會有很多卷積層,其中偶爾會有池化層或類池化層的層赡译。
不論這些層是什么類型仲吏,正如我們在上圖看到的,你都需要調整矩陣W_s的維度。普通網(wǎng)絡和ResNets網(wǎng)絡常用的結構是:卷積層-卷積層-卷積層-池化層-卷積層-卷積層-卷積層-池化層……依此重復裹唆。直到最后誓斥,有一個通過softmax進行預測的全連接層。
以上就是ResNets的內容许帐。使用1×1的過濾器劳坑,即1×1卷積,這個想法很有意思舞吭,為什么呢泡垃?我們下節(jié)筆記再講。