關於ResNet 網絡的一些思考和看法

resnet 現在在深度學習上面已經成了一個很成熟的神經網絡結構了。現在許多學習任務基本都是用resnet來做backbone做各種任務。說起resnet大家的第一映像是什麼?是不是就是那一根跳躍連接的線圖1。如果再問你一下爲什麼加這根線呢?研究深的人也許會說這是爲了解決梯度消失/爆炸的問題。最後大家都會說瞭解到這裏基本就夠了,會用就行了。如果 現在跟你說你的理解錯了,你會怎麼說,你會說這不可能。我一直都這麼理解的呀。其實說心裏話,一開始我也是這麼理解的。

                                                                                 圖1 resnet block 模塊

下面我們來一點點的解釋一下爲什麼這個觀點錯了。其實在論文中作者也說了這個問題,如圖2,我們有這種認爲大概率是因爲論文看的時間長了,忘了一些其中的細節了。論文中的原話是說梯度消失、爆炸問題已經已經被"normalized initialization"和"intermediate normalization layers"技術解決了。我們當初看的時候,也許只是“恩”的一聲就過去了。

圖2 論文中的原話

那麼我們現在來簡單的看看,這個問題到底是怎麼被解決的,要回答這個問題前,我們瞭解一下什麼叫梯度消失/爆炸。

現在我們在進行深度神經網絡學習的時候基本都是用了反向傳播的方法來進行學習,這其中傳遞的就是梯度,當梯度消失或者爆炸的時候基本這個網絡就很難學習到東西了。

一項一項來,梯度消失是什麼,說到反向傳播,大家腦海裏有什麼?是不是就是那一串乘積操作。對,就是那個,我們現在想象一下那個一串乘積操作,當其中的項是每一項的輸入值都是恆小於1的時候,大家就可以想象到最後這個乘積到最後基本就太小了,當小於精度的時候計算機默認這就沒有了。最後就會學習到噪聲。反過來當這個乘積的項每一項的輸入都是大於1的時候,最後的結果就會越來越大。最後就NAN了。

因此爲了解決這個問題,大家不管在使用什麼框架pytorch/keras/tensorflow的時候都會加上BN的操作,這就爲了控制每一項的值,不至於過大也不至於過小。這樣慢慢就解決了梯度的問題了。那麼我們現在又回到我們最開始的問題,resnent的那一個跳躍到底有什麼用呢?

其實大家都知道當模型網絡越來越深的時候模型的能力反而下降了。

這裏的具體細節大家可以去看一下論文,這裏我就不細說了。其實大家按正常的邏輯想想,當網絡越來深的時候,理論上不應該越來越差呀,至少應該和前面淺層的模型一樣的能力呀。我後面的網絡加深的網絡我都變成1 然後都是恆等有前面,這樣不就跟前面一樣了嗎?這裏恰恰是問題的關鍵,就像大家的愛情一樣,去了就回不來了。因爲經過太多的非線性的激活,真的很難再回去了。因此爲了表示一個恆等真的很難,因此就讓學習到一個x=f(x)+x。等f(x)等於0的時候不就恆等了呀。這就是殘差的學習,一開始大家學習 f(x)+x 當網絡越來越深的時候f(x)逐漸等於0了。這樣就有了恆等的能力了。因此resnet的網絡設計說到底就是爲了讓深度學習的神經網絡有這個恆等能力。

當然這裏的F(x)也是有很多竅門的,許多人利用這個F(x)也發佈了許多好的論文。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章