cnpm 网络不能连接_(二十七)通俗易懂理解——Resnet残差网络
Resnet看相關的文章都比較容易理解,本文主要轉自兩篇對該內容有較為全面解釋和理解的文章。
1. 引言
網絡的深度為什么重要?
因為CNN能夠提取low/mid/high-level的特征,網絡的層數越多,意味著能夠提取到不同level的特征越豐富。并且,越深的網絡提取的特征越抽象,越具有語義信息。
為什么不能簡單地增加網絡層數?
對于原來的網絡,如果簡單地增加深度,會導致梯度彌散或梯度爆炸。
對于該問題的解決方法是正則化初始化和中間的正則化層(Batch Normalization),這樣的話可以訓練幾十層的網絡。(原文:This problem,however, has been largely addressed by normalized initialization and intermediate normalization layers, which enable networks with tens of layers to start converging for stochastic gradient descent (SGD) with backpropagation)
雖然通過上述方法能夠訓練了,但是又會出現另一個問題,就是退化問題,網絡層數增加,但是在訓練集上的準確率卻飽和甚至下降了。這個不能解釋為overfitting,因為overfit應該表現為在訓練集上表現更好才對。
退化問題說明了深度網絡不能很簡單地被很好地優化。
作者通過實驗:通過淺層網絡+ y=x 等同映射構造深層模型,結果深層模型并沒有比淺層網絡有等同或更低的錯誤率,推斷退化問題可能是因為深層的網絡并不是那么好訓練,也就是求解器很難去利用多層網絡擬合同等函數。
更直白的說,為什么層數多了準確率反而下降?
一個是56層的網絡一個是20層的網絡,從原理上來說其實56層網絡的解空間是包括了20層網絡的解空間的,換而言之也就是說,56層網絡取得的性能應該大于等于20層網絡的性能的。但是從訓練的迭代過程來看,56層的網絡無論從訓練誤差來看還是測試誤差來看,誤差都大于20層的網絡(這也說明了為什么這不是過擬合現象,因為56層網絡本身的訓練誤差都沒有降下去)。導致這個原因就是雖然56層網絡的解空間包含了20層網絡的解空間,但是我們在訓練網絡用的是隨機梯度下降策略,往往解到的不是全局最優解,而是局部的最優解,顯而易見56層網絡的解空間更加的復雜,所以導致使用隨機梯度下降算法無法解到最優解。
2. 怎么解決退化問題?
2.1.直觀理解
深度殘差網絡。如果深層網絡的后面那些層是恒等映射,那么模型就退化為一個淺層網絡。那現在要解決的就是學習恒等映射函數了。 但是直接讓一些層去擬合一個潛在的恒等映射函數H(x) = x,比較困難,這可能就是深層網絡難以訓練的原因。但是,如果把網絡設計為H(x) = F(x) + x,如下圖。我們可以轉換為學習一個殘差函數F(x) = H(x) - x. 只要F(x)=0,就構成了一個恒等映射H(x) = x. 而且,擬合殘差肯定更加容易。
理論上,對于“隨著網絡加深,準確率下降”的問題,Resnet提供了兩種選擇方式,也就是identity mapping和residual mapping,如果網絡已經到達最優,繼續加深網絡,residual mapping將被push為0,只剩下identity mapping,這樣理論上網絡一直處于最優狀態了,網絡的性能也就不會隨著深度增加而降低了。
一個通俗的理解:
F是求和前網絡映射,H是從輸入到求和后的網絡映射。比如把5映射到5.1,那么引入殘差前是F’(5)=5.1,引入殘差后是H(5)=5.1, H(5)=F(5)+5, F(5)=0.1。這里的F’和F都表示網絡參數映射,引入殘差后的映射對輸出的變化更敏感。比如s輸出從5.1變到5.2,映射F’的輸出增加了1/51=2%,而對于殘差結構輸出從5.1到5.2,映射F是從0.1到0.2,增加了100%。明顯后者輸出變化對權重的調整作用更大,所以效果更好。殘差的思想都是去掉相同的主體部分,從而突出微小的變化,看到殘差網絡我第一反應就是差分放大器…
參考鏈接:https://www.zhihu.com/question/53224378/answer/159102095
這里我們再來延伸思考一下,殘差的思想其實還是很像我們高數中學的泰勒公式的,在泰勒公式中,我們往后相加的是更高階的多項式,這里加的也可以考慮成更高階的多項式。
這種殘差學習結構可以通過前向神經網絡+shortcut連接實現,如結構圖所示。而且shortcut連接相當于簡單執行了同等映射,不會產生額外的參數,也不會增加計算復雜度。 而且,整個網絡可以依舊通過端到端的反向傳播訓練。
該模型在幾個大型比賽中都拿到了1st,所以其威力還是可以的。
2.2.公式推導(敲黑板,劃重點)
3. 殘差指的是什么?
其中ResNet提出了兩種mapping:一種是identity mapping,指的就是圖1中”彎彎的曲線”,另一種residual mapping,指的就是除了”彎彎的曲線“那部分,所以最后的輸出是 y=F(x)+x
identity mapping顧名思義,就是指本身,也就是公式中的x,而residual mapping指的是“差”,也就是y?x,所以殘差指的就是F(x)部分。
4. ResNet結構
它使用了一種連接方式叫做“shortcut connection”,顧名思義,shortcut就是“抄近道”的意思,看下圖我們就能大致理解:
用卷積層進行殘差學習:以上的公式表示為了簡化,都是基于全連接層的,實際上當然可以用于卷積層。加法隨之變為對應channel間的兩個feature map逐元素相加。
設計網絡的規則:
對于輸出feature map大小相同的層,有相同數量的filters,即channel數相同;
當feature map大小減半時(池化),filters數量翻倍。
對于殘差網絡,維度匹配的shortcut連接為實線,反之為虛線。維度不匹配時,同等映射有兩種可選方案:
直接通過zero padding 來增加維度(channel)。
乘以W矩陣投影到新的空間。實現是用1x1卷積實現的,直接改變1x1卷積的filters數目。這種會增加參數。
對于同等映射維度不匹配時,匹配維度的兩種方法,zero padding是參數free的,投影法會帶來參數。作者比較了這兩種方法的優劣。實驗證明,投影法會比zero padding表現稍好一些。因為zero padding的部分沒有參與殘差學習。實驗表明,將維度匹配或不匹配的同等映射全用投影法會取得更稍好的結果,但是考慮到不增加復雜度和參數free,不采用這種方法。
上圖是文章里面的圖,我們可以看到一個“彎彎的弧線“這個就是所謂的”shortcut connection“,也是文中提到identity mapping,這張圖也詮釋了ResNet的真諦,當然大家可以放心,真正在使用的ResNet模塊并不是這么單一,文章中就提出了兩種方式:
這兩種結構分別針對ResNet34(左圖)和ResNet50/101/152(右圖),一般稱整個結構為一個”building block“。其中右圖又稱為”bottleneck design”,目的一目了然,就是為了降低參數的數目,第一個1x1的卷積把256維channel降到64維,然后在最后通過1x1卷積恢復,整體上用的參數數目:1x1x256x64 + 3x3x64x64 + 1x1x64x256 = 69632,而不使用bottleneck的話就是兩個3x3x256的卷積,參數數目: 3x3x256x256x2 = 1179648,差了16.94倍。 (這部分如果看起來比較生澀的話,可以先跳過,待會看完5.2小節再回來看就簡單了~)
對于常規ResNet,可以用于34層或者更少的網絡中,對于Bottleneck Design的ResNet通常用于更深的如101這樣的網絡中,目的是減少計算和參數量(實用目的)。
5. 細節問題
5.1 如圖1所示,如果F(x)和x的channel個數不同怎么辦,因為F(x)和x是按照channel維度相加的,channel不同怎么相加呢?
針對channel個數是否相同,要分成兩種情況考慮,如下圖:
如圖3所示,我們可以清楚的”實線“和”虛線“兩種連接方式, 實線的的Connection部分(”第一個粉色矩形和第三個粉色矩形“)都是執行3x3x64的卷積,他們的channel個數一致,所以采用計算方式:
虛線的的Connection部分(”第一個綠色矩形和第三個綠色矩形“)分別是3x3x64和3x3x128的卷積操作,他們的channel個數不同(64和128),所以采用計算方式:
其中W是卷積操作(用128個(3x3)x64的filter),用來調整x的channel維度的;
5.2 計算細節
這是一個兩層神經網絡,在l層進行激活,得到a[l+1],再次進行激活,兩層之后得到a[l+2]。計算過程是從a[l]開始,首先進行線性激活,根據這個公式:z=wx+b,通過算出z,即x(圖中a[l])乘以權重矩陣w,再加上偏差因子b。然后通過ReLU非線性激活函數得到a,計算得出a[l+1]。接著再次進行線性激活,依據等式z = wx+b,最后根據這個等式再次進行ReLu非線性激活,即,這里的是指ReLU非線性函數,得到的結果就是a[l+2]。換句話說,信息流從到需要經過以上所有步驟,即這組網絡層的主路徑。
在殘差網絡中有一點變化,我們將直接向后,拷貝到神經網絡的深層,在ReLU非線性激活函數前加上,這是一條捷徑。a[l]的信息直接到達神經網絡的深層,不再沿著主路徑傳遞,這就意味著最后這個等式(a[l+1]=g(wa[l]+b))去掉了,取而代之的是另一個ReLU非線性函數,仍然對a[l+1]進行g函數處理,但這次要加上a[l],即:a[l+2]=g(wa[l+1]+b+a[l]),也就是加上的這個產生了一個殘差塊。
在上面這個圖中,我們也可以畫一條捷徑,直達第二層。實際上這條捷徑是在進行ReLU非線性激活函數之前加上的,而這里的每一個節點都執行了線性函數和ReLU激活函數。所以插入的時機是在線性激活之后,ReLU激活之前。除了捷徑,你還會聽到另一個術語“跳躍連接”,就是指跳過一層或者好幾層,從而將信息傳遞到神經網絡的更深層。
這里用的是全連接層舉例的,但是如果在CNN中,如果是一層還想就變成了線性函數了,所以一般選用的是兩層或者多層~~~
5.3.網絡中的網絡以及 1×1 卷積
在架構內容設計方面,其中一個比較有幫助的想法是使用1×1卷積。也許你會好奇,1×1的卷積能做什么呢?不就是乘以數字么?聽上去挺好笑的,結果并非如此,我們來具體看看。
過濾器為1×1,這里是數字2,輸入一張6×6×1的圖片,然后對它做卷積,起過濾器大小為1×1×1,結果相當于把這個圖片乘以數字2,所以前三個單元格分別是2、4、6等等。用1×1的過濾器進行卷積,似乎用處不大,只是對輸入矩陣乘以某個數字。但這僅僅是對于6×6×1的一個通道圖片來說,1×1卷積效果不佳。
如果是一張6×6×32的圖片,那么使用1×1過濾器進行卷積效果更好。具體來說,1×1卷積所實現的功能是遍歷這36個單元格,計算左圖中32個數字和過濾器中32個數字的元素積之和,然后應用ReLU非線性函數。
我們以其中一個單元為例,它是這個輸入層上的某個切片,用這36個數字乘以這個輸入層上1×1切片,得到一個實數,像這樣把它畫在輸出中。
這個1×1×32過濾器中的32個數字可以這樣理解,一個神經元的輸入是32個數字(輸入圖片中左下角位置32個通道中的數字),即相同高度和寬度上某一切片上的32個數字,這32個數字具有不同通道,乘以32個權重(將過濾器中的32個數理解為權重),然后應用ReLU非線性函數,在這里輸出相應的結果。
一般來說,如果過濾器不止一個,而是多個,就好像有多個輸入單元,其輸入內容為一個切片上所有數字,輸出結果是6×6過濾器數量。
所以1×1卷積可以從根本上理解為對這32個不同的位置都應用一個全連接層,全連接層的作用是輸入32個數字(過濾器數量標記為,在這36個單元上重復此過程),輸出結果是6×6×#filters(過濾器數量),以便在輸入層上實施一個非平凡(non-trivial)計算。
這種方法通常稱為1×1卷積,有時也被稱為Network in Network,在林敏、陳強和楊學成的論文中有詳細描述。雖然論文中關于架構的詳細內容并沒有得到廣泛應用,但是1×1卷積或Network in Network這種理念卻很有影響力,很多神經網絡架構都受到它的影響
舉個1×1卷積的例子,相信對大家有所幫助,這是它的一個應用。
假設這是一個28×28×192的輸入層,你可以使用池化層壓縮它的高度和寬度,這個過程我們很清楚。但如果通道數量很大,該如何把它壓縮為28×28×32維度的層呢?你可以用32個大小為1×1的過濾器,嚴格來講每個過濾器大小都是1×1×192維,因為過濾器中通道數量必須與輸入層中通道的數量保持一致。但是你使用了32個過濾器,輸出層為28×28×32,這就是壓縮通道數()的方法,對于池化層我只是壓縮了這些層的高度和寬度。
在之后我們看到在某些網絡中1×1卷積是如何壓縮通道數量并減少計算的。當然如果你想保持通道數192不變,這也是可行的,1×1卷積只是添加了非線性函數,當然也可以讓網絡學習更復雜的函數,比如,我們再添加一層,其輸入為28×28×192,輸出為28×28×192。
1×1卷積層就是這樣實現了一些重要功能的(doing something pretty non-trivial),它給神經網絡添加了一個非線性函數,從而減少或保持輸入層中的通道數量不變,當然如果你愿意,也可以增加通道數量。
6.ResNet50和ResNet101
這里把ResNet50和ResNet101特別提出,主要因為它們的出鏡率很高,所以需要做特別的說明。給出了它們具體的結構:
首先我們看一下表2,上面一共提出了5中深度的ResNet,分別是18,34,50,101和152,首先看表2最左側,我們發現所有的網絡都分成5部分,分別是:conv1,conv2_x,conv3_x,conv4_x,conv5_x,之后的其他論文也會專門用這個稱呼指代ResNet50或者101的每部分。
拿101-layer那列,我們先看看101-layer是不是真的是101層網絡,首先有個輸入7x7x64的卷積,然后經過3 + 4 + 23 + 3 = 33個building block,每個block為3層,所以有33 x 3 = 99層,最后有個fc層(用于分類),所以1 + 99 + 1 = 101層,確實有101層網絡;
注:101層網絡僅僅指卷積或者全連接層,而激活層或者Pooling層并沒有計算在內;
這里我們關注50-layer和101-layer這兩列,可以發現,它們唯一的不同在于conv4_x,ResNet50有6個block,而ResNet101有23個block,查了17個block,也就是17 x 3 = 51層。
7.相關的工作
7.1.殘差表示
VALD,Fisher Vector都是是對殘差向量編碼來表示圖像,在圖像分類,檢索表現出優于編碼原始向量的性能。
在low-level的視覺和計算機圖形學中,為了求解偏微分方程,廣泛使用的Multigrid方法將系統看成是不同尺度上的子問題。每個子問題負責一種更粗糙與更精細尺度的殘差分辨率。Multigrid的一種替換方法是層次化的預處理,層次化的預處理依賴于兩種尺度的殘差向量表示。實驗表明,這些求解器要比對殘差不敏感的求解器收斂更快。
7.2.shortcut連接
普通的平原網絡與深度殘差網絡的最大區別在于,深度殘差網絡有很多旁路的支線將輸入直接連到后面的層,使得后面的層可以直接學習殘差,這些支路就叫做shortcut。傳統的卷積層或全連接層在信息傳遞時,或多或少會存在信息丟失、損耗等問題。ResNet 在某種程度上解決了這個問題,通過直接將輸入信息繞道傳到輸出,保護信息的完整性,整個網絡則只需要學習輸入、輸出差別的那一部分,簡化學習目標和難度。
shortcut連接被實驗和研究了很久。**Highway networks也使用了帶有門函數的shortcut**。但是這些門函數需要參數,而ResNet的shortcut不需要參數。而且當Highway networks的門函數的shortcut關閉時,相當于沒有了殘差函數,但是ResNet的shortcut一直保證學習殘差函數。而且,當Highway networks的層數急劇增加時,沒有表現出準確率的上升了。總之,ResNet可以看成是Highway networks的特例,但是從效果上來看,要比Highway networks好。
篇章2
1.介紹
在Resnet V1的論文中介紹的‘Residual Units'可以用公式表示如下:
(a)是原來的殘差結構,(b)是新的殘差結構。可以看到改進后是先進行BN和RELU計算,然后再用weight進行計算。
2.分析深度殘差網絡
討論
3.等式連接的重要性
作者試驗了以下幾種結構
以上試驗都可以證明在shortcut path上增加任何處理都會影響最后的結果,只有用等式效果會最好。
4.使用激活函數
在上面討論的公式5和公式8中是假設了激活函數f為等式,但是實際上我們的激活函數一般為RELU,下面就來研究一下激活函數的影響。我們想讓f為等式,就需要重新調整RELU和BN等的順序。
現在這個公式9和公式4很像,這個公式表明我們可以應用一種非對稱激活函數,在shortcut部分是等式,在殘差函數部分是先進行激活函數,在與權重w進行計算。所以我們現在就要嘗試使用前激活的方式,有下面兩種方式。
圖(d)表示調整RELU的位置進行前激活。這種結構的表現和原始的結構類似,可能是因為激活函數之前沒有享受到BN帶來的好處。
圖(e)表示調整RELU和BN的位置進行前激活。這種結構會有比較明顯的效果提升。
使用圖(e)結構帶來的好處是雙重的:
更容易優化:這個影響在訓練1001層的resnet的時候特別明顯,使用原始的結構,training error在訓練之初下降的非常慢,因為如果相加上進行RELU激活對傳遞過來的負數信息是有影響的。而如果是等式,信息可以直接從一個單元傳遞到另一個單元,1001層的resnet loss下降的非常快。另外對于層數少一些的resnet比如164層,為relu似乎對性能的影響很小。
降低過擬合:將BN放入RELU的前面可以帶來正則化的效果,降低過擬合,會得到更高的精度。
文章1:
https://blog.csdn.net/u014665013/article/details/81985082?blog.csdn.net文章2:
https://blog.csdn.net/stesha_chen/article/details/82589829?blog.csdn.net總結
以上是生活随笔為你收集整理的cnpm 网络不能连接_(二十七)通俗易懂理解——Resnet残差网络的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 睿远配售比例,有以下三点
- 下一篇: 公积金贷款20年和30年利弊