A. ResNet網路
ResNet (Resial Neural Network,殘差網路)由微軟研究院何凱明等人提出的,通過在深度神經網路中加入殘差單元(Resial Unit)使得訓練深度比以前更加高效。ResNet在2015年的ILSVRC比賽中奪得冠軍,ResNet的結構可以極快的加速超深神經網路的訓練,模型准確率也有非常大的提升。
在ResNet之前,瑞士教授Schimidhuber提出了Highway Network,其原理與ResNet非常相似。通常認為神經網路的深度對其性能非常重要,但是網路越深訓練越困難,Highway Network的目標就是解決極深的神經網路難以訓練的問題。
Highway Network相當於修改了每一層激活函數,此前激活函數只是對輸入做一次非線性變換y=H(x, Wh), 而Highway Network則允許保留一部分比例的原始輸入x,即y=H(x, Wh)* T(x , Wt)+x*C(x, Wc),其中T為變換系數,C為保留系數,論文中令C=1-T。這樣前面一層的信息,有一定比例可以不經過矩陣乘法和非線性變換,直接傳輸到下一層,彷彿一條信息高速公路,因此得名Highway Network。
結果顯示,B比A略好,這是因為A中的零填充確實沒有殘差學習。而C比B稍好,這是由於投影快捷連接引入了額外參數。但A、B、C之間的細微差異表明投影連接對於解決退化問題不是至關重要的,而不/少使用投影連接可以減少內存/時間復雜性和模型大小。而且無參數恆等快捷連接對於瓶頸架構(3層殘差學習單元)尤為重要,因為瓶頸架構中層具有較小的輸入輸出,快捷連接是連接到兩個高維端,此時恆等快捷連接無需參數,而使用投影的話則會顯示時間和模型復雜度加倍。因此,恆等快捷連接可以為瓶頸設計得到更有效的模型。
最後,作者嘗試了更深的1000層以上的神經網路,發現神經網路仍然能夠較好的學習,但是其測試誤差比100多層的殘差網路要差,而訓練誤差則與100多層的殘差網路相似,作者認為這可能是由於過擬合導致的,可通過加大正則化來解決這一問題。
在ResNet V1中,作者研究通過加入殘差單元使得訓練深度達到上百層的神經網路成為可能,解決了梯度消失/爆炸的問題。而在ResNet V2中作者進一步證明了恆等映射(Identity mapping)的重要性。同時作者還提出了一種新的殘差單元(採用了預激活)使得訓練變得更簡單,同時還提高了模型的泛化能力。
在ResNet V2中,作者提出了不止在殘差單元內部,而是在整個神經網路中都創建了『直接』的計算傳播路徑。在ResNet V1中,殘差學習單元的
上式同樣表明了在一個mini-batch中不可能出現梯度消失的現象,因為上式求導的第二部分對於一個mini-batch來說,不可能所有樣本其導數都為-1,因此,可能會出現權重很小的情況,但是不會出現梯度消失的情況。
通過研究這些不同的快捷連接,作者發現大部分快捷連接方式無法很好地收斂,其中很大部分是由於使用這些快捷連接後或多或少會出現梯度消失或者梯度爆炸的現象,最後結果顯示恆等映射效果最好。
雖然恆等映射在這些方法中表寫結果最好,仍需引起注意的是1×1的卷積捷徑連接引入了更多的參數,本應該比恆等捷徑連接具有更加強大的表達能力。事實上,shortcut-only gating 和1×1的卷積涵蓋了恆等捷徑連接的解空間(即,他們能夠以恆等捷徑連接的形式進行優化)。然而,它們的訓練誤差比恆等捷徑連接的訓練誤差要高得多,這表明了這些模型退化問題的原因是優化問題,而不是表達能力的問題。
在上圖b中,採用先加後BN再激活的方法,此時f(x)就包含了BN和ReLU。這樣的結果比原始a要差。這主要是因為BN層改變了流經快捷連接的信號,阻礙了信息的傳遞。
在c中,ReLU在相加之前,此時f(x)=x,為恆等映射。此時殘差單元中的F(x)輸出經由ReLU後變為非負,然而一個「殘差」函數的輸出應該是(−∞,+∞) 的。造成的結果就是,前向傳遞的信號是單調遞增的。這會影響表達能力,結果也變得更差了。
結果顯示,只使用ReLU預激活(d)的結果與原始ResNet結果很接近,這個與ReLU層不與BN層連接使用,因此無法獲得BN所帶來的好處。而當BN和ReLU都使用在預激活上時(e),結果得到了可觀的提升。
預激活的影響有兩個方面:第一,由於f(x)也是恆等映射,相比於V1優化變得更加簡單;第二,在預激活中使用BN能提高模型的正則化。
對於f(x)為恆等映射的好處:一方面若使用f= ReLU,如果信號是負的時候會造成一定的影響,無法傳遞有用的負信號,而當殘差單元很多時,這個影響將會變得尤為突出;另一方面當f是一個恆等映射時,信號在兩個單元間能夠很直接的傳遞。
在ResNet V1中作者提出了殘差學習單元,並從理論和實驗上證明使用直連的shortcuts有助於解決深度達到上百層的神經網路的訓練問題。而在ResNet V2中作者證明了在shortcuts中使用直接映射(即H(x) = h(x) + F(x)中h(x) = x)得到的效果最好。在ResNext中作者將bottleneck拆分成多個分支,提出了神經網路中的第三個維度(另外兩個維度分別為depth,神經網路層數深度,width,寬度,channel數),命名為 Cardinality ,並在多個數據集中證明了將bottleneck拆分能夠降低訓練錯誤率和提高准確率。
ResNext的靈感來源於VGG/ResNet和Inception:(1)在VGG、ResNet中,作者使用了相同結構的卷積層進行了堆疊,構建了層數很深但是結構簡單的神經網路;(2)而在Inception中,提出了一種叫做 split-transform-merge 的策略,將輸入(採用1x1 卷積核)分裂為幾個低維 embedding,再經過一系列特定卷積層的變換,最後連接在一起。
而在ResNet中,作者將原ResNet bottleneck中的一條path拆分為多個分支(multi branch),以此分支數量提出神經網路中的第三個重要維度——Cardinality。這一想法結合了VGG中的相同結構堆疊和Inception中的split-transform-merge策略,即如上圖所示,每個bottleneck 拆分為多個分支進行堆疊,這些分支的結構相同(這里借鑒了VGG的思想),而具體到分支的結構時又採用了Inception的split-transform-merge策略。與Inception不同的是Inception的每個分支結構都是需要認為的設計,而在ResNext中每個分支結構都相同。最終每個bottleneck的輸出就變成了:
這些所有的bottlenecks結構都遵循兩個原則:
作者提出了 三種效果相同的ResNext的表示方法,如下圖所示:
其中a,b 結構相似,只是在merge這一步的地方不同,而c則借鑒了AlexNet中分組卷積的思想,將輸入和輸出都分為多個組。
作者首先評估權衡了cardinality和width的關系。
接著,作者又評估了使用增加cardinality和depth/width來增加模型復雜度後的效果:
最後,作者還研究了shortcuts對於ResNext的重要性,在ResNet-50中,不使用shortcuts准確率下降了7%,而在ResNext-50中准確率也下降了4%,說明shortcuts對於殘差網路來說確實是非常重要的。
簡言之,增加cardinality比增加depth和width效果要好,同時,shortcuts對於模型的准確率也是至關重要的。
參考:
Deep Resial Learning for Image Recognition.
Aggregated Resial Transformations for Deep Neural Networks.
Identity Mappings in Deep Resial Networks.
ResNet論文翻譯——中文版
Identity Mappings in Deep Resial Networks(譯)
TensorFlow實現經典卷積網路. 黃文堅,唐源
B. 十分鍾一起學會ResNet殘差網路
深度卷積網路自然的整合了低中高不同層次的特徵,特徵的層次可以靠加深網路的層次來豐富。從而,在構建卷積網路時,網路的深度越高,可抽取的特徵層次就越豐富。所以一般我們會傾向於使用更深層次的網路結構,以便取得更高層次的特徵。但是在使用深層次的網路結構時我們會遇到兩個問題,梯度消失,梯度爆炸問題和網路退化的問題。
但是當使用更深層的網路時,會發生梯度消失、爆炸問題,這個問題很大程度通過標準的初始化和正則化層來基本解決,這樣可以確保幾十層的網路能夠收斂,但是隨著網路層數的增加,梯度消失或者爆炸的問題仍然存在。
還有一個問題就是網路的退化,舉個例子,假設已經有了一個最優化的網路結構,是18層。當我們設計網路結構的時候,我們並不知道具體多少層次的網路時最優化的網路結構,假設設計了34層網路結構。那麼多出來的16層其實是冗餘的,我們希望訓練網路的過程中,模型能夠自己訓練這五層為恆等映射,也就是經過這層時的輸入與輸出完全一樣。但是往往模型很難將這16層恆等映射的參數學習正確,那麼就一定會不比最優化的18層網路結構性能好,這就是隨著網路深度增加,模型會產生退化現象。它不是由過擬合產生的,而是由冗餘的網路層學習了不是恆等映射的參數造成的。
ResNet是在2015年有何凱明,張翔宇,任少卿,孫劍共同提出的,ResNet使用了一個新的思想,ResNet的思想是假設我們涉及一個網路層,存在最優化的網路層次,那麼往往我們設計的深層次網路是有很多網路層為冗餘層的。那麼我們希望這些冗餘層能夠完成恆等映射,保證經過該恆等層的輸入和輸出完全相同。具體哪些層是恆等層,這個會有網路訓練的時候自己判斷出來。將原網路的幾層改成一個殘差塊,殘差塊的具體構造如下圖所示:
可以看到X是這一層殘差塊的輸入,也稱作F(x)為殘差,x為輸入值,F(X)是經過第一層線性變化並激活後的輸出,該圖表示在殘差網路中,第二層進行線性變化之後激活之前,F(x)加入了這一層輸入值X,然後再進行激活後輸出。在第二層輸出值激活前加入X,這條路徑稱作shortcut連接。
我們發現,假設該層是冗餘的,在引入ResNet之前,我們想讓該層學習到的參數能夠滿足h(x)=x,即輸入是x,經過該冗餘層後,輸出仍然為x。但是可以看見,要想學習h(x)=x恆等映射時的這層參數時比較困難的。ResNet想到避免去學習該層恆等映射的參數,使用了如上圖的結構,讓h(x)=F(x)+x;這里的F(x)我們稱作殘差項,我們發現,要想讓該冗餘層能夠恆等映射,我們只需要學習F(x)=0。學習F(x)=0比學習h(x)=x要簡單,因為一般每層網路中的參數初始化偏向於0,這樣在相比於更新該網路層的參數來學習h(x)=x,該冗餘層學習F(x)=0的更新參數能夠更快收斂,如圖所示:
假設該曾網路只經過線性變換,沒有bias也沒有激活函數。我們發現因為隨機初始化權重一般偏向於0,那麼經過該網路的輸出值為[0.6 0.6],很明顯會更接近與[0 0],而不是[2 1],相比與學習h(x)=x,模型要更快到學習F(x)=0。
並且ReLU能夠將負數激活為0,過濾了負數的線性變化,也能夠更快的使得F(x)=0。這樣當網路自己決定哪些網路層為冗餘層時,使用ResNet的網路很大程度上解決了學習恆等映射的問題,用學習殘差F(x)=0更新該冗餘層的參數來代替學習h(x)=x更新冗餘層的參數。
這樣當網路自行決定了哪些層為冗餘層後,通過學習殘差F(x)=0來讓該層網路恆等映射上一層的輸入,使得有了這些冗餘層的網路效果與沒有這些冗餘層的網路效果相同,這樣很大程度上解決了網路的退化問題。
我們發現很深的網路層,由於參數初始化一般更靠近0,這樣在訓練的過程中更新淺層網路的參數時,很容易隨著網路的深入而導致梯度消失,淺層的參數無法更新。
可以看到,假設現在需要更新 參數因為隨機初始化偏向於0,通過鏈式求導我們會發現, 相乘會得到更加接近於0的數,那麼所求的這個 的梯度就接近於0,也就產生了梯度消失的現象。
ResNet最終更新某一個節點的參數時,由於 ,由於鏈式求導後的結果如圖所示,不管括弧內右邊部分的求導參數有多小,因為左邊的1的存在,並且將原來的鏈式求導中的連乘變成了連加狀態(正是 ),都能保證該節點參數更新不會發生梯度消失或梯度爆炸現象。
這樣ResNet在解決了阻礙更深層次網路優化問題的兩個重要問題後,ResNet就能訓練更深層次幾百層乃至幾千層的網路並取得更高的精確度了。
這里是應用了ResNet的網路圖,這里如果遇到了h(x)=F(x)+x中x的維度與F(x)不同的維度時,我們需要對identity加入Ws來保持Ws*x的維度與F(x)的維度一致。
x與F(x)維度相同時:
x與F(x)維度不同時:
下邊是ResNet的網路結構圖:
使用1*1卷積減少參數和計算量:
如果用了更深層次的網路時,考慮到計算量,會先用1 * 1的卷積將輸入的256維降到64維,然後通過1*1恢復。這樣做的目的是減少參數量和計算量。
左圖是ResNet34,右圖是ResNet50/101/152。這一個模塊稱作building block,右圖稱之為bottleneck design。在面對50,101,152層的深層次網路,意味著有很大的計算量,因此這里使用1 * 1卷積先將輸入進行降維,然後再經過3 * 3卷積後再用 卷積進行升維。使用1*1卷積的好處是大大降低參數量計算量。
通過上述的學習,你應該知道了,現如今大家普遍認為更好的網路是建立在更寬更深的網路基礎上,當你需要設計一個深度網路結構時,你永遠不知道最優的網路層次結構是多少層,一旦你設計的很深入了,那勢必會有很多冗餘層,這些冗餘層一旦沒有成功學習恆等變換 ,那就會影響網路的預測性能,不會比淺層的網路學習效果好從而產生退化問題。
ResNet的過人之處,是他很大程度上解決了當今深度網路頭疼的網路退化問題和梯度消失問題。使用殘差網路結構 代替原來的沒有shortcut連接的 ,這樣更新冗餘層的參數時需要學習 比學習 要容易得多。而shortcut連接的結構也保證了反向傳播更新參數時,很難有梯度為0的現象發生,不會導致梯度消失。
這樣,ResNet的構建,使我們更朝著符合我們的直覺走下去,即越深的網路對於高級抽象特徵的提取和網路性能更好,不用在擔心隨著網路的加深發生退化問題了。
近段時間,准備持續發表一些CNN常見的網路模型講解。好了,今天的十分鍾就帶你一起學會ResNet,下次的十分鍾我們再見。
C. 神經網路中的前向和後向演算法
神經網路中的前向和後向演算法
看了一段時間的深度網路模型,也在tf和theano上都跑了一些模型,但是感覺沒有潛下去,對很多東西的理解都只停留在「這個是干什麼的」層次上面。昨天在和小老師一起看一篇文章的時候,就被問到RNN裡面的後向傳播演算法具體是怎麼推。當時心裡覺得BP演算法其實很熟悉啊,然後在推導的過程中就一臉懵逼了。於是又去網上翻了翻相關內容,自己走了一遍,准備做個筆記,算是個交代。
准備一個神經網路模型,比如:
其中,[i1,i2]
代表輸入層的兩個結點,[h1,h2]代表隱藏層的兩個結點,[o1,o2]為輸出。[b1,b2]
為偏置項。連接每個結點之間的邊已經在圖中標出。
來了解一下前向演算法:
前向演算法的作用是計算輸入層結點對隱藏層結點的影響,也就是說,把網路正向的走一遍:輸入層—->隱藏層—->輸出層
計算每個結點對其下一層結點的影響。
?? 例如,我們要算結點h1
的值,那麼就是:
是一個簡單的加權求和。這里稍微說一下,偏置項和權重項的作用是類似的,不同之處在於權重項一般以乘法的形式體現,而偏置項以加法的形式體現。
??而在計算結點o1時,結點h1的輸出不能簡單的使用neth1的結果,必須要計算激活函數,激活函數,不是說要去激活什麼,而是要指「激活的神經元的特徵」通過函數保留並映射出來。以sigmoid函數為例,h1的輸出:
於是
最後o1的輸出結果,也就是整個網路的一個輸出值是:
按照上面的步驟計算出out02,則[outo1,outo2]就是整個網路第一次前向運算之後得到的結果。
後向演算法:
??在實際情況中,因為是隨機給定的權值,很大的可能(幾乎是100%)得到的輸出與實際結果之間的偏差非常的大,這個時候我們就需要比較我們的輸出和實際結果之間的差異,將這個殘差返回給整個網路,調整網路中的權重關系。這也是為什麼我們在神經網路中需要後向傳播的原因。其主要計算步驟如下:
1. 計算總誤差
2. 隱藏層的權值更新
在要更新每個邊的權重之前,必須要知道這條邊對最後輸出結果的影響,可以用整體誤差對w5求偏導求出:
具體計算的時候,可以採用鏈式法則展開:
在計算的時候一定要注意每個式子裡面哪些自變數是什麼,求導千萬不要求錯了。
??需要講出來的一個地方是,在計算w1的權重時,Etotal中的兩部分都需要對它進行求導,因為這條邊在前向傳播中對兩個殘差都有影響
3. 更新權重 這一步裡面就沒什麼東西了,直接根據學習率來更新權重:
至此,一次正向+反向傳播過程就到此為止,接下來只需要進行迭代,不斷調整邊的權重,修正網路的輸出和實際結果之間的偏差(也就是training整個網路)。
D. GBDT演算法
對於AdaBoost,可以將其視為一個將多個弱分類器線性組合後對數據進行預測的演算法,該模型可以表示為:
為基函數(即單個弱分類器), 為基函數的參數(即弱分類器中特徵的權重向量), 為基函數的系數(即弱分類器在線性組合時的權重), 就是基函數的線性組合。
給定訓練數據和損失函數 的條件下,構建最優加法模型 的問題等價於損失函數最小化:
這個公式展現了AdaBoost演算法的核心過程。
我們可以利用前向分布演算法來求解上一個式子的最優參數。前向分布演算法的核心是 從前向後,每一步計算一個基函數及其系數,逐步逼近優化目標函數式 ,就可以簡化優化的復雜度。
M-1個基函數的加法模型為:
M個基函數的加法模型:
由上面兩式得:
由這個公式和公式(2)得極小化損失函數:
演算法思路如下:
1. 初始化
2. 對m=1,2,...,M:
a. 極小化損失函數: 得到參數
b. 更新:
3. 得到加法模型:
這樣,前向分布演算法將同時求解從m=1到M所有參數 的優化問題化簡為逐次求解各個 的優化問題。
Freidman提出了梯度提升演算法,演算法的核心是利用損失函數的負梯度將當前模型的值作為回歸問題提升樹演算法中的殘差的近似值,去擬合一個回歸樹。
GBDT的思想就是不斷去擬合殘差,使殘差不斷減少。用一個通俗的例子來講假如有個人30歲,我們首先用20歲去擬合,發現損失有10歲,這時我們用6歲去擬合剩下的損失,發現差距還有4歲,第三輪我們用3歲擬合剩下的差距,差距就只有一歲了。如果我們的迭代輪數還沒有完,可以繼續迭代下面,每一輪迭代,擬合的歲數誤差都會減小。(參考 集成學習之Boosting-gbdt )GBDT中每次迭代構造的Cart樹都是用前一輪的殘差擬合的。
第t輪第i個樣本的損失函數的負梯度表示為:
利用 我們可以擬合一顆CART回歸樹,得到了第t顆回歸樹,其對應的葉節點區域 其中J為葉子節點個數。
針對每一個葉子節點里的樣本,我們求出使損失函數最小的 輸出值 :
這樣我們就得到了本輪的決策樹擬合函數:
從而本輪最終得到的強學習器的表達式如下:
通過損失函數的負梯度來擬合,是一種通用的擬合損失誤差的辦法。無論是分類問題還是回歸問題,我們都可以通過其損失函數的負梯度的擬合,從而用GBDT來解決我們的分類和回歸問題。區別僅僅在於損失函數不同導致的負梯度不同而已。
d. 分位數損失:它對應的是分位數回歸的損失函數。
輸入: 訓練樣本
迭代次數(基學習器數量): T
損失函數: L
輸出: 強學習器H(x)
演算法流程
對於二元GBDT,其對數損失函數在之前已經給出:
其中 此時的負梯度誤差為:
對於生成的決策樹,各個葉子節點的最佳負梯度擬合值為:
由於這個式子不易優化,一般使用近似值代替:
除了負梯度計算和葉子節點的最佳負梯度擬合的線性搜索,二分類GBDT與GBDT回歸演算法過程相同。
多分類GBDT的損失函數在之前也已經給出過:
樣本屬於第k類的概率 的表達式為:
結合上面兩個式子可以求出第t輪第i個樣本對應類別 l 的負梯度誤差為:
可以看出,其實這里的誤差就是樣本i對應類別l的真實概率和t-1輪預測概率的差值。
對於生成的決策樹,各個葉子節點的最佳負梯度擬合值為:
由於上式比較難優化,一般用近似值代替:
除了負梯度計算和葉子節點的最佳負梯度擬合的線性搜索,多分類GBDT與二分類GBDT以及GBDT回歸演算法過程相同。
為了防止GBDT過擬合,需要對其進行正則化。主要有三種方式:
1. 給每棵樹的輸出結果乘上一個步長(學習率) a 。之前的弱學習器的迭代式改為:
2. 通過子采樣比例進行正則化。GBDT每一輪建樹時樣本從原始訓練集中採用無放回隨機抽樣的方式產生。若采樣比例取1,則採用全部樣本進行訓練。為了防止過擬合,同時又要防止樣本擬合偏差較大(欠擬合),要合理取值,常用 [0.5, 0.8]
3. 對弱學習器(CART)進行正則化剪枝:控制樹的最大深度、節點最少樣本數、最大葉子節點數、節點分支的最小樣本數等。
優點 :
缺點 :
由於弱學習器之間存在依賴關系,難以並行訓練數據
boosting框架相關參數 :
弱學習器參數 :
GBDT的適用面非常廣,幾乎可以用於所有回歸問題(線性/非線性),也可以用於分類問題。
E. GBDT —— 梯度提升決策樹
GBDT(Gradient Boosting Decision Tree) 又叫 MART(Multiple Additive Regression Tree),是一種迭代的決策樹演算法,該演算法由多棵決策樹組成,所有樹的結論累加起來做最終答案。它在被提出之初就和SVM一起被認為是泛化能力較強的演算法。
GBDT中的樹是回歸樹(不是分類樹),GBDT用來做回歸預測,調整後也可以用於分類。
GBDT主要由三個概念組成:Regression Decistion Tree(即DT),Gradient Boosting(即GB),Shrinkage (演算法的一個重要演進分枝,目前大部分源碼都按該版本實現)。搞定這三個概念後就能明白GBDT是如何工作的。
提起決策樹(DT, Decision Tree) 絕大部分人首先想到的就是C4.5分類決策樹。但如果一開始就把GBDT中的樹想成分類樹,那就錯了。千萬不要以為GBDT是很多棵分類樹。決策樹分為兩大類,回歸樹和分類樹。前者用於預測實數值,如明天的溫度、用戶的年齡、網頁的相關程度;後者用於分類標簽值,如晴天/陰天/霧/雨、用戶性別、網頁是否是垃圾頁面。這里要強調的是,前者的結果加減是有意義的,如10歲+5歲-3歲=12歲,後者則無意義,如男+男+女=到底是男是女?GBDT的核心在於累加所有樹的結果作為最終結果,就像前面對年齡的累加(-3是加負3),而分類樹的結果顯然是沒辦法累加的,所以 GBDT中的樹都是回歸樹,不是分類樹 ,這點對理解GBDT相當重要(盡管GBDT調整後也可用於分類但不代表GBDT的樹是分類樹)。
回歸樹總體流程類似於分類樹,區別在於,回歸樹的每一個節點都會得一個預測值,以年齡為例,該預測值等於屬於這個節點的所有人年齡的平均值。分枝時窮舉每一個feature的每個閾值找最好的分割點,但衡量最好的標准不再是最大熵,而是最小化平方誤差。也就是被預測出錯的人數越多,錯的越離譜,平方誤差就越大,通過最小化平方誤差能夠找到最可靠的分枝依據。分枝直到每個葉子節點上人的年齡都唯一或者達到預設的終止條件(如葉子個數上限), 若最終葉子節點上人的年齡不唯一,則以該節點上所有人的平均年齡做為該葉子節點的預測年齡。
回歸樹演算法如下圖(截圖來自《統計學習方法》5.5.1 CART生成):
梯度提升(Gradient boosting)是一種用於回歸、分類和排序任務的機器學習技術 [1] ,屬於Boosting演算法族的一部分。Boosting是一族可將弱學習器提升為強學習器的演算法,屬於集成學習(ensemble learning)的范疇。Boosting方法基於這樣一種思想:對於一個復雜任務來說,將多個專家的判斷進行適當的綜合所得出的判斷,要比其中任何一個專家單獨的判斷要好。通俗地說,就是「三個臭皮匠頂個諸葛亮」的道理。梯度提升同其他boosting方法一樣,通過集成(ensemble)多個弱學習器,通常是決策樹,來構建最終的預測模型。
Boosting、bagging和stacking是集成學習的三種主要方法。不同於bagging方法,boosting方法通過分步迭代(stage-wise)的方式來構建模型,在迭代的每一步構建的弱學習器都是為了彌補已有模型的不足。Boosting族演算法的著名代表是AdaBoost,AdaBoost演算法通過給已有模型預測錯誤的樣本更高的權重,使得先前的學習器做錯的訓練樣本在後續受到更多的關注的方式來彌補已有模型的不足。與AdaBoost演算法不同,梯度提升方法在迭代的每一步構建一個能夠沿著梯度最陡的方向降低損失(steepest-descent)的學習器來彌補已有模型的不足。經典的AdaBoost演算法只能處理採用指數損失函數的二分類學習任務 [2] ,而梯度提升方法通過設置不同的可微損失函數可以處理各類學習任務(多分類、回歸、Ranking等),應用范圍大大擴展。另一方面,AdaBoost演算法對異常點(outlier)比較敏感,而梯度提升演算法通過引入bagging思想、加入正則項等方法能夠有效地抵禦訓練數據中的噪音,具有更好的健壯性。這也是為什麼梯度提升演算法(尤其是採用決策樹作為弱學習器的GBDT演算法)如此流行的原因,
提升樹是迭代多棵回歸樹來共同決策。當採用平方誤差損失函數時,每一棵回歸樹學習的是之前所有樹的結論和殘差,擬合得到一個當前的殘差回歸樹,殘差的意義如公式:殘差 = 真實值 - 預測值 。提升樹即是整個迭代過程生成的回歸樹的累加。 GBDT的核心就在於,每一棵樹學的是之前所有樹結論和的殘差,這個殘差就是一個加預測值後能得真實值的累加量。
提升樹利用 加法模型和前向分步演算法 實現學習的優化過程。當損失函數時平方損失和指數損失函數時,每一步的優化很簡單,如平方損失函數學習殘差回歸樹。
提升方法其實是一個比adaboost概念更大的演算法,因為adaboost可以表示為boosting的前向分布演算法(Forward stagewise additive modeling)的一個特例,boosting最終可以表示為:
其中的w是權重,Φ是弱分類器(回歸器)的集合,其實就是一個加法模型(即基函數的線性組合)
前向分布演算法 實際上是一個貪心的演算法,也就是在每一步求解弱分類器Φ(m)和其參數w(m)的時候不去修改之前已經求好的分類器和參數:
OK,這也就是提升方法(之前向分布演算法)的大致結構了,可以看到其中存在變數的部分其實就是極小化損失函數 這關鍵的一步了,如何選擇損失函數決定了演算法的最終效果(名字)……這一步你可以看出演算法的「趨勢」,以後再單獨把「趨勢」拿出來說吧,因為我感覺理解演算法的關鍵之一就是理解演算法公式的「趨勢」
不同的損失函數和極小化損失函數方法決定了boosting的最終效果,我們現在來說幾個常見的boosting:
廣義上來講,所謂的Gradient Boosting 其實就是在更新的時候選擇梯度下降的方向來保證最後的結果最好,一些書上講的「殘差」 方法其實就是L2Boosting吧,因為它所定義的殘差其實就是L2Boosting的Derivative,接下來我們著重講一下弱回歸器(不知道叫啥了,自己編的)是決策樹的情況,也就是GBDT。
GBDT演算法可以看成是由K棵樹組成的加法模型:
解這一優化問題,可以用前向分布演算法(forward stagewise algorithm)。因為學習的是加法模型,如果能夠從前往後,每一步只學習一個基函數及其系數(結構),逐步逼近優化目標函數,那麼就可以簡化復雜度。這一學習過程稱之為Boosting。具體地,我們從一個常量預測開始,每次學習一個新的函數,過程如下:
舉個例子,參考自一篇博客, 該博客舉出的例子較直觀地展現出多棵決策樹線性求和過程以及殘差的意義。
還是年齡預測,簡單起見訓練集只有4個人,A,B,C,D,他們的年齡分別是14,16,24,26。其中A、B分別是高一和高三學生;C,D分別是應屆畢業生和工作兩年的員工。如果是用一棵傳統的回歸決策樹來訓練,會得到如下圖1所示結果:
現在我們使用GBDT來做這件事,由於數據太少,我們限定葉子節點做多有兩個,即每棵樹都只有一個分枝,並且限定只學兩棵樹。我們會得到如下圖2所示結果:
在第一棵樹分枝和圖1一樣,由於A,B年齡較為相近,C,D年齡較為相近,他們被分為兩撥,每撥用平均年齡作為預測值。此時計算殘差 (殘差的意思就是: A的預測值 + A的殘差 = A的實際值) ,所以A的殘差就是16-15=1(注意,A的預測值是指前面所有樹累加的和,這里前面只有一棵樹所以直接是15,如果還有樹則需要都累加起來作為A的預測值)。進而得到A,B,C,D的殘差分別為-1,1,-1,1。然後我們拿殘差替代A,B,C,D的原值,到第二棵樹去學習,如果我們的預測值和它們的殘差相等,則只需把第二棵樹的結論累加到第一棵樹上就能得到真實年齡了。這里的數據顯然是我可以做的,第二棵樹只有兩個值1和-1,直接分成兩個節點。此時所有人的殘差都是0,即每個人都得到了真實的預測值。
換句話說,現在A,B,C,D的預測值都和真實年齡一致了。Perfect!:
A: 14歲高一學生,購物較少,經常問學長問題;預測年齡A = 15 – 1 = 14
B: 16歲高三學生;購物較少,經常被學弟問問題;預測年齡B = 15 + 1 = 16
C: 24歲應屆畢業生;購物較多,經常問師兄問題;預測年齡C = 25 – 1 = 24
D: 26歲工作兩年員工;購物較多,經常被師弟問問題;預測年齡D = 25 + 1 = 26
那麼哪裡體現了Gradient呢?其實回到第一棵樹結束時想一想,無論此時的cost function是什麼,是均方差還是均差,只要它以誤差作為衡量標准,殘差向量(-1, 1, -1, 1)都是它的全局最優方向,這就是Gradient。
講到這里我們已經把GBDT最核心的概念、運算過程講完了!沒錯就是這么簡單。
該例子很直觀的能看到,預測值等於所有樹值得累加,如A的預測值 = 樹1左節點 值 15 + 樹2左節點 -1 = 14。
因此,給定當前模型 fm-1(x),只需要簡單的擬合當前模型的殘差。現將回歸問題的提升樹演算法敘述如下:
答案是過擬合。過擬合是指為了讓訓練集精度更高,學到了很多」僅在訓練集上成立的規律「,導致換一個數據集當前規律就不適用了。其實只要允許一棵樹的葉子節點足夠多,訓練集總是能訓練到100%准確率的(大不了最後一個葉子上只有一個instance)。在訓練精度和實際精度(或測試精度)之間,後者才是我們想要真正得到的。
我們發現圖1為了達到100%精度使用了3個feature(上網時長、時段、網購金額),其中分枝「上網時長>1.1h」 很顯然已經過擬合了,這個數據集上A,B也許恰好A每天上網1.09h, B上網1.05小時,但用上網時間是不是>1.1小時來判斷所有人的年齡很顯然是有悖常識的;
相對來說圖2的boosting雖然用了兩棵樹 ,但其實只用了2個feature就搞定了,後一個feature是問答比例,顯然圖2的依據更靠譜。(當然,這里是LZ故意做的數據,所以才能靠譜得如此狗血。實際中靠譜不靠譜總是相對的) Boosting的最大好處在於,每一步的殘差計算其實變相地增大了分錯instance的權重,而已經分對的instance則都趨向於0。這樣後面的樹就能越來越專注那些前面被分錯的instance。就像我們做互聯網,總是先解決60%用戶的需求湊合著,再解決35%用戶的需求,最後才關注那5%人的需求,這樣就能逐漸把產品做好,因為不同類型用戶需求可能完全不同,需要分別獨立分析。如果反過來做,或者剛上來就一定要做到盡善盡美,往往最終會竹籃打水一場空。
Shrinkage(縮減)的思想認為,每次走一小步逐漸逼近結果的效果,要比每次邁一大步很快逼近結果的方式更容易避免過擬合。即它不完全信任每一個棵殘差樹,它認為每棵樹只學到了真理的一小部分,累加的時候只累加一小部分,通過多學幾棵樹彌補不足。用方程來看更清晰,即
沒用Shrinkage時:(yi表示第i棵樹上y的預測值, y(1~i)表示前i棵樹y的綜合預測值)
y(i+1) = 殘差(y1~yi), 其中: 殘差(y1~yi) = y真實值 - y(1 ~ i)
y(1 ~ i) = SUM(y1, ..., yi)
Shrinkage不改變第一個方程,只把第二個方程改為:
y(1 ~ i) = y(1 ~ i-1) + step * yi
即Shrinkage仍然以殘差作為學習目標,但對於殘差學習出來的結果,只累加一小部分(step 殘差)逐步逼近目標,step一般都比較小,如0.01~0.001(注意該step非gradient的step),導致各個樹的殘差是漸變的而不是陡變的。直覺上這也很好理解,不像直接用殘差一步修復誤差,而是只修復一點點,其實就是把大步切成了很多小步。 本質上,Shrinkage為每棵樹設置了一個weight,累加時要乘以這個weight,但和Gradient並沒有關系 *。 這個weight就是step。就像Adaboost一樣,Shrinkage能減少過擬合發生也是經驗證明的,目前還沒有看到從理論的證明。
該版本GBDT幾乎可用於所有回歸問題(線性/非線性),相對logistic regression僅能用於線性回歸,GBDT的適用面非常廣。亦可用於二分類問題(設定閾值,大於閾值為正例,反之為負例)。
參考資料:
http://blog.csdn.net/w28971023/article/details/8240756
http://blog.csdn.net/dark_scope/article/details/24863289
https://www.jianshu.com/p/005a4e6ac775
https://www.zybuluo.com/yxd/note/611571
F. 殘差網路ResNet筆記
作者根據輸入將層表示為學習 殘差函數 。實驗表明,殘差網路更容易優化,並且能夠通過增加相當的深度來提高准確率。
核心是解決了增加深度帶來的副作用(退化問題),這樣能夠通過單純地增加網路深度,來提高網路性能。
網路的深度為什麼重要?
因為CNN能夠提取low/mid/high-level的特徵,網路的層數越多,意味著能夠提取到不同level的特徵越豐富。並且,越深的網路提取的特徵越抽象,越具有語義信息。
為什麼不能簡單地增加網路層數?
怎麼解決退化問題?
深度殘差網路。如果深層網路的後面那些層是恆等映射,那麼模型就退化為一個淺層網路。那現在要解決的就是學習恆等映射函數了。 但是直接讓一些層去擬合一個潛在的恆等映射函數H(x) = x,比較困難,這可能就是深層網路難以訓練的原因。但是,如果把網路設計為H(x) = F(x) + x,如下圖。我們可以轉換為學習一個殘差函數F(x) = H(x) - x. 只要F(x)=0,就構成了一個恆等映射H(x) = x. 而且,擬合殘差肯定更加容易。
其他的參考解釋
這種殘差學習結構可以通過前向神經網路+shortcut連接實現,如結構圖所示。而且shortcut連接相當於簡單執行了同等映射,不會產生額外的參數,也不會增加計算復雜度。 而且,整個網路可以依舊通過端到端的反向傳播訓練。
ImageNet上的實驗證明了作者提出的加深的殘差網路能夠比簡單疊加層生產的深度網路更容易優化,而且,因為深度的增加,結果得到了明顯提升。另外在CIFAR-10數據集上相似的結果以及一系列大賽的第一名結果表明ResNet是一個通用的方法。
F(x)與x相加就是就是逐元素相加,但是如果兩者維度不同,需要給x執行一個線性映射來匹配維度:
用來學習殘差的網路層數應當大於1,否則退化為線性。文章實驗了layers = 2或3,更多的層也是可行的。
用卷積層進行殘差學習: 以上的公式表示為了簡化,都是基於全連接層的,實際上當然可以用於卷積層。加法隨之變為對應channel間的兩個feature map逐元素相加。
key point:
key point:
G. 語言模型介紹
語言模型(LM)是很多自然語言處理(NLP)任務的基礎。語言模型是指對於語言序列 ,計算該序列的概率,即 ,這里的語言序列是有序的語言序列,後續計算也會體現這一點。一般我們認為一個正常的語句,它出現的概率是大於非正常的語句。比如有如下三個語句:
那麼應當會有 和 ,這是因為 正常詞序的語句會比亂序的語句更常見,正常含義的語句會比無意義的語句更常見 。
計算一個語言序列的概率,我們可以使用鏈式法則去計算
但該計算方法有兩個缺陷:
我們能夠建立語言模型了,一般的我們在訓練集上得到語言模型的參數,在測試集裡面來測試模型的性能,那麼如何去衡量一個語言模型的好壞呢?比較兩個模型A,B好壞,一種外在的評價就是將AB放入具體的任務中,然後分別得到模型的准確率,這種方式當然是最好的方式,但這種方式的缺點是過於耗時,在實際情況中往往需要花費過多時間才能得到結果。另一種方式是使用下面要介紹的困惑度,但注意困惑度並不是上述外在評價的一個好的近似,所以一般使用在試點試驗上,所謂試點試驗就是一個小規模的初步研究,以評估一些性能。
困惑度的基本評價方式是對測試集賦予高概率值的模型更好,一個句子W的困惑度(PP)定義如下:
S代表sentence,N是句子長度, 是第i個詞的概率。第一個詞就是 ,而 是<s>,表示句子的起始,是個佔位符,事實上,結尾應該也有一個佔位符,但這里好像沒有寫。
這個式子可以這樣理解,PPL越小, 則越大,一句我們期望的sentence出現的概率就越高。
為了解決參數空間過大的問題。人們引入了馬爾科夫假設:隨意一個詞出現的概率只與它前面出現的有限的一個或者幾個詞有關。
如果一個詞的出現與它周圍的詞是獨立的,那麼我們就稱之為unigram,也就是一元語言模型:
如果一個詞的出現僅依賴於它前面出現的一個詞,那麼我們就稱之為bigram:
一般來說,N元模型就是假設當前詞的出現概率只與它前面的n-1個詞有關。而這些概率參數都是可以通過大規模語料庫來計算:
在實踐中用的最多的就是bigram和trigram了,高於四元的用的非常少,由於訓練它須要更龐大的語料,並且數據稀疏嚴重,時間復雜度高,精度卻提高的不多。
那在實際計算中,我們怎麼計算一個句子的概率呢?
以一元模型為例,在一元語言模型中,我們的句子概率定義為:
那麼這裡面的每個因子 該怎麼計算呢?
這里使用頻率統計的辦法,由於一元模型認為每個詞是相互獨立的,所以統計的時候,只需要統計語料庫中每個詞出現的頻率作為概率就可以了。
這里的計算可以認為是根據極大似然估計得到的,假如詞典里有V個詞,每個詞對應一個概率,考慮到所有詞出現的概率和是1,那就有V-1個參數 。假設詞典表中第i詞在語料庫中出現的數目為 ,並且 那麼根據極大似然估計就有:
取對數之後:
這個可以用多元函數極值去求解。不過這樣進行多元極值求解不容易計算,如果用條件極值會容易計算,用拉格朗日乘數法進行求解。
求解得:
有了每個詞的出現概率,帶入到式子 中就可以計算出對應句子的概率。
對於二元模型或者多元模型,其計算方式有些區別,因為假設有些不同,假如我們需要計算 的值,那麼統計頻率的方式是:
那對於bigram中的第一個詞的概率,由於他之前沒有詞彙,那這時候我們一般會認為句子的開頭和結尾分別有一個抽象符號<s>和</s>,那麼句子就變成了<s>, ,</s>,因此 式可以變為:
其餘的n-gram模型也是類似的計算方法,有的地方說的是不要用添加開始和結尾的符號,直接用unigram和bigram的方法去計算 即可,這里暫時以斯坦福的課程為准吧,但是應該對最終影響有限,畢竟本質上是在做最大似然估計。
在上述 計算過程中,由於分子是詞對出現的次數,那很有可能在語料庫中沒有出現這樣的詞對,這時計算結果就是0,同時也會導致句子的出現概率也為0,那這樣有些不合理,即使寫錯了字,也應當有一定概率出現,所以在計算 式的時候要做一下平滑處理
其原理是保證每一個詞對(對於bigram而言)都會出現一次,因此, 式可以修改為:
其中V是詞的字典數目,這里分母加1是為了保證概率和為1,即 ,通俗理解為,我們往語料庫中加入了 這V個詞對,因此其分母語料庫統計的數目也要加V。
Add-K平滑就是保證每個詞對都出現K次,因此, 式可以修改為:
這里分母加KV和之前的模式是一樣的。
這個估計是一個很重要的平滑方式,其原理就是對於沒有看見的事件,我們不能認為它的發生概率就是零,因此我們從概率的總量(Probability mass)中,分配一個很小的比例給予這些沒有看見的事件,這樣一來,看見的那些事件的概率總和就要小於1,因此,需要將所有看見的事件概率小一點。至於小多少,要根據「越是不可信的統計折扣越多」的方法進行。
可以參考: https://zhuanlan.hu.com/p/53636976
神經網路語言模型就是指利用神經網路進行語言建模,當前的一些預訓練語言模型就是利用神經網路來建模的。
前向神經網路,又被稱為全連接(Fully Connected Neural Network)神經網路,是最早被引入到語言建模中的神經網路結構。前向神經網路一般可表示為:
這里的 是一個resial connect的含義。
其中 ,是權重矩陣, 是輸出層的節點數,在語言模型中等於詞典的大小, 等於隱藏層大小,為用戶自定義。 是輸入的特徵維度。
當我們用上述前饋神經網路來描述語言模型的時候,我們假設要預測詞 ,那我們通常用 這前n-1個詞作為輸入。一般詞的輸入先要做一層embedding的映射,將每個詞轉為一個低維度的向量,這就需要一個look up table,假設字典數目是V,而embedding的長度是m,那麼這個look up table就是一個 的矩陣。輸入了n-1個詞,經過embedding之後,就有n-1個m維度向量,我們將它們拼接起來作為前饋神經網路的輸入,這時候前饋神經網路的輸入維度 ,最終輸出的 作為預測 的得分,然後再接一層softmax得出概率,計算交叉熵損失函數即可訓練模型。
下圖中的每個子單元是在對語句中的某一個詞進行預測。
循環神經網路(Recurrent Neural Networks)是另一種可以用來進行語言模型建模的網路結構,之前提到的前向神經網路語言模型是以前n-1個詞作為輸入來預測當前詞,這種處理方式是解決不了時序問題的,在預測當前詞的時候,無法很好的依賴於上下文(主要是上文),而循環神經網路則可以解決上下文依賴問題。
循環神經網路引入了一個中間隱藏層 ,該隱藏層的狀態可以沿著時間將信息傳給下一次預測。直觀來說,就是將第 時刻的隱藏層的狀態 作為第 時刻模型預測或者訓練的一個輸入,這里的時刻也可以叫做時間步。
下圖是一張對RNN進行時間鋪開的展示圖,每個時間單元都將自身的隱藏層作為下一個時間單元的輸入,這張圖上面並沒有畫出第一個時間單元接受的隱藏層的輸入,事實上,第一個單元也接受了輸入,一般是一個初始化的0向量。
上述的結構依然有局限性,就是它只能利用近期的信息去編碼我們需要的格式,如果時間步的跨度過大,原先的信息會在傳遞中逐漸丟失。
假設現在有這樣一個任務,考慮到下面這句話「I grew up in France… I speak fluent French.」,現在需要語言模型通過現有以前的文字信息預測該句話的最後一個字。通過以前文字語境可以預測出最後一個字是某種語言,但是要猜測出French,要根據之前的France語境。因為這次的有用信息與需要進行處理信息的地方之間的距離較遠,這樣容易導致RNN不能學習到有用的信息,最終推導的任務可能失敗。
LSTMs也是循環神經網路的一種,它利用了cell狀態將長期依賴的信息保留了下來,它也具有這種鏈式結構,但是它的重復單元不同於標准RNN網路里的單元只有一個網路層,它的內部有四個網路層。LSTMs的結構如下圖所示。
LSTM的核心是細胞狀態,用貫穿計算單元的水平線表示。這個狀態區別於隱藏層的狀態,它只是很少的參與信息交換,所以可以保存較遠的時間步的信息。我們可以從下圖看到,細胞狀態在一個時間步裡面只參與三次信息交互:兩次接受信息,一次輸出信息參與計算。這三個操作被稱為門,分別稱為忘記門、輸入門和輸出門。
最後回到語言模型上面,使用RNN進行語言模型建模,那麼輸入的 就是經過embedding的結果,並且最後對於每個 的輸出上再接一層全連接層,輸出詞典數目的維度,最後再加一層softmax就可以得到下一個詞輸出的概率
上述的都是單向語言模型,但是實際上,我們在t時刻的詞的概率不只會依賴於之前的詞,有時候還會和後面的詞有關,比如說there is a tree,這里的is就是單數形式,依賴於後面的a tree來確定。所以就有了兩個單向的LSTM(並不是Bi-LSTM)去更好的進行語言建模。
給定N個token的序列 ,前向語言模型的表示方法為:
同樣的,後向語言模型的表示方法為:
前向模型和後向模型都是用同樣的方式去預測下一個詞,只是方向不同,而且ELMo不光是兩個反方向的LSTM模型疊加,還可以是多層的兩個反方向LSTM疊加,因此會有多個細胞狀態和隱藏層,但其實和單層的是一樣的,只是上層的LSTM接受的輸入是下層的隱藏層(也可以加上殘差連接),兩個不同方向的LSTM模型是互不幹擾的,他們的聯系就只有輸入的token的embedding是共用的,以及最後的全連接加softmax是通用的。ELMo訓練的時候,比如預測詞 ,輸入 左邊的詞彙,經過正向LSTM得到一個 ,同時輸入 右邊的詞彙,經過反向LSTM也得到了一個 ,然後將這兩個hidden拼接到一起之後接一個全連接softmax,就可以得到當前輸出為詞彙表中各詞的概率了,同前文中描述的一樣,交叉熵損失函數就是當前預測詞為實際詞的概率,也就是我們要求的語言模型的概率。
最後的極大似然估計則為:
其中token 的embedding表示的參數 以及softmax 層(全連接加softmax轉成字典的向量維度)參數 前後向是通用的,LSTM 的參數按照方向取不同值。
傳統的語言模型是從左到右或者從右到左的利用上文或者下文去預測當前詞,但實際上,當前詞出現不只是單單依靠上文或者下文,其實應該是同時依賴於上下文,在ELMo裡面,就是用了雙向語言模型的結構,但是這種雙向語言模型只是兩個獨立的前向和後向模型合並起來的,並不是一種完美的結合上下文。因此谷歌在Bidirectional Encoder Representation from Transformers一文中,提出了一種Masked Language Model,該語言模型結構是在一個句子中隨機挑選一部分詞彙,用一個MASK標記替換掉該詞彙,然後在模型訓練的時候去預測該詞彙,完成訓練過程
Masked的具體過程是隨機選擇語料中15%的token,然後再將這些token以80%的概率用[MASK]替換掉,10%的概率用詞彙表中的其餘詞彙替換,還有10%的概率保持不變,然後將這15%的token的位置記錄下來。Masked language model需要將包含了MASK的token輸入到transformer的encoder的結構裡面,encoder會針對每一個輸入的token進行self-attention,這樣就可以讓某個詞的信息編碼到全局信息。最後根據之前MASK的token位置,取出這些token各自對應的hidden,然後再接一個全連接softmax得到預測值(這里的全連接softmax並不加入到語言模型的詞語表徵裡面,只在訓練時候使用),最後再根據實際值去計算mask token的損失函數值。在Bert裡面除了mask token的損失值,還有一個next sentence的損失值,對於兩個句子組成的句子對,bert在構造樣本的時候,會將後一個句子以一定概率替換成其餘的句子,並且要記錄下構造樣本是隨機生成的句子對還是真實的句子對,損失值的計算需要用到[CLS]的表徵結果,我們對[CLS]的表徵結果經過一層全連接softmax,然後去判斷這個句子對是隨機生成的還是真實的。最後,這兩個損失值是直接相加作為最終損失值。
參考鏈接:
Statistical language model 統計語言模型
深入理解語言模型 Language Model
從經典結構到改進方法,神經網路語言模型綜述
深入淺出講解語言模型
神經網路語言建模系列之一:基礎模型
H. Resnet | Block的進化史——未完待續
https://arxiv.org/pdf/1512.03385.pdf
如上述圖片所示,Resnet通過提出shortcut連接,解決了深度學習網路在訓練過程中隨著網路層數越來越多而導致的網路退化問題。這種shortcut的連接有兩種形式,一種是完全的等價連接shortcut,另一種作為降采樣block的shortcut,使得add操作可以在同等維度上進行降采樣shortcut。另外考慮到耗時問題,為了減低更深的resnet網路的耗時,作者提出了一種Bottleneck結構,通過1*1卷積降低作用於3*3卷積的通道數,從而降低計算量和耗時。
對於shortcut的連接有點有兩種我比較認可的解釋:
1:跳躍連接實現了學習的靈活性,使得網路在訓練的過程中可以自由的選擇「更多進行卷積與非線性變換」還是「更多的傾向於什麼都不做」,或者是兩者結合。
2:跳躍連接使得網路剛開始訓練時,由於恆等連接shortcut的存在使得網路從物理上變得更淺,網路訓練更加容易。
https://arxiv.org/pdf/1603.05027.pdf
希望在訓練的過程中,不論是前向還是反向階段,信號可以直接從一個單元傳遞到其他任意一個單元,這種方式要比原始的Resnetblcok的性能更要好。
BN_after_addition:BNrelu的結果放在了恆等信號傳遞的路上,導致優化困難,阻礙了信息的傳遞。
ReLU_before_addition:將Relu放在信號傳遞的輸出部分,導致最終的輸出為非負值,這將限制網路特徵的表達范圍。
它的BN和ReLU全都放置在權重層的前面。
ReLU-only Pre-activation:ReLU層沒有和BN層直連在一起,因此無法共享BN層帶來的訓練優勢。
Pre-activation:這個方法最好。
https://arxiv.org/abs/2004.04989
1:提出了一種基於分段的殘差學習網路結構,該方法為信息在網路各層間的傳播提供了更好的途徑,從而簡化了學習過程。
2.更具原始的block和Pre-activation block存在的問題,作者提出了如下拓撲結構,該結構是一種分段的組織結構,細節為:
(1)把網路結構分為三個部分,四個主要stage和一個啟動和結束階段。
(2)四個主要階段中每個stage都可以包含若干個Blocks,stage1,2,3,4分別有Block的個數為(3,4,6,3)。
(3)每個stage又分為三個部分,一個開始Block,若干個中間Block。比如以resnet50的情況下,有[1,2,4,1]對應stage的中間block。start,middle,end三種blcok的設計如圖所示。