❶ fluent殘差設置在哪裡
在模型樹節點上。
1、首先打開Fluent軟體,並進入首頁。
2、其次雙擊模型樹節點Monitor和Resial即彈出殘差設置對話框。
3、最後在該對話框中,用戶可以設定每一個物理量的殘差標准,選擇對應的殘差標准即可設置。
4、Fluent是國際上比較流行的商用CFD軟體包,殘差設置是一項測量數據誤差的功能。
❷ 殘差網路(ResNet)
殘差操作這一思想起源於論文《Deep Resial Learning for Image Recognition》。如果存在某個K層的網路f是當前最優的網路,那麼可以構造一個更深的網路,其最後幾層僅是該網路f第K層輸出的恆等映射(IdentityMapping),就可以取得與f一致的結果;也許K還不是所謂「最佳層數」,那麼更深的網路就可以取得更好的結果。 總而言之,與淺層網路相比,更深的網路的表現不應該更差。但是如下圖所示,56層的神經網路表現明顯要比20層的差。 證明更深的網路在訓練過程中的難度更大,因此作者提出了殘差網路的思想。+
ResNet 的作者將這些問題歸結成了一個單一的假設:直接映射是難以學習的。而且他們提出了一種修正方法: 不再學習從 x 到 H(x) 的基本映射關系,而是學習這兩者之間的差異,也就是「殘差(resial)」。然後,為了計算 H(x),我們只需要將這個殘差加到輸入上即可。假設殘差為 F(x)=H(x)-x,那麼現在我們的網路不會直接學習 H(x) 了,而是學習 F(x)+x。
這就帶來了你可能已經見過的著名 ResNet(殘差網路)模塊:
ResNet 的每一個「模塊(block)」都由一系列層和一個「捷徑(shortcut)」連接組成,這個「捷徑」將該模塊的輸入和輸出連接到了一起。然後在元素層面上執行「加法(add)」運算,如果輸入和輸出的大小不同,那就可以使用零填充或投射(通過 1×1 卷積)來得到匹配的大小。
回到我們的思想實驗,這能大大簡化我們對恆等層的構建。直覺上就能知道,比起從頭開始學習一個恆等變換,學會使 F(x) 為 0 並使輸出仍為 x 要容易得多。一般來說,ResNet 會給層一個「參考」點 x,以 x 為基礎開始學習。
在此之前,深度神經網路常常會有梯度消失問題的困擾,因為 ResNet 的梯度信號可以直接通過捷徑連接回到更早的層,而且它們的表現依然良好。
ResNet本質上就幹了一件事:降低數據中信息的冗餘度具體說來,就是對非冗餘信息採用了線性激活(通過skip connection獲得無冗餘的identity部分),然後對冗餘信息採用了非線性激活(通過ReLU對identity之外的其餘部分進行信息提取/過濾,提取出的有用信息即是殘差)。
其中,提取identity這一步,就是ResNet思想的核心。 對ResNet本質的一些思考
一方面是殘差網路更好的擬合分類函數以獲得更高的分類精度,另一方面是殘差網路如何解決網路在層數加深時優化訓練上的難題。
首先從萬能近似定理(Universal Approximation Theorem)入手。這個定理表明,一個前饋神經網路(feedforward neural network)如果具有線性輸出層,同時至少存在一層具有任何一種「擠壓」性質的激活函數(例如logistic sigmoid激活函數)的隱藏層,那麼只要給予這個網路足夠數量的隱藏單元,它就可以以任意的精度來近似任何從一個有限維空間到另一個有限維空間的波萊爾可測函數(Borel Measurable Function)。
萬能近似定理意味著我們在構建網路來學習什麼函數的時候,我們知道一定存在一個多層感知機(Multilayer Perceptron Model,MLP)能夠表示這個函數。然而,我們不能保證訓練演算法能夠學得這個函數。因為即使多層感知機能夠表示該函數,學習也可能會失敗,可能的原因有兩種。
第二種過擬合情況不在我們的討論范圍之內,因此我們聚焦在前一種情況,為何殘差網路相比簡單的多層網路能更好的擬合分類函數,即找到期望函數的參數值。
對於普通的不帶短連接的神經網路來說,存在這樣一個命題。
事實上對於高維函數,這一特點依然適用。因此,當函數的輸入維度非常高時,這一做法就變的非常有意義。盡管在高維空間這一特點很難被可視化,但是這個理論給了一個很合理的啟發,就是原則上,帶短連接的網路的擬合高維函數的能力比普通連接的網路更強。這部分我們討論了殘差網路有能力擬合更高維的函數,但是在實際的訓練過程中仍然可能存在各種各樣的問題使得學習到最優的參數非常困難,因此下一小節討論殘差在訓練過程中的優越性。
這個部分我們討論為什麼殘差能夠緩解深層網路的訓練問題,以及探討可能的短連接方式和我們最終選擇的殘差的理由。正如本章第三部分討論的一樣,整個殘差卷積神經網路是由以上的殘差卷積子模塊堆積而成。如上一小節所定義的,假設第 層的殘差卷積字子模塊的映射為
❸ 殘差網路(ResNets)(Resial Networks (ResNets))
如果我們使用標准優化演算法訓練一個普通網路,比如說梯度下降法,或者其它熱門的優化演算法。如果沒有殘差,沒有這些捷徑或者跳躍連接,憑經驗你會發現隨著網路深度的加深,訓練錯誤會先減少,然後增多。而理論上,隨著網路深度的加深,應該訓練得越來越好才對。也就是說,理論上網路深度越深越好。但實際上,如果沒有殘差網路, 對於一個普通網路來說,深度越深意味著用優化演算法越難訓練。實際上,隨著網路深度的加深,訓練錯誤會越來越多。
但有了ResNets就不一樣了,即使網路再深,訓練的表現卻不錯,比如說訓練誤差減少,就算是訓練深達100層的網路也不例外。有人甚至在1000多層的神經網路中做過實驗,盡管目前我還沒有看到太多實際應用。但是對的激活,或者這些中間的激活能夠到達網路的更深層。這種方式確實有助於解決梯度消失和梯度爆炸問題,讓我們在訓練更深網路的同時,又能保證良好的性能。也許從另外一個角度來看,隨著網路越來深,網路連接會變得臃腫,但是ResNet確實在訓練深度網路方面非常有效。
這里使用跳躍連接(Skip connection),它可以從某一層網路層獲取激活,然後迅速反饋給另外一層。就是指跳過一層或者好幾層,從而將信息傳遞到神經網路的更深層。
相比於從頭訓練權重,如果使用別人已經訓練好的網路結構的權重,通常能夠進展得相當快,用這個作為預訓練。
如果任務只有一個很小的數據集,如圖1所示,我們可以完全使用它的權重,把前面的層都凍結;
要是有一個更大的訓練集,如圖2所示,我們凍結更少的層,然後訓練後面的層;
或者如圖3所示,換成自己的網路結構。
最後,如果有大量數據,我們應該用這些網路和它的權重當做初始化,用它們來代替隨機初始化,接著你可以用梯度下降訓練,更新網路所有層的所有權重。
❹ 殘差神經網路 - ResNet50
上周寫論文的時候,引用了一下愷明大神的ResNet,發現引用量已經到了32888了。檸檬精附體了……現在來回味經典~
萬能近似定理已經說明了深度神經網路的強大之處,只要有一個足夠寬足夠神的非線性神經網路,可以以任意精度的近似模擬一個可測映射函數。然而,臭名昭著的梯度消失(爆炸)問題,讓我們認識到現實:隨著深度的增加,網路表示能力增強的同時,訓練的難度也在增加。於是,愷明大神為我們帶來了 ResNet 。
paper在這里
ResNet的貢獻之一,就是殘差結構 :
上圖中,假設擬合目標函數為 ,非線性的疊加層為 ,一般的做法是,使 逼近 。而殘差結構中,使用 的方式,逼近 。
在反向傳播過程中,求解每層參數的梯度,需要通過鏈式求導法則由深層到淺層,淺層參數的梯度中包含深層梯度的累乘。而在深度較大的神經網路中,連續的累乘極易導致梯度過小或者過大,造成淺層網路的權重難以正常更新。造成深度網路的學習能力退化的現象。
為了解決網路退化,愷明大神提出了殘差結構,這種結構有兩個好處:
含有shortcut的殘差結構可以解決在深度增加時的網路退化問題。在進行shortcut連接時,需要保證張量 與 具有相同的尺寸,然而,我們在進行網路結構設計時,傾向於在淺層網路使用較少的通道,在深層網路,採用更大的通道提取更加抽象的特徵。為了在網路中使用不同的通道數,愷明大神帶來了兩種可選的結構:Identity 和 Bottleneck。
待定。
❺ 一個殘差網路的簡介【MATLAB】
對於許多應用來說,使用由一個簡單的層序列組成的網路就已足夠。但是,某些應用要求網路具有更復雜的層次圖結構,其中的層可接收來自多個層的輸入,也可以輸出到多個層。這些類型的網路通常稱為有向無環圖 (DAG) 網路。殘差網路就是一種 DAG 網路,其中的殘差(或快捷)連接會繞過主網路層。殘差連接讓參數梯度可以更輕松地從輸出層傳播到較淺的網路層,從而能夠訓練更深的網路。增加網路深度可在執行更困難的任務時獲得更高的准確度。
主分支 - 順序連接的卷積層、批量歸一化層和 ReLU 層。
殘差連接 - 繞過主分支的卷積單元。殘差連接和卷積單元的輸出按元素相加。當激活區域的大小變化時,殘差連接也必須包含 1×1 卷積層。殘差連接讓參數梯度可以更輕松地從輸出層流到較淺的網路層,從而能夠訓練更深的網路。
首先創建網路的主分支。主分支包含五部分。
初始部分 - 包含圖像輸入層和帶激活函數的初始卷積層。
三個卷積層階段 - 分別具有不同的特徵大小(32×32、16×16 和 8×8)。每個階段包含 N 個卷積單元。在示例的這一部分中,N = 2。每個卷積單元包含兩個帶激活函數的 3×3 卷積層。netWidth 參數是網路寬度,定義為網路第一卷積層階段中的過濾器數目。第二階段和第三階段中的前幾個卷積單元會將空間維度下采樣二分之一。為了使整個網路中每個卷積層所需的計算量大致相同,每次執行空間下采樣時,都將過濾器的數量增加一倍。
最後部分 - 包含全局平均池化層、全連接層、softmax 層和分類層。
使用 convolutionalUnit(numF,stride,tag) 創建一個卷積單元。numF 是每一層中卷積過濾器的數量,stride 是該單元第一個卷積層的步幅,tag 是添加在層名稱前面的字元數組。convolutionalUnit 函數在示例末尾定義。
為所有層指定唯一名稱。卷積單元中的層的名稱以 'SjUk' 開頭,其中 j 是階段索引,k 是該階段內卷積單元的索引。例如,'S2U1' 表示第 2 階段第 1 單元。
❻ 網路學習系列(三)Inception系列
論文鏈接: Going deeper with convolutions
對於深度學習來說,目前的共識是更深的網路的性能要優於較淺的網路,所以論文中所做的就是在充分利用計算機資源的基礎上,精心設計網路的結構,使網路更深。
1、目前普遍的較為高效的神經網路,是由一系列堆積的卷積層,後面跟有池化層跟全連接層,如果出現過擬合,可以採用dropout進行處理。
2、由network-in-network這篇paper的啟發,1*1的卷積可以用來進行降維打破計算的瓶頸,同時也能增加網路的寬度,保持網路較高的性能。
3、一般來說,如果直接增加網路的深度,會帶來兩個比較嚴重的問題:第一個是網路規模太大,參數太多容易過擬合,第二個是計算資源會急劇的增加,即便只有兩個卷積層連在一起,其計算量也會以冪級增加。解決這個問題的方法是使用較為稀疏的結構,不僅在全連接層進行這種操作,甚至卷積層也需要這么做。Arora等人的研究表明,如果數據集的概率分布可以用一個稀疏的網路進行表示,那麼可以通過分析每一層的激活值的相關性,將相關的神經元進行聚類,進而將網路搭建起來。這也符合赫布原則(赫布原則是神經學的理論,沒搞懂跟這地方是怎麼聯系起來的,有待後續的學習)。然而,目前的計算機手段處理稀疏的數據結構是非常低效的,所以採取了一種折中的辦法,即將稀疏的矩陣聚類到相對密集的子矩陣,當進行稀疏矩陣相乘的操作時就能達到較高的效率。關鍵是如何做到這點,首先,卷積肯定是密集型操作,這個無法改變,而且也有利於計算,關鍵是在其他方面下功夫,可以理解成以下幾點,空間上的稀疏性,採用卷積本身就是一種稀疏,其對圖像的局部進行操作,而且採用了不同大小的卷積核,3*3的卷積核可以理解成5*5的稀疏表示,這也是一種稀疏;特徵上的稀疏性,根據赫布原則(一起激活一起連接,即相關性強的特徵聚集在一起),特徵圖可以由強相關性的特徵圖群聚而成,因此使用了不同級別的特徵圖,例如3*3,5*5等,其內部特徵高度相關,這其實也就是多尺度。
1、原始結構:
網路實現的關鍵是找到某些密集成分,來擬合網路的局部稀疏結構,為了做到這點,網路去除了全連接層,同時構造了上述的結構,體現了聚類的思維,這樣做增加了網路的寬度,同時增加了網路對多尺度的適應性。這個地方卷積核的尺寸不具有特殊的含義,僅僅是為了方便最終組合特徵圖。然而,這樣的結構也有一個較大的缺點,那就是5*5卷積的存在,會極大的增加運算量,同時又有池化層的存在,進行特徵圖的融合增加輸出的數量,使得網路在計算上並不高效。
2、改進結構:
為了減小運算量,在進行卷積之前加入了1*1的卷積進行降維,使得這種結構的高效成為可能。
3、整個結構:
網路的前端還是普通的卷積網路結構,在後面使用了inception網路的堆砌,同時,在網路的下面,還延伸出了幾個分支,這是用來進行輔助分類。
論文鏈接: Batch Normalization
當對深層的網路進行訓練時,由於模型的參數不斷的改變,每一層輸入的概率分布都在不斷的變化,這就要求使用非常小的學習率,同時需要非常謹慎的設置參數。而且由於非線性飽和的存在,會使得網路非常難以訓練,這個現象被稱之為 internal covariate shif。
1、Experience Covariate Shift現象,即系統輸入的分布發生了改變,解決方法是領域適應與遷移學習,作者發現,如果輸入的分布更有利於訓練。
2、非線性飽和問題:網路越深,越容易出現梯度的彌散,而數據的分布不一致,使這種情況出現的概率增加。
3、internal covariate shif問題,即網路訓練過程中網路參數不斷變化,導致各層的輸入分布變化,使得網路不易訓練。
1、由經驗可知,對輸入進行白化處理,可以加快收斂,因此,為了解決每層的輸入不一致的問題,考慮對每一層的輸入進行歸一化,使其分布一致。
2、理論上來說,應該在每一層的非線性激活之後進行歸一化操作,然而,在訓練初期分界面還在劇烈變化,計算出的參數很不穩定,所以一般講歸一化的操作放在非線性激活之前,這也是現在網路所採用的方式。
3、論文中提出的批量歸一化,並非只是簡單的白化處理,在計算梯度時就需要考慮歸一化的問題。因為網路學習的本質就是學習數據的分布,如果只是簡單的歸一化會破壞這種分布,論文給出的解決辦法是歸一化之後要通過均值和方差兩個系數還原這種分布。(在別處還看到另一種說法,就是如果只是單純的歸一化,一旦進行反向傳播操作,會撤銷這種歸一化的處理,所以在最後要通過均值和方差兩個系數來避免這種情況的出現)
4、通過論文中這種歸一化的操作,不僅可以加快訓練,而且在一定程度上可以解決過擬合問題。
論文鏈接: Rethinking the Inception Architecture for Computer Vision
相較於AlexNet與VGGNet,googleNet的計算量與參數無疑少了許多,但是,由於網路的復雜性,使得網路不易於向更大規模進行擴展,論文主要是為了解決這個問題。
1、通用的網路設計原則:
1)避免表示瓶頸:前向傳播網路可以看作一個有向無環圖,從輸入到輸出,其特徵圖應該緩慢的減小。我們不能僅僅通過維度來讀取圖片的信息,因為在維度增加的過程中已經丟掉了許多重要的特徵,例如相關結構。維度信息只是對圖片信息的粗略估計。對於表示瓶頸的簡單理解就是網路中層的池化等操作使得特徵圖尺寸明顯減小。
2)高維度的特徵在局部更加容易處理,在網路中增加非線性關系,可以使訓練更加快速,另外層寬一些還是有好處的,可以增加其表示能力;
3)在網路的深層,空間的聚合可以在較低維度上進行,這樣不會損失表示能力,例如在3*3、5*5卷積之前進行了降維處理。
4)平衡網路的深度與寬度,理論上來說,同時增加網路的深度與寬度都能增加網路的性能,但要考慮計算資源的分配。
2、使用較大的卷積核往往意味著巨大的運算量,理論已經證明,往往可以通過幾個較小的卷積核來代替較大的卷積核,從而使得計算量的下降。
1、
使用3*3卷積代替5*5卷積,且使用了非線性激活。
2、嘗試進一步減小網路的計算量,結果發現,非對稱的結構要比進一步減小卷積核的尺寸更加高效,即將n*n的卷積分解為1*n與n*1,網路設計如下:
實踐證明,在網路的開始應用這種結構效果並沒有明顯的改善,這種網路適用於中等的網路(特徵圖的大小為m*m,m介於12到20之間)
在高維特徵上,如下的網路結構更好一些:
3、採用了輔助分類結構,實踐證明,在初期輔助分類結構並沒有加速訓練過程,反而在訓練將要結束時開始發揮作用,輔助分類結構在這里起到了一個正則化的作用,實驗證明,輔助分類結構使用了batch-normalized或dropout時,主分類器效果會更好。
4、一般來說,會使用池化來減小特徵圖的尺寸,但為了避免表示瓶頸,在池化之前會增加特徵圖的維數,這會導致計算量的增加,論文提出了一種並行結構,使用步長為2的卷積與池化並行操作,之後將兩者的響應結合在一起,這樣既能降低維度,又不至於造成信息提取上的損失。
論文鏈接: Inception-v4, Inception-ResNet
ResNet網路取得了較好的效果,所以嘗試結合ResNet
論文提出,殘差連接並不是訓練較深網路的必要條件,但殘差連接的確可以提升訓練速度,且不會提高運算量。
1、incetion v4:
其中,Stem的結構如圖所示:
inception-A、B、C的結構如下所示:
為了減小運算量,網路加入了rection結構,如下所示:
整個網路思想與前幾個版本並沒有太大的不同,這里不再贅述。
2、inception-resnet v1與inception-resnet v2:
兩者的框架與inception v4大致相同,其中的改進就是將inception模塊變成了inception-resnet模塊,如下所示:
另外,引入了殘差連接之後,如果一個殘差連接的濾波器過多,很可能出現輸出都是0的結果,論文中給出的解決方案是在殘差函數之後,激活函數之前引入一個尺度變換,如下所示:
❼ 十分鍾一起學會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,下次的十分鍾我們再見。
❽ 吳教授的CNN課堂:進階 | 從LeNet到殘差網路(ResNet)和Inception Net
第二周是關於卷積網路(CNN)進階部分,學到挺多新東西。因為之前了解過CNN基礎後,就大多在用RNN進行自然語言處理方面的研究,很多CNN的最新進展雖有耳聞,但是並不清楚。
特別是各個論文模型又喜歡取一些奇怪的名字(比如昨天讀的兩篇論文,一個叫NTT,一個叫TMD),如果沒讀過論文,不了解一些緣由,真是傻傻分不清。
之前看視覺問答時,預處理圖片部分需選擇訓練好的網路,結果一看,一大堆什麼 VGG、Res、Incept 這些看不懂的名詞,而且後面還加著16、19、101等數字和V1、V2、V3這樣的版本數。結果只能兩眼一抹黑,參考別人的論文,瞎選了一個。
閑話不多說,開始吧。
在提到之後的ResNet和Inception Net前,最好先回顧一下CNN裡面成功架構的發展,這樣就可以把握住一條清晰的發展脈絡,之後講解進階網路的時候也能很快理解。
首先是爺爺級的 LeNet-5 ,因為這大概是20年前提出來的了。是當時尚且青澀,而現在已是深度學習四大天王里的LeCun提出的,LeNet也是取自他名字前半截,5表示只有五層,當時用於處理MNIST這樣的手寫數字識別。
在基礎課裡面吳教授也有親手把整個架構畫出來,所以並不是很復雜。分別卷積和池化兩次後,然後直接輸入全連接網路就可以了。
LeNet後,因為人工智慧寒冬,所以很長時間並沒有太大發展。
直到13年的時候,後起之秀Alex Krizhevsky (相信不少人也看過他的博客,聽過他有名的Stanford cs231) 提出了AlexNet,在ImageNet比賽上取得了很大的成功,向大家展示了深度學習的力量,從此掀起一次浪潮。
AlexNet和LeNet差別並不是很大,主要不同有以下三點。
在AlexNet展示了深度學習在圖像處理上的成功後,大家也就開始不斷在其之上完善圖像處理的CNN構架。而VGG就是第一個 非常簡潔又系統化,提出了一套怎麼使用更深的網路來訓練的網路架構 。
VGG的創舉之點在於,比起之前那些網路其中參數的混雜,它很有計劃和條理地布置了架構中各個層的結構。比如說可以列舉出一下幾點:
VGG是當時參賽組(Visual Geometry Group)的名稱。一般現在大家用到的都是VGG-16或者VGG-19,16和19也正如所想,分別是對應的VGG版本中的層數。
看上去16和19層好像也很多了,但和之後ResNet這樣的動不動就101,152層的巨無霸相比,還是小巫見大巫。
那為什麼不也增加VGG的層數呢?
這里要提到深層神經網路訓練中的一個大問題了,那就是當層數過大時,會產生所謂的 梯度爆炸(Exploding Gradients)和梯度消失(Vanishing Gradients) 現象。
打個比方,如果每次的梯度相乘的系數都是小於1的數,假如說0.6, 那麼19 層算下來,0.6的19次方就已經是0.00061了,更別提上百層了。這樣傳播到最底層的時候,能夠 學習到的參數就很小 了,這就是梯度消失。
反過來,梯度爆炸的情況,如果系數大於1,多次累乘後就會得到一個很大的數,也會造成不好的結果。有點像是復利的概念,也就是那個和國王打賭要一棋盤稻子的故事。
梯度爆炸還好解決,可以用 梯度修剪(Gradient Clipping) 修剪一下就好了。而梯度消失就有點難解決了。
因為這樣的問題,所以雖然理論上普通的深處網路是越深學的越好,但是實際上卻事與願違。下圖橫軸是網路層數,豎軸是訓練誤差(越小越好)。 理論上隨著層數增加,誤差就減小,但是實際是過了某個點之後,誤差反而會增大。
那麼ResNet是怎麼訓練到上百層的呢,難道它就不怕上面的問題嗎?
它用一個很簡單的方法解決了上面的問題。
有很多很棒的論文,沒讀之前,看名字覺得很厲害的。但結果一看論文,才發現方法非常之簡潔,特別是有一些利用數學知識推導出的簡單解決方法,讓人不得不一邊拍手稱贊,一邊感嘆自己數學渣。
ResNet也是這樣子的,看名字很酷炫,但是打開論文一看,才發現原來是這樣啊。
ResNet的最主要就是 Shortcut(捷徑) 這個概念。來看看這到底是什麼吧,首先假設我們從一個神經網路中取出兩層,當做是一個塊(block),先不管中間是MLP或者是CNN。
而shortcut就如下圖一樣,從第一層的輸入直接建立一條捷徑到第二層的輸出,激活函數前。
也就是說第二層激活後的輸出可以會發生這樣的變化。
由
變成
這樣子處理之後,我們得到的這一小塊就叫做 Resial Block(殘差塊) ,而把這些塊堆疊起來就是我們的殘差網路了。很簡單吧,像下面這樣,一個34層的殘差網路。
這樣子我們就得到殘差網路,那麼實際上訓練會怎麼樣呢。
正是我們想要的模型,也非常符合理論。
最後再提一下殘差網路背後的原理,為什麼這樣簡單改一下就能夠有這么好的表現呢。
原因是捷徑的建立,使得每一個殘差塊可以 很容易地學習到恆等函數 ,也就是f(x)=x。也就是說加入殘差塊之後,再差也能學會恆等函數,保留信息,把之前的結果直接這樣傳下去,所以也就不用擔心之前提到的 梯度消失 問題了。
介紹Inception網路前,先介紹一下其中一個很重要的概念1x1卷積。
初看1x1卷積的概念會覺得很奇怪,這樣子每次對一個像素進行卷積有什麼用,我們本來不就是想檢測局部的特徵嗎。但是如果理解了 通道 概念的話,就能很好理解了。
因為,如果說普通的 大窗口卷積更注重一個通道內各個特徵的互動 的話,那麼1x1卷積就是只在通道與通道進行卷積運算,加強了通道之間的互動。
這就是第一點, 加強了通道與通道之間的交流 。用這個就可以只對通道進行一些操作,如用1x1卷積增加通道數,減少通道數,也可以不增不減,但是對之前的通道進行整理。
1x1卷積網路還有一個好處,那就是 通過合理運用可以減少整體網路的運算量 。
還是來舉例子吧,假設有以下一個卷積過程。
那麼上面這個過程所需要的運算量大約一億兩千萬次。
而如果我們巧妙地利用1x1卷積來對通道進行合理處理的話,像下面這樣。
運算量會變得只有大概一千二百萬左右,一下子就縮小了十倍。
有了上面的知識以後,一切就簡單多了。Inception網路的核心概念是,既然在選擇CNN架構的時候要為了過濾器的窗口大小考慮半天,那麼 何不把各個尺寸都用上去,最後再把結果接起來就好了呢 。
於是就有了下面這樣的 Inception模塊 。有用1x1、3x3、5x5各個尺寸的卷積,而且還用到之前講到的利用1x1卷積減少運算量的技巧。
最後至於整個Inception網路,就像之前殘差網路一樣,把 Inception模塊 堆疊起來就好了。
當然論文中還有一些次要細節,這里就不多說了。
而且自最初的論文之後,Inception網路也有很多改進,加入了很多技巧,比如之前的殘差網路中的技巧。所以現在網上的Inception網路,後面會有V1、V2、V3之類後綴,表示的就是各個版本。
最後,作為余談,說說為什麼Inception網路要叫做 Inception 網路。
因為在這篇正經的學術論文裡面,作者引用了一個鏈接,點開後會出現這張圖片。
❾ 殘差網路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:
❿ 殘差網路
殘差網路(Resial Network簡稱ResNet)是在2015年繼Alexnet Googlenet VGG三個經典的CNN網路之後提出的,並在ImageNet比賽classification任務上拔得頭籌,ResNet因其簡單又實用的優點,現已在檢測,分割,識別等領域被廣泛的應用。
ResNet可以說是過去幾年中計算機視覺和深度學習領域最具開創性的工作,有效的解決了隨著網路的加深,出現了訓練集准確率下降的問題,如下圖所示:
做過深度學習的同學應該都知道,隨著網路層數的增加而導致訓練效果變差的一個原因是梯度彌散和梯度爆炸問題(vanishing/exploding gradients),這個問題抑制了淺層網路參數的收斂。但是這個問題已經通過一些參數初始化的技術較好的解決了,有興趣的同學可以看參考文獻中的以下幾篇文章:[2][3][4][5][6]。
但是即便如此,在網路深度較高的時候(例如圖中的56層網路)任然會出現效果變差的問題,我們在先前的Alexnet Googlenet VGG三個模型中可以看出,網路的深度在圖片的識別中有著至關重要的作用,深度越深能自動學習到的不同層次的特徵可能就越多,那到底是什麼原因導致了效果變差呢?
Fig. 3
左側19層的VGG模型的計算量是 19.6 billion FLOPs 中間是34層的普通卷積網路計算量是3.6 billion FLOPs。
右邊是34層的ResNet計算量是3.6billion FLOPs,圖中實線的箭頭是沒有維度變化的直接映射,虛線是有維度變化的映射。通過對比可以看出VGG雖然層數不多但是計算量還是很大的,後面我們可以通過實驗數據看到34層的ResNet的表現會比19層的更好。
從圖中可以看出在效果上,34層的殘差網路比VGG和GoogleNet都要好,A,B,C三種方案中C方案效果最好,但是B,C方案在計算量上比A方案要大很多,而效果提升的又很少,所以論文作者建議還是使用A方案較為實用。
下面我們介紹層數在50及以上的殘差網路的結構: Deeper Bottleneck Architectures。這種結構是作者為了降低訓練時間所設計的,結構對比如下圖所示:
ResNet通過殘差學習解決了深度網路的退化問題,讓我們可以訓練出更深的網路,這稱得上是深度網路的一個歷史大突破吧。也許不久會有更好的方式來訓練更深的網路,讓我們一起期待吧!
目前,您可以在 人工智慧建模平台 Mo 找到基於tensorflow 的34層的殘差網路(ResNet)實現樣例,數據集是CIFAR-10 (CIFAR的十分類數據集),這個樣例在測試集上的精度為90%,驗證集上的精度為98%。主程序在ResNet_Operator.py中,網路的Block結構在ResNet_Block.py中,訓練完的模型保存在results文件夾中。
項目源碼地址: http://momodel.cn/explore/5d1b0a031afd944132a0797d?type=app
參考文獻:
[1] _K. He, X. Zhang, S. Ren, and J. Sun. Deep resial learning for image recognition. arXiv preprint arXiv:1512.03385,2015.
[2] Y. LeCun, L. Bottou, G. B. Orr, and K.-R.M¨uller. Efficient backprop.In Neural Networks: Tricks of the Trade, pages 9–50. Springer, 1998.
[3] X. Glorot and Y. Bengio. Understanding the difficulty of training deep feedforward neural networks. In AISTATS, 2010.
[4] A. M. Saxe, J. L. McClelland, and S. Ganguli. Exact solutions to the nonlinear dynamics of learning in deep linear neural networks.arXiv:1312.6120, 2013.
[5] K. He, X. Zhang, S. Ren, and J. Sun. Delving deep into rectifiers:Surpassing human-level performance on imagenet classification. In ICCV, 2015.
[6] S. Ioffe and C. Szegedy. Batch normalization: Accelerating deep network training by recing internal covariate shift. In ICML, 2015.
Mo (網址: momodel.cn )是一個支持 Python 的 人工智慧在線建模平台 ,能幫助你快速開發、訓練並部署模型。
Mo 人工智慧俱樂部 是由網站的研發與產品設計團隊發起、致力於降低人工智慧開發與使用門檻的俱樂部。團隊具備大數據處理分析、可視化與數據建模經驗,已承擔多領域智能項目,具備從底層到前端的全線設計開發能力。主要研究方向為大數據管理分析與人工智慧技術,並以此來促進數據驅動的科學研究。