ResNet 残差、退化等细节解读
說實話ResNet的網(wǎng)絡(luò)結(jié)構(gòu)參數(shù)真沒有什么可以解讀的,在本博客中我們主要了解(1)傳統(tǒng)深度學(xué)習(xí)網(wǎng)絡(luò)的退化問題(2)ResNet到底解決了什么問題?(3)簡單了解下ResNet和殘差結(jié)構(gòu)(4)殘差結(jié)構(gòu)如何解決退化問題(5)殘差結(jié)構(gòu)還有什么其他作用?
2016年CVPR Best Paper??https://arxiv.org/abs/1512.03385? ?何凱明大神的作品。。有空多看看。
1. 深度學(xué)習(xí)網(wǎng)絡(luò)的退化問題
? ? ? ? 自AlexNet以來,以CNN為基石的網(wǎng)絡(luò)模型越來越深(層數(shù)越來越多)。AlexNet有5個卷積層,VGG有19層,GoogleNet(?也稱Inception_v1)有22層。之所以這么一直在增加網(wǎng)絡(luò)深度,是有這么一個理論:根據(jù)卷積的計算方式,我們認(rèn)為深度卷積網(wǎng)絡(luò)逐層整合了不同層級的特征,伴隨著模型前向推演,模型獲得了更加抽象、更多層級、更加豐富的圖像特征,進(jìn)而獲得了更好的模型性能。因此我們會傾向于使用更深層次的網(wǎng)絡(luò)結(jié)構(gòu)!!!!
補(bǔ)充:低層級特征擁有更多的細(xì)節(jié)信息;高層級特征更加抽象,能夠更好的表達(dá)圖像局部或者整體的意義。
? ? ? ? 但是經(jīng)過試驗證明,很深的網(wǎng)絡(luò)一般會有兩個問題:
? ? ?(1)在很深的網(wǎng)絡(luò)層中,由于參數(shù)初始化一般更接近0,這樣在訓(xùn)練過程中通過反向傳播更新淺層網(wǎng)絡(luò)的參數(shù)時,很容易隨著網(wǎng)絡(luò)的深入而導(dǎo)致梯度消失,淺層的參數(shù)無法更新。
? ? ?(2)當(dāng)網(wǎng)絡(luò)達(dá)到一定深度后,模型性能會暫時陷入一個瓶頸很難增加,當(dāng)網(wǎng)絡(luò)繼續(xù)加深后,模型在測試集上的性能反而會下降!這其實就是深度學(xué)習(xí)退化(degradation)!
? ? ? ? 來看一下ResNet論文中的實驗結(jié)果圖。
下圖簡單來講,就是在CIFAR-10這個數(shù)據(jù)集上,分別使用20層和56層的神經(jīng)網(wǎng)絡(luò)去訓(xùn)練。左圖是訓(xùn)練誤差,右圖是測試誤差。
我們看圖可以發(fā)現(xiàn)無論是在訓(xùn)練集還是在測試集上,56層的神經(jīng)網(wǎng)絡(luò)性能都不如20的神經(jīng)網(wǎng)絡(luò)。
注意:造成這種現(xiàn)象的原因有(1)過擬合(2)梯度消失/梯度爆炸(3)網(wǎng)絡(luò)退化。
(1)不可能是過擬合
? ? ?? ?過擬合是過多的擬合了訓(xùn)練集,因此在訓(xùn)練集上效果好(偏差低),而在測試集上效果差(方差高)。但是我們發(fā)現(xiàn)無論是訓(xùn)練集誤差還是測試集誤差其實都在下降,只是幅度不一樣。這說明了更深的網(wǎng)絡(luò)性能不好是因為網(wǎng)絡(luò)沒有被訓(xùn)練好,其原因是后面的多層非線性網(wǎng)絡(luò)無法通過訓(xùn)練去逼近恒等映射網(wǎng)絡(luò)。
解釋一下上面紅字的意思:通常認(rèn)為在同一個訓(xùn)練集上,深層網(wǎng)絡(luò)的性能無論如何都不應(yīng)該比淺層網(wǎng)絡(luò)差。假設(shè)A是一個56層的網(wǎng)絡(luò),B是一個20層的網(wǎng)絡(luò),若想讓A和B擁有同樣的性能,只需要將A中的20層替換為B,然后將A中剩下的36層全部優(yōu)化為恒等映射(即輸入=輸出)。但是實驗證明,后面36層的非線性網(wǎng)絡(luò)很難學(xué)習(xí)逼近恒等映射(看圖即可得到)。
(2)不是梯度消失/梯度爆炸
? ? ?? ?作者在論文中說到,理論上的梯度消失和梯度爆炸都應(yīng)該被批量歸一化 Batch normalization(BN)解決了。BN通過規(guī)整數(shù)據(jù)的分布解決梯度消失/爆炸的問題。
2. 深層CNN為何發(fā)生退化??and ResNet到底解決了什么問題?
? ? ?? ?比較好的解釋來自于這篇2017年的論文??The Shattered Gradients Problem: If resnets are the answer, then what is the question?
? ? ?? ?論文大意是當(dāng)神經(jīng)網(wǎng)絡(luò)越來越深,在反向傳播時候,反傳回來的梯度之間的相關(guān)性會越來越差,最后接近白噪聲。因為我們知道圖像是具備局部相關(guān)性的,那其實可以認(rèn)為梯度也應(yīng)該具備類似的相關(guān)性,這樣更新的梯度才有意義,如果梯度接近白噪聲,那梯度更新可能根本就是在做隨機(jī)擾動。即使BN過后梯度的模穩(wěn)定在了正常范圍內(nèi),但梯度的相關(guān)性實際上是隨著層數(shù)增加持續(xù)衰減的。而經(jīng)過證明,ResNet可以有效減少這種相關(guān)性的衰減。
? ? ?? ?理論上這種相關(guān)性的衰減越少,說明反向傳播回來的信息(可以說是相關(guān)性也可以說是梯度)的丟失/損失越少,梯度的更新就更具有實際意義(根據(jù)特定目標(biāo)的有規(guī)律更新而不是隨機(jī)擾動),在本節(jié)的論文中作者以相關(guān)性這個指標(biāo)為核心,分析了一系列的網(wǎng)絡(luò)結(jié)構(gòu)和激活函數(shù)的影響,得出結(jié)論:對于一共L層的網(wǎng)絡(luò),沒有殘差結(jié)構(gòu)的普通網(wǎng)絡(luò)相關(guān)性的衰減在(可以看到是指數(shù)級別的衰減),而ResNet的衰減率只有。注:這是論文作者給出的結(jié)論,我其實沒有證明,后續(xù)有時間再開一篇博客單獨說這個衰減率的計算!!!
? ? ?? ?因此,個人認(rèn)為 只要網(wǎng)絡(luò)由深度,無論是前向傳播還是反向傳播一定會出現(xiàn)信息的丟失或者說衰減,只是大小的問題,而ResNet 殘差結(jié)構(gòu)的存在使得這種梯度相關(guān)性的衰減得到了減少,延緩網(wǎng)絡(luò)退化問題的出現(xiàn)(注:這里說的是“延緩”,個人認(rèn)為無論如何緩解這種相關(guān)性的衰減,它必然存在,因此當(dāng)網(wǎng)絡(luò)到了一定深度之后,深層網(wǎng)絡(luò)的梯度對于淺層網(wǎng)絡(luò)權(quán)重更新的影響依然會變得非常小,這就又出現(xiàn)了退化,這種情況不可避免)。
3. 簡單了解下ResNet和殘差結(jié)構(gòu)
? ? ?? ?如果你是從本文1,2節(jié)按照順序看下來的,就會知道 想要神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)恒等映射是很困難的(原因有待考究,不好表述,可能每個人對于這個問題都有自己的見解),這也是為什么56層網(wǎng)絡(luò)的性能反而不如20層網(wǎng)絡(luò)的原因。那么現(xiàn)在我們不去學(xué)習(xí)恒等映射,換個思路,去學(xué)習(xí)輸入和輸出的差值,如果學(xué)習(xí)出的差值趨近于0,其實也能得到恒等映射,這樣間接實現(xiàn)了恒等映射。
? ? ?? 下圖就是ResNet 殘差結(jié)構(gòu)的一個抽象圖:我們假定輸入x,輸出y,需要學(xué)習(xí)的殘差函數(shù)f(x),那么現(xiàn)在的前向傳播就變成了
y = f(x) + x?。
? ? ?? 下面這張圖,就是ResNet論文中殘差結(jié)構(gòu)的實際結(jié)構(gòu)(原文提出了18,34,50,101,152 共計5種不同深度的ResNet,18和34層的ResNet的殘差結(jié)構(gòu)如下圖左所示,更深層的3種ResNet殘差結(jié)構(gòu)對應(yīng)右圖)
? ? ?? ResNet論文給出的所有模型的結(jié)構(gòu)說明:如果你還想學(xué)習(xí)關(guān)于網(wǎng)絡(luò)結(jié)構(gòu)的具體細(xì)節(jié),可以直接去搜下相關(guān)博客,這方面還是挺多的,這里就不多描述了。
4.?殘差結(jié)構(gòu)如何解決退化問題
? ? ?? 同樣假定輸入x,輸出y,需要學(xué)習(xí)的殘差函數(shù)f(x),引入ResNet后的前向傳播就變成了y = f(x) + x?
? ? ?? 在引入ResNet之前,如果我們想要使得深度網(wǎng)絡(luò)不出現(xiàn)退化問題,核心是要讓較深的網(wǎng)絡(luò)學(xué)習(xí)到的參數(shù)滿足y=x,但是實驗發(fā)現(xiàn),想要讓神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)到權(quán)重/參數(shù)滿足y = x 這一類恒等映射時比較困難。
? ? ?? 因此,ResNet想到避免去學(xué)習(xí)權(quán)重滿足 恒等映射,轉(zhuǎn)而將前向傳播修改成 y = f(x) + x?。我們發(fā)現(xiàn),想讓當(dāng)前神經(jīng)網(wǎng)絡(luò)層學(xué)習(xí)到恒等映射,只需要讓殘差函數(shù)f(x) = 0,而學(xué)習(xí)f(x) = 0 比直接學(xué)習(xí) y = x 要簡單多。為啥那?原因的話這篇博客給了一個解釋,博客地址:學(xué)習(xí)f(x) = 0 比 y = x簡單的多
? ? ?? 簡單的講就是,因為網(wǎng)絡(luò)權(quán)重的初始化一般偏向于0,前向傳播的計算往往是類似于這樣的 y = g(wx + b),當(dāng)權(quán)重w很小的時候 (wx+b)理論上也會很小,進(jìn)而網(wǎng)絡(luò)層學(xué)習(xí)殘差 f(x) = 0的更新參數(shù)能夠更快收斂。具體可以看看上面那篇博客,里面有圖。
5.?殘差結(jié)構(gòu)還有什么其他作用?
? ? ?? ResNet的殘差結(jié)構(gòu)本質(zhì)上是解決網(wǎng)絡(luò)退化問題,同時它還可以解決梯度消失。
? ? ?? 梯度消失:引入了殘差結(jié)構(gòu)后的前向傳播抽象的可以表示為?y = f(x) + x?,我們知道反向傳播的本質(zhì)是損失函數(shù)的鏈?zhǔn)角髮?dǎo)(求導(dǎo)結(jié)果的連乘),同時因為參數(shù)初始化一般接近于0,這樣在訓(xùn)練的過程中更新淺層網(wǎng)絡(luò)的參數(shù)時,很容易隨著網(wǎng)絡(luò)的深入而導(dǎo)致梯度消失,淺層的參數(shù)無法更新。但是,觀察新的前向傳播函數(shù)?y = f(x) + x?,你會發(fā)現(xiàn)求導(dǎo)結(jié)果是 1 + f'(x),也就是說無論f'(x)多么的小,因為1的存在,鏈?zhǔn)角髮?dǎo)的結(jié)果不會為0,進(jìn)而解決了梯度消失的問題。
補(bǔ)充:前些日子在面試CV崗位,也被問到了類似的問題,上述答案基本上是正確的,但是面試官進(jìn)一步問了如果前向傳播進(jìn)一步改為?y = f(x) + α * x?,如果α特別小,會有什么問題?特別大那?后來我想了想,應(yīng)該是這樣的,還是在求梯度鏈?zhǔn)角髮?dǎo)的時候,求導(dǎo)結(jié)果變成了 α + f'(x),當(dāng) α 特別小,其實相當(dāng)于沒加這一項,還是有可能出現(xiàn)梯度消失;當(dāng) α 特別大,很容易出現(xiàn)梯度爆炸(求導(dǎo)結(jié)果會很大,而且還是連乘)。? 這里是我個人的理解,有問題的話,歡迎各位一起學(xué)習(xí)。
6.?本文博主尚未理解的問題?
(1)殘差結(jié)構(gòu)能解決梯度爆炸嗎?
(2)解決退化問題還有沒有更精細(xì)或者其他的解釋?
(3)普通網(wǎng)絡(luò)梯度反向傳播中的數(shù)值是怎么計算的(后續(xù)可能會跟進(jìn)更新)
? ? ?? 放在最后,上述1到5其實原論文還有很多細(xì)節(jié),有需求的可以自己去看看,或者說出來大家一起學(xué)習(xí)!,對于6中的問題,我可能會后續(xù)更新,這個看時間和需求。可能后續(xù)會簡單寫下ResNet2和ResNEXT的博客,但是核心的還是ResNet殘差的這種思想,真的牛皮!論文的實驗結(jié)果,你們也可以去直接看看原論文,反正是實驗證明了152層的ResNet效果更好(減輕了退化,使得深層網(wǎng)絡(luò)性能能進(jìn)一步增強(qiáng)),給你們簡單放個圖:
總結(jié)
以上是生活随笔為你收集整理的ResNet 残差、退化等细节解读的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么是“人口负增长”现象?
- 下一篇: ResNet网络解决的一些事