㈠ 殘差網路(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)能夠表示這個函數。然而,我們不能保證訓練演算法能夠學得這個函數。因為即使多層感知機能夠表示該函數,學習也可能會失敗,可能的原因有兩種。
第二種過擬合情況不在我們的討論范圍之內,因此我們聚焦在前一種情況,為何殘差網路相比簡單的多層網路能更好的擬合分類函數,即找到期望函數的參數值。
對於普通的不帶短連接的神經網路來說,存在這樣一個命題。
事實上對於高維函數,這一特點依然適用。因此,當函數的輸入維度非常高時,這一做法就變的非常有意義。盡管在高維空間這一特點很難被可視化,但是這個理論給了一個很合理的啟發,就是原則上,帶短連接的網路的擬合高維函數的能力比普通連接的網路更強。這部分我們討論了殘差網路有能力擬合更高維的函數,但是在實際的訓練過程中仍然可能存在各種各樣的問題使得學習到最優的參數非常困難,因此下一小節討論殘差在訓練過程中的優越性。
這個部分我們討論為什麼殘差能夠緩解深層網路的訓練問題,以及探討可能的短連接方式和我們最終選擇的殘差的理由。正如本章第三部分討論的一樣,整個殘差卷積神經網路是由以上的殘差卷積子模塊堆積而成。如上一小節所定義的,假設第 層的殘差卷積字子模塊的映射為
㈡ 曠視首席科學家孫劍博士去世,生前曾有過哪些成就
帶隊力壓微軟、谷歌、FB三大巨頭奪得全球競賽冠軍,孫劍是著名的圖像識別深度殘差網路ResNet發明人之一,擁有超過40項專利,頂級學術會議和期刊上發表學術論文100餘篇。
㈢ 一個殘差網路的簡介【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 單元。
㈣ 吳恩達 卷積神經網路 CNN
應用計算機視覺時要面臨的一個挑戰是數據的輸入可能會非常大。例如一張 1000x1000x3 的圖片,神經網路輸入層的維度將高達三百萬,使得網路權重 W 非常龐大。這樣會造成兩個後果:
神經網路結構復雜,數據量相對較少,容易出現過擬合;
所需內存和計算量巨大。
因此,一般的神經網路很難處理蘊含著大量數據的圖像。解決這一問題的方法就是使用卷積神經網路
我們之前提到過,神經網路由淺層到深層,分別可以檢測出圖片的邊緣特徵、局部特徵(例如眼睛、鼻子等),到最後面的一層就可以根據前面檢測的特徵來識別整體面部輪廓。這些工作都是依託卷積神經網路來實現的。
卷積運算(Convolutional Operation)是卷積神經網路最基本的組成部分。我們以邊緣檢測為例,來解釋卷積是怎樣運算的。
圖片最常做的邊緣檢測有兩類:垂直邊緣(Vertical Edges)檢測和水平邊緣(Horizontal Edges)檢測。
比如檢測一張6x6像素的灰度圖片的vertical edge,設計一個3x3的矩陣(稱之為filter或kernel),讓原始圖片和filter矩陣做卷積運算(convolution),得到一個4x4的圖片。 具體的做法是,將filter矩陣貼到原始矩陣上(從左到右從上到下),依次可以貼出4x4種情況。 讓原始矩陣與filter重合的部分做element wise的乘積運算再求和 ,所得的值作為4x4矩陣對應元素的值。如下圖是第一個元素的計算方法,以此類推。
可以看到,卷積運算的求解過程是從左到右,由上到下,每次在原始圖片矩陣中取與濾波器同等大小的一部分,每一部分中的值與濾波器中的值對應相乘後求和,將結果組成一個矩陣。
下圖對應一個垂直邊緣檢測的例子:
如果將最右邊的矩陣當作圖像,那麼中間一段亮一些的區域對應最左邊的圖像中間的垂直邊緣。
下圖3x3濾波器,通常稱為垂直 索伯濾波器 (Sobel filter):
看看用它來處理知名的Lena照片會得到什麼:
現在可以解釋卷積操作的用處了:用輸出圖像中更亮的像素表示原始圖像中存在的邊緣。
你能看出為什麼邊緣檢測圖像可能比原始圖像更有用嗎?
回想一下MNIST手寫數字分類問題。在MNIST上訓練的CNN可以找到某個特定的數字。比如發現數字1,可以通過使用邊緣檢測發現圖像上兩個突出的垂直邊緣。
通常,卷積有助於我們找到特定的局部圖像特徵(如邊緣),用在後面的網路中。
假設輸入圖片的大小為 n×n,而濾波器的大小為 f×f,則卷積後的輸出圖片大小為 (n−f+1)×(n−f+1)。
這樣就有兩個問題:
為了解決這些問題,可以在進行卷積操作前,對原始圖片在邊界上進行填充(Padding),以增加矩陣的大小。通常將 0 作為填充值。
設每個方向擴展像素點數量為 p,則填充後原始圖片的大小為 (n+2p)×(n+2p),濾波器大小保持 f×f不變,則輸出圖片大小為 (n+2p−f+1)×(n+2p−f+1)。
因此,在進行卷積運算時,我們有兩種選擇:
在計算機視覺領域,f通常為奇數。原因包括 Same 卷積中 p=(f−1)/ 2 能得到自然數結果,並且濾波器有一個便於表示其所在位置的中心點。
卷積過程中,有時需要通過填充來避免信息損失,有時也需要通過設置 步長(Stride) 來壓縮一部分信息。
步長表示濾波器在原始圖片的水平方向和垂直方向上每次移動的距離。之前,步長被默認為 1。而如果我們設置步長為 2,則卷積過程如下圖所示:
設步長為 s,填充長度為p, 輸入圖片大小為n x n, 濾波器大小為f x f, 則卷積後圖片的尺寸為:
注意公式中有一個向下取整的符號,用於處理商不為整數的情況。向下取整反映著當取原始矩陣的圖示藍框完全包括在圖像內部時,才對它進行運算。
如果我們想要對三通道的 RGB 圖片進行卷積運算,那麼其對應的濾波器組也同樣是三通道的。過程是將每個單通道(R,G,B)與對應的濾波器進行卷積運算求和,然後再將三個通道的和相加,將 27 個乘積的和作為輸出圖片的一個像素值。
如果想同時檢測垂直和水平邊緣,或者更多的邊緣檢測,可以增加更多的濾波器組。例如設置第一個濾波器組實現垂直邊緣檢測,第二個濾波器組實現水平邊緣檢測。設輸入圖片的尺寸為 n×n×nc(nc為通道數),濾波器尺寸為 f×f×nc,則卷積後的輸出圖片尺寸為 (n−f+1)×(n−f+1)×n′c,n′c為濾波器組的個數。
與之前的卷積過程相比較,卷積神經網路的單層結構多了激活函數和偏移量;而與標准神經網路相比,濾波器的數值對應著權重 W[l],卷積運算對應著 W[l]與 A[l−1]的乘積運算,所選的激活函數變為 ReLU。
對於一個 3x3x3 的濾波器,包括偏移量 b(27+1)在內共有 28 個參數。不論輸入的圖片有多大,用這一個濾波器來提取特徵時,參數始終都是 28 個,固定不變。即選定濾波器組後,參數的數目與輸入圖片的尺寸無關。因此,卷積神經網路的參數相較於標准神經網路來說要少得多。這是 CNN 的優點之一。
圖像中的相鄰像素傾向於具有相似的值,因此通常卷積層相鄰的輸出像素也具有相似的值。這意味著,卷積層輸出中包含的大部分信息都是冗餘的。如果我們使用邊緣檢測濾波器並在某個位置找到強邊緣,那麼我們也可能會在距離這個像素1個偏移的位置找到相對較強的邊緣。但是它們都一樣是邊緣,我們並沒有找到任何新東西。池化層解決了這個問題。這個網路層所做的就是通過減小輸入的大小降低輸出值的數量。池化一般通過簡單的最大值、最小值或平均值操作完成。以下是池大小為2的最大池層的示例:
在計算神經網路的層數時,通常只統計具有權重和參數的層,因此池化層通常和之前的卷積層共同計為一層。
圖中的 FC3 和 FC4 為全連接層,與標準的神經網路結構一致。
個人推薦 一個直觀感受卷積神經網路的網站 。
相比標准神經網路,對於大量的輸入數據,卷積過程有效地減少了 CNN 的參數數量,原因有以下兩點:
-參數共享(Parameter sharing):特徵檢測如果適用於圖片的某個區域,那麼它也可能適用於圖片的其他區域。即在卷積過程中,不管輸入有多大,一個特徵探測器(濾波器)就能對整個輸入的某一特徵進行探測。
-稀疏連接(Sparsity of connections):在每一層中,由於濾波器的尺寸限制,輸入和輸出之間的連接是稀疏的,每個輸出值只取決於輸入在局部的一小部分值。
池化過程則在卷積後很好地聚合了特徵,通過降維來減少運算量。
由於 CNN 參數數量較小,所需的訓練樣本就相對較少,因此在一定程度上不容易發生過擬合現象。並且 CNN 比較擅長捕捉區域位置偏移。即進行物體檢測時,不太受物體在圖片中位置的影響,增加檢測的准確性和系統的健壯性。
在神經網路可以收斂的前提下,隨著網路深度增加,網路的表現先是逐漸增加至飽和,然後迅速下降
需要注意,網路退化問題不是過擬合導致的,即便在模型訓練過程中,同樣的訓練輪次下,退化的網路也比稍淺層的網路的訓練錯誤更高,如下圖所示。
這一點並不符合常理:如果存在某個 K層網路是當前F的最優的網路,我們構造更深的網路。那麼K之後的層數可以擬合成恆等映射,就可以取得和F一直的結果。如果K不是最佳層數,那麼我們比K深,可以訓練出的一定會不差於K的。總而言之,與淺層網路相比,更深的網路的表現不應該更差。因此,一個合理的猜測就是, 對神經網路來說,恆等映射並不容易擬合。
也許我們可以對網路單元進行一定的改造,來改善退化問題?這也就引出了殘差網路的基本思路
既然神經網路不容易擬合一個恆等映射,那麼一種思路就是構造天然的恆等映射。
實驗表明,殘差網路 很好地解決了深度神經網路的退化問題 ,並在ImageNet和CIFAR-10等圖像任務上取得了非常好的結果,同等層數的前提下殘差網路也 收斂得更快 。這使得前饋神經網路可以採用更深的設計。除此之外, 去除個別神經網路層,殘差網路的表現不會受到顯著影響 ,這與傳統的前饋神經網路大相徑庭。
2018年的一篇論文,The Shattered Gradients Problem: If resnets are the answer, then what is the question,指出了一個新的觀點,盡管殘差網路提出是為了解決梯度彌散和網路退化的問題, 它解決的實際上是梯度破碎問題
作者通過可視化的小型實驗(構建和訓練一個神經網路發現,在淺層神經網路中,梯度呈現為棕色雜訊(brown noise),深層神經網路的梯度呈現為白雜訊。在標准前饋神經網路中,隨著深度增加, 神經元梯度的相關性(corelation)按指數級減少 (1 / 2^L) ;同時, 梯度的空間結構也隨著深度增加被逐漸消除 。這也就是梯度破碎現象。
梯度破碎為什麼是一個問題呢?這是因為許多優化方法假設梯度在相鄰點上是相似的,破碎的梯度會大大減小這類優化方法的有效性。另外,如果梯度表現得像白雜訊,那麼某個神經元對網路輸出的影響將會很不穩定。
相較標准前饋網路, 殘差網路中梯度相關性減少的速度從指數級下降到亞線性級 ) (1 / sqrt(L)) ,深度殘差網路中,神經元梯度介於棕色雜訊與白雜訊之間(參見上圖中的c,d,e);殘差連接可以 極大地保留梯度的空間結構 。殘差結構緩解了梯度破碎問題。
1x1 卷積指濾波器的尺寸為 1。當通道數為 1 時,1x1 卷積意味著卷積操作等同於乘積操作。
而當通道數更多時,1x1 卷積的作用實際上類似全連接層的神經網路結構,從而降低(或升高,取決於濾波器組數)數據的維度。
池化能壓縮數據的高度(nH)及寬度(nW),而 1×1 卷積能壓縮數據的通道數(nC)。在如下圖所示的例子中,用 filters個大小為 1×1×32 的濾波器進行卷積,就能使原先數據包含的 32個通道壓縮為 filters 個。
在這之前,網路大都是這樣子的:
也就是卷積層和池化層的順序連接。這樣的話,要想提高精度,增加網路深度和寬度是一個有效途徑,但也面臨著參數量過多、過擬合等問題。(當然,改改超參數也可以提高性能)
有沒有可能在同一層就可以提取不同(稀疏或不稀疏)的特徵呢(使用不同尺寸的卷積核)?於是,2014年,在其他人都還在一味的增加網路深度時(比如vgg),GoogleNet就率先提出了卷積核的並行合並(也稱Bottleneck Layer),如下圖。
和卷積層、池化層順序連接的結構(如VGG網路)相比,這樣的結構主要有以下改進:
按照這樣的結構來增加網路的深度,雖然可以提升性能,但是還面臨計算量大(參數多)的問題。為改善這種現象,GooLeNet借鑒Network-in-Network的思想,使用1x1的卷積核實現降維操作(也間接增加了網路的深度),以此來減小網路的參數量(這里就不對兩種結構的參數量進行定量比較了),如圖所示。
最後實現的inception v1網路是上圖結構的順序連接
由於卷積這門課的其他內容和計算機視覺關系比較密切。對我理解推薦系統幫助不大。所以這個系列就到這里。吳恩達的課還是很好的,作業和課和測驗我都認真做啦。
㈤ 殘差網路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:
㈥ 十分鍾一起學會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,下次的十分鍾我們再見。
㈦ 殘差網路
殘差網路(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 人工智慧俱樂部 是由網站的研發與產品設計團隊發起、致力於降低人工智慧開發與使用門檻的俱樂部。團隊具備大數據處理分析、可視化與數據建模經驗,已承擔多領域智能項目,具備從底層到前端的全線設計開發能力。主要研究方向為大數據管理分析與人工智慧技術,並以此來促進數據驅動的科學研究。