⑴ 神經網路的歷史是什麼
沃倫·麥卡洛克和沃爾特·皮茨(1943)基於數學和一種稱為閾值邏輯的演算法創造了一種神經網路的計算模型。這種模型使得神經網路的研究分裂為兩種不同研究思路。一種主要關注大腦中的生物學過程,另一種主要關注神經網路在人工智慧里的應用。
一、赫布型學習
二十世紀40年代後期,心理學家唐納德·赫布根據神經可塑性的機制創造了一種對學習的假說,現在稱作赫布型學習。赫布型學習被認為是一種典型的非監督式學習規則,它後來的變種是長期增強作用的早期模型。從1948年開始,研究人員將這種計算模型的思想應用到B型圖靈機上。
法利和韋斯利·A·克拉克(1954)首次使用計算機,當時稱作計算器,在MIT模擬了一個赫布網路。納撒尼爾·羅切斯特(1956)等人模擬了一台 IBM 704計算機上的抽象神經網路的行為。
弗蘭克·羅森布拉特創造了感知機。這是一種模式識別演算法,用簡單的加減法實現了兩層的計算機學習網路。羅森布拉特也用數學符號描述了基本感知機里沒有的迴路,例如異或迴路。這種迴路一直無法被神經網路處理,直到保羅·韋伯斯(1975)創造了反向傳播演算法。
在馬文·明斯基和西摩爾·派普特(1969)發表了一項關於機器學習的研究以後,神經網路的研究停滯不前。他們發現了神經網路的兩個關鍵問題。
第一是基本感知機無法處理異或迴路。第二個重要的問題是電腦沒有足夠的能力來處理大型神經網路所需要的很長的計算時間。直到計算機具有更強的計算能力之前,神經網路的研究進展緩慢。
二、反向傳播演算法與復興
後來出現的一個關鍵的進展是保羅·韋伯斯發明的反向傳播演算法(Werbos 1975)。這個演算法有效地解決了異或的問題,還有更普遍的訓練多層神經網路的問題。
在二十世紀80年代中期,分布式並行處理(當時稱作聯結主義)流行起來。戴維·魯姆哈特和詹姆斯·麥克里蘭德的教材對於聯結主義在計算機模擬神經活動中的應用提供了全面的論述。
神經網路傳統上被認為是大腦中的神經活動的簡化模型,雖然這個模型和大腦的生理結構之間的關聯存在爭議。人們不清楚人工神經網路能多大程度地反映大腦的功能。
支持向量機和其他更簡單的方法(例如線性分類器)在機器學習領域的流行度逐漸超過了神經網路,但是在2000年代後期出現的深度學習重新激發了人們對神經網路的興趣。
三、2006年之後的進展
人們用CMOS創造了用於生物物理模擬和神經形態計算的計算設備。最新的研究顯示了用於大型主成分分析和卷積神經網路的納米設備具有良好的前景。
如果成功的話,這會創造出一種新的神經計算設備,因為它依賴於學習而不是編程,並且它從根本上就是模擬的而不是數字化的,雖然它的第一個實例可能是數字化的CMOS設備。
在2009到2012年之間,Jürgen Schmidhuber在Swiss AI Lab IDSIA的研究小組研發的循環神經網路和深前饋神經網路贏得了8項關於模式識別和機器學習的國際比賽。
例如,Alex Graves et al.的雙向、多維的LSTM贏得了2009年ICDAR的3項關於連筆字識別的比賽,而且之前並不知道關於將要學習的3種語言的信息。
IDSIA的Dan Ciresan和同事根據這個方法編寫的基於GPU的實現贏得了多項模式識別的比賽,包括IJCNN 2011交通標志識別比賽等等。
他們的神經網路也是第一個在重要的基準測試中(例如IJCNN 2012交通標志識別和NYU的揚·勒丘恩(Yann LeCun)的MNIST手寫數字問題)能達到或超過人類水平的人工模式識別器。
類似1980年Kunihiko Fukushima發明的neocognitron和視覺標准結構(由David H. Hubel和Torsten Wiesel在初級視皮層中發現的那些簡單而又復雜的細胞啟發)那樣有深度的、高度非線性的神經結構可以被多倫多大學傑弗里·辛頓實驗室的非監督式學習方法所訓練。
2012年,神經網路出現了快速的發展,主要原因在於計算技術的提高,使得很多復雜的運算變得成本低廉。以AlexNet為標志,大量的深度網路開始出現。
2014年出現了殘差神經網路,該網路極大解放了神經網路的深度限制,出現了深度學習的概念。
構成
典型的人工神經網路具有以下三個部分:
1、結構(Architecture)結構指定了網路中的變數和它們的拓撲關系。例如,神經網路中的變數可以是神經元連接的權重(weights)和神經元的激勵值(activities of the neurons)。
2、激勵函數(Activation Rule)大部分神經網路模型具有一個短時間尺度的動力學規則,來定義神經元如何根據其他神經元的活動來改變自己的激勵值。一般激勵函數依賴於網路中的權重(即該網路的參數)。
3、學習規則(Learning Rule)學習規則指定了網路中的權重如何隨著時間推進而調整。這一般被看做是一種長時間尺度的動力學規則。一般情況下,學習規則依賴於神經元的激勵值。它也可能依賴於監督者提供的目標值和當前權重的值。
例如,用於手寫識別的一個神經網路,有一組輸入神經元。輸入神經元會被輸入圖像的數據所激發。在激勵值被加權並通過一個函數(由網路的設計者確定)後,這些神經元的激勵值被傳遞到其他神經元。
這個過程不斷重復,直到輸出神經元被激發。最後,輸出神經元的激勵值決定了識別出來的是哪個字母。
飛速發展的互聯網技術在給人們生活帶來便利的同時,也對安全造成挑戰。今年伊始,一些APP「默認勾選」事件引起輿論關注。
「工信部公布的違規軟體中,絕大部分涉及違規收集使用用戶個人信息、強行捆綁推廣其他應用軟體等問題。」全國政協委員、中國電子信息產業發展研究院院長盧山說,去年工信部下架改號APP超過2000個,其中利用新手段破壞網路安全事件佔比相當大。
工業互聯網、雲計算等新技術新應用中同樣暗藏漏洞。「這些新技術被黑客掌握,也會帶來新威脅。比如量子計算可以更好實現大數據運算,也能被黑客用來攻破高強度加密信息。」在劉多看來,網路就像一個風險無處不在的叢林,在享受便利的同時,還要在安全的邊界上扎緊籬笆。
⑶ 十分鍾一起學會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,下次的十分鍾我們再見。
⑷ 為什麼說Transformer的注意力機制是相對廉價的注意力機制相對更對於RNN系列及CNN系列演算法有何優勢
QA形式對自然語言處理中注意力機制(Attention)進行總結,並對Transformer進行深入解析。
二、Transformer(Attention Is All You Need)詳解
1、Transformer的整體架構是怎樣的?由哪些部分組成?
2、Transformer Encoder 與 Transformer Decoder 有哪些不同?
3、Encoder-Decoder attention 與self-attention mechanism有哪些不同?
4、multi-head self-attention mechanism具體的計算過程是怎樣的?
5、Transformer在GPT和Bert等詞向量預訓練模型中具體是怎麼應用的?有什麼變化?
一、Attention機制剖析
1、為什麼要引入Attention機制?
根據通用近似定理,前饋網路和循環網路都有很強的能力。但為什麼還要引入注意力機制呢?
計算能力的限制:當要記住很多「信息「,模型就要變得更復雜,然而目前計算能力依然是限制神經網路發展的瓶頸。
優化演算法的限制:雖然局部連接、權重共享以及pooling等優化操作可以讓神經網路變得簡單一些,有效緩解模型復雜度和表達能力之間的矛盾;但是,如循環神經網路中的長距離以來問題,信息「記憶」能力並不高。
可以藉助人腦處理信息過載的方式,例如Attention機制可以提高神經網路處理信息的能力。
2、Attention機制有哪些?(怎麼分類?)
當用神經網路來處理大量的輸入信息時,也可以借鑒人腦的注意力機制,只 選擇一些關鍵的信息輸入進行處理,來提高神經網路的效率。按照認知神經學中的注意力,可以總體上分為兩類:
聚焦式(focus)注意力:自上而下的有意識的注意力,主動注意——是指有預定目的、依賴任務的、主動有意識地聚焦於某一對象的注意力;
顯著性(saliency-based)注意力:自下而上的有意識的注意力,被動注意——基於顯著性的注意力是由外界刺激驅動的注意,不需要主動干預,也和任務無關;可以將max-pooling和門控(gating)機制來近似地看作是自下而上的基於顯著性的注意力機制。
在人工神經網路中,注意力機制一般就特指聚焦式注意力。
3、Attention機制的計算流程是怎樣的?
Attention機制的實質其實就是一個定址(addressing)的過程,如上圖所示:給定一個和任務相關的查詢Query向量q,通過計算與Key的注意力分布並附加在Value上,從而計算Attention Value,這個過程實際上是Attention機制緩解神經網路模型復雜度的體現:不需要將所有的N個輸入信息都輸入到神經網路進行計算,只需要從X中選擇一些和任務相關的信息輸入給神經網路。
step1-信息輸入:用X= [x1, · · · , xN ]表示N 個輸入信息;
step2-注意力分布計算:令Key=Value=X,則可以給出注意力分布
我們將稱之為注意力分布(概率分布),為注意力打分機制,有幾種打分機制:
step3-信息加權平均:注意力分布可以解釋為在上下文查詢q時,第i個信息受關注的程度,採用一種「軟性」的信息選擇機制對輸入信息X進行編碼為:
這種編碼方式為軟性注意力機制(soft Attention),軟性注意力機制有兩種:普通模式(Key=Value=X)和鍵值對模式(Key!=Value)。
4、Attention機制的變種有哪些?
與普通的Attention機制(上圖左)相比,Attention機制有哪些變種呢?
變種1-硬性注意力:之前提到的注意力是軟性注意力,其選擇的信息是所有輸入信息在注意力 分布下的期望。還有一種注意力是只關注到某一個位置上的信息,叫做硬性注意力(hard attention)。硬性注意力有兩種實現方式:(1)一種是選取最高概率的輸入信息;(2)另一種硬性注意力可以通過在注意力分布式上隨機采樣的方式實現。硬性注意力模型的缺點:
變種2-鍵值對注意力:即上圖右邊的鍵值對模式,此時Key!=Value,注意力函數變為:
變種3-多頭注意力:多頭注意力(multi-head attention)是利用多個查詢Q = [q1, · · · , qM],來平行地計算從輸入信息中選取多個信息。每個注意力關注輸入信息的不同部分,然後再進行拼接:
5、一種強大的Attention機制:為什麼自注意力模型(self-Attention model)在長距離序列中如此強大?
(1)卷積或循環神經網路難道不能處理長距離序列嗎?
當使用神經網路來處理一個變長的向量序列時,我們通常可以使用卷積網路或循環網路進行編碼來得到一個相同長度的輸出向量序列,如圖所示:
從上圖可以看出,無論卷積還是循環神經網路其實都是對變長序列的一種「局部編碼」:卷積神經網路顯然是基於N-gram的局部編碼;而對於循環神經網路,由於梯度消失等問題也只能建立短距離依賴。
(2)要解決這種短距離依賴的「局部編碼」問題,從而對輸入序列建立長距離依賴關系,有哪些辦法呢?
由上圖可以看出,全連接網路雖然是一種非常直接的建模遠距離依賴的模型, 但是無法處理變長的輸入序列。不同的輸入長度,其連接權重的大小也是不同的。
這時我們就可以利用注意力機制來「動態」地生成不同連接的權重,這就是自注意力模型(self-attention model)。由於自注意力模型的權重是動態生成的,因此可以處理變長的信息序列。
總體來說,為什麼自注意力模型(self-Attention model)如此強大:利用注意力機制來「動態」地生成不同連接的權重,從而處理變長的信息序列。
(3)自注意力模型(self-Attention model)具體的計算流程是怎樣的呢?
同樣,給出信息輸入:用X = [x1, · · · , xN ]表示N 個輸入信息;通過線性變換得到為查詢向量序列,鍵向量序列和值向量序列:
上面的公式可以看出,self-Attention中的Q是對自身(self)輸入的變換,而在傳統的Attention中,Q來自於外部。
注意力計算公式為:
自注意力模型(self-Attention model)中,通常使用縮放點積來作為注意力打分函數,輸出向量序列可以寫為:
二、Transformer(Attention Is All You Need)詳解
從Transformer這篇論文的題目可以看出,Transformer的核心就是Attention,這也就是為什麼本文會在剖析玩Attention機制之後會引出Transformer,如果對上面的Attention機制特別是自注意力模型(self-Attention model)理解後,Transformer就很容易理解了。
1、Transformer的整體架構是怎樣的?由哪些部分組成?
Transformer其實這就是一個Seq2Seq模型,左邊一個encoder把輸入讀進去,右邊一個decoder得到輸出:
Transformer=Transformer Encoder+Transformer Decoder
(1)Transformer Encoder(N=6層,每層包括2個sub-layers):
sub-layer-1:multi-head self-attention mechanism,用來進行self-attention。
sub-layer-2:Position-wise Feed-forward Networks,簡單的全連接網路,對每個position的向量分別進行相同的操作,包括兩個線性變換和一個ReLU激活輸出(輸入輸出層的維度都為512,中間層為2048):
每個sub-layer都使用了殘差網路:
(2)Transformer Decoder(N=6層,每層包括3個sub-layers):
sub-layer-1:Masked multi-head self-attention mechanism,用來進行self-attention,與Encoder不同:由於是序列生成過程,所以在時刻 i 的時候,大於 i 的時刻都沒有結果,只有小於 i 的時刻有結果,因此需要做Mask。
sub-layer-2:Position-wise Feed-forward Networks,同Encoder。
sub-layer-3:Encoder-Decoder attention計算。
2、Transformer Encoder 與 Transformer Decoder 有哪些不同?
(1)multi-head self-attention mechanism不同,Encoder中不需要使用Masked,而Decoder中需要使用Masked;
(2)Decoder中多了一層Encoder-Decoder attention,這與 self-attention mechanism不同。
3、Encoder-Decoder attention 與self-attention mechanism有哪些不同?
它們都是用了 multi-head計算,不過Encoder-Decoder attention採用傳統的attention機制,其中的Query是self-attention mechanism已經計算出的上一時間i處的編碼值,Key和Value都是Encoder的輸出,這與self-attention mechanism不同。代碼中具體體現:
4、multi-head self-attention mechanism具體的計算過程是怎樣的?
Transformer中的Attention機制由Scaled Dot-Proct Attention和Multi-Head Attention組成,上圖給出了整體流程。下面具體介紹各個環節:
Expand:實際上是經過線性變換,生成Q、K、V三個向量;
Split heads: 進行分頭操作,在原文中將原來每個位置512維度分成8個head,每個head維度變為64;
Self Attention:對每個head進行Self Attention,具體過程和第一部分介紹的一致;
Concat heads:對進行完Self Attention每個head進行拼接;
上述過程公式為:
5、Transformer在GPT和Bert等詞向量預訓練模型中具體是怎麼應用的?有什麼變化?
GPT中訓練的是單向語言模型,其實就是直接應用Transformer Decoder;
Bert中訓練的是雙向語言模型,應用了Transformer Encoder部分,不過在Encoder基礎上還做了Masked操作;
BERT Transformer 使用雙向self-attention,而GPT Transformer 使用受限制的self-attention,其中每個token只能處理其左側的上下文。雙向 Transformer 通常被稱為「Transformer encoder」,而左側上下文被稱為「Transformer decoder」,decoder是不能獲要預測的信息的。
⑸ 殘差網路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:
⑹ 一個殘差網路的簡介【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 單元。
⑺ 殘差網路(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)能夠表示這個函數。然而,我們不能保證訓練演算法能夠學得這個函數。因為即使多層感知機能夠表示該函數,學習也可能會失敗,可能的原因有兩種。
第二種過擬合情況不在我們的討論范圍之內,因此我們聚焦在前一種情況,為何殘差網路相比簡單的多層網路能更好的擬合分類函數,即找到期望函數的參數值。
對於普通的不帶短連接的神經網路來說,存在這樣一個命題。
事實上對於高維函數,這一特點依然適用。因此,當函數的輸入維度非常高時,這一做法就變的非常有意義。盡管在高維空間這一特點很難被可視化,但是這個理論給了一個很合理的啟發,就是原則上,帶短連接的網路的擬合高維函數的能力比普通連接的網路更強。這部分我們討論了殘差網路有能力擬合更高維的函數,但是在實際的訓練過程中仍然可能存在各種各樣的問題使得學習到最優的參數非常困難,因此下一小節討論殘差在訓練過程中的優越性。
這個部分我們討論為什麼殘差能夠緩解深層網路的訓練問題,以及探討可能的短連接方式和我們最終選擇的殘差的理由。正如本章第三部分討論的一樣,整個殘差卷積神經網路是由以上的殘差卷積子模塊堆積而成。如上一小節所定義的,假設第 層的殘差卷積字子模塊的映射為
⑻ 殘差網路
殘差網路(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 人工智慧俱樂部 是由網站的研發與產品設計團隊發起、致力於降低人工智慧開發與使用門檻的俱樂部。團隊具備大數據處理分析、可視化與數據建模經驗,已承擔多領域智能項目,具備從底層到前端的全線設計開發能力。主要研究方向為大數據管理分析與人工智慧技術,並以此來促進數據驅動的科學研究。