CNN浅析和历年ImageNet冠军模型解析
http://www.infoq.com/cn/articles/cnn-and-imagenet-champion-model-analysis
今天在這里我給大家講解一些深度學習中卷積神經網絡的原理和一些經典的網絡結構
卷積神經網絡原理淺析
卷積神經網絡(Convolutional?Neural?Network,CNN)最初是為解決圖像識別等問題設計的,當然其現在的應用不僅限于圖像和視頻,也可用于時間序列信號,比如音頻信號、文本數據等。在早期的圖像識別研究中,最大的挑戰是如何組織特征,因為圖像數據不像其他類型的數據那樣可以通過人工理解來提取特征。
在股票預測等模型中,我們可以從原始數據中提取過往的交易價格波動、市盈率、市凈率、盈利增長等金融因子,這即是特征工程。但是在圖像中,我們很難根據人為理解提取出有效而豐富的特征。在深度學習出現之前,我們必須借助SIFT、HoG等算法提取具有良好區分性的特征,再集合SVM等機器學習算法進行圖像識別。
SIFT對一定程度內的縮放、平移、旋轉、視角改變、亮度調整等畸變,都具有不變性,是當時最重要的圖像特征提取方法之一。然而SIFT這類算法提取的特征還是有局限性的,在ImageNet?ILSVRC比賽的最好結果的錯誤率也有26%以上,而且常年難以產生突破。
卷積神經網絡提取的特征則可以達到更好的效果,同時它不需要將特征提取和分類訓練兩個過程分開,它在訓練時就自動提取了最有效的特征。CNN作為一個深度學習架構被提出的最初訴求,是降低對圖像數據預處理的要求,以及避免復雜的特征工程。CNN可以直接使用圖像的原始像素作為輸入,而不必先使用SIFT等算法提取特征,減輕了使用傳統算法如SVM時必需要做的大量重復、煩瑣的數據預處理工作。
和SIFT等算法類似,CNN訓練的模型同樣對縮放、平移、旋轉等畸變具有不變性,有著很強的泛化性。CNN的最大特點在于卷積的權值共享結構,可以大幅減少神經網絡的參數量,防止過擬合的同時又降低了神經網絡模型的復雜度。
卷積神經網絡的概念最早出自19世紀60年代科學家提出的感受野(Receptive?Field37)。當時科學家通過對貓的視覺皮層細胞研究發現,每一個視覺神經元只會處理一小塊區域的視覺圖像,即感受野。到了20世紀80年代,日本科學家提出神經認知機(Neocognitron38)的概念,可以算作是卷積網絡最初的實現原型。
神經認知機中包含兩類神經元,用來抽取特征的S-cells,還有用來抗形變的C-cells,其中S-cells對應我們現在主流卷積神經網絡中的卷積核濾波操作,而C-cells則對應激活函數、最大池化(Max-Pooling)等操作。同時,CNN也是首個成功地進行多層訓練的網絡結構,即前面章節提到的LeCun的LeNet5,而全連接的網絡因為參數過多及梯度彌散等問題,在早期很難順利地進行多層的訓練。
卷積神經網絡可以利用空間結構關系減少需要學習的參數量,從而提高反向傳播算法的訓練效率。在卷積神經網絡中,第一個卷積層會直接接受圖像像素級的輸入,每一個卷積操作只處理一小塊圖像,進行卷積變化后再傳到后面的網絡,每一層卷積(也可以說是濾波器)都會提取數據中最有效的特征。這種方法可以提取到圖像中最基礎的特征,比如不同方向的邊或者拐角,而后再進行組合和抽象形成更高階的特征,因此CNN可以應對各種情況,理論上具有對圖像縮放、平移和旋轉的不變性。
一般的卷積神經網絡由多個卷積層構成,每個卷積層中通常會進行如下幾個操作。
一個卷積層中可以有多個不同的卷積核,而每一個卷積核都對應一個濾波后映射出的新圖像,同一個新圖像中每一個像素都來自完全相同的卷積核,這就是卷積核的權值共享。那我們為什么要共享卷積核的權值參數呢?答案很簡單,降低模型復雜度,減輕過擬合并降低計算量。
(點擊放大圖像)
舉個例子,如圖5-2所示,如果我們的圖像尺寸是1000像素×1000像素,并且假定是黑白圖像,即只有一個顏色通道,那么一張圖片就有100萬個像素點,輸入數據的維度也是100萬。接下來,如果連接一個相同大小的隱含層(100萬個隱含節點),那么將產生100萬×100萬=一萬億個連接。
僅僅一個全連接層(Fully?Connected?Layer),就有一萬億連接的權重要去訓練,這已經超出了普通硬件的計算能力。我們必須減少需要訓練的權重數量,一是降低計算的復雜度,二是過多的連接會導致嚴重的過擬合,減少連接數可以提升模型的泛化性。
圖像在空間上是有組織結構的,每一個像素點在空間上和周圍的像素點實際上是有緊密聯系的,但是和太遙遠的像素點就不一定有什么關聯了。這就是前面提到的人的視覺感受野的概念,每一個感受野只接受一小塊區域的信號。這一小塊區域內的像素是互相關聯的,每一個神經元不需要接收全部像素點的信息,只需要接收局部的像素點作為輸入,而后將所有這些神經元收到的局部信息綜合起來就可以得到全局的信息。
這樣就可以將之前的全連接的模式修改為局部連接,之前隱含層的每一個隱含節點都和全部像素相連,現在我們只需要將每一個隱含節點連接到局部的像素節點。假設局部感受野大小是10×10,即每個隱含節點只與10×10個像素點相連,那么現在就只需要10×10×100萬=1億個連接,相比之前的1萬億縮小了10000倍。
簡單說,全連接就是上圖的左邊部分,而局部連接就是上圖的右邊部分。局部連接可以大大降低神經網絡參數量,從100M*100M = 1萬億,到10*10*100萬=1億。
(點擊放大圖像)
上面我們通過局部連接(Locally?Connect)的方法,將連接數從1萬億降低到1億,但仍然偏多,需要繼續降低參數量。現在隱含層每一個節點都與10×10的像素相連,也就是每一個隱含節點都擁有100個參數。假設我們的局部連接方式是卷積操作,即默認每一個隱含節點的參數都完全一樣,那我們的參數不再是1億,而是100。不論圖像有多大,都是這10×10=100個參數,即卷積核的尺寸,這就是卷積對縮小參數量的貢獻。
簡單說,卷積就是使用完全相同的(參數相同)的模板去進行局部連接,所以參數量可以繼續驟降
我們不需要再擔心有多少隱含節點或者圖片有多大,參數量只跟卷積核的大小有關,這也就是所謂的權值共享。但是如果我們只有一個卷積核,我們就只能提取一種卷積核濾波的結果,即只能提取一種圖片特征,這不是我們期望的結果。好在圖像中最基本的特征很少,我們可以增加卷積核的數量來多提取一些特征。
圖像中的基本特征無非就是點和邊,無論多么復雜的圖像都是點和邊組合而成的。人眼識別物體的方式也是從點和邊開始的,視覺神經元接受光信號后,每一個神經元只接受一個區域的信號,并提取出點和邊的特征,然后將點和邊的信號傳遞給后面一層的神經元,再接著組合成高階特征,比如三角形、正方形、直線、拐角等,再繼續抽象組合,得到眼睛、鼻子和嘴等五官,最后再將五官組合成一張臉,完成匹配識別。
因此我們的問題就很好解決了,只要我們提供的卷積核數量足夠多,能提取出各種方向的邊或各種形態的點,就可以讓卷積層抽象出有效而豐富的高階特征。每一個卷積核濾波得到的圖像就是一類特征的映射,即一個Feature?Map。一般來說,我們使用100個卷積核放在第一個卷積層就已經很充足了。
那這樣的話,如上圖所示,我們的參數量就是100×100=1萬個,相比之前的1億又縮小了10000倍。因此,依靠卷積,我們就可以高效地訓練局部連接的神經網絡了。卷積的好處是,不管圖片尺寸如何,我們需要訓練的權值數量只跟卷積核大小、卷積核數量有關,我們可以使用非常少的參數量處理任意大小的圖片。每一個卷積層提取的特征,在后面的層中都會抽象組合成更高階的特征。
我們再總結一下,卷積神經網絡的要點就是局部連接(Local?Connection)、權值共享(Weight?Sharing)和池化層(Pooling)中的降采樣(Down-Sampling)。
其中,局部連接和權值共享降低了參數量,使訓練復雜度大大下降,并減輕了過擬合。同時權值共享還賦予了卷積網絡對平移的容忍性,而池化層降采樣則進一步降低了輸出參數量,并賦予模型對輕度形變的容忍性,提高了模型的泛化能力。
卷積神經網絡相比傳統的機器學習算法,無須手工提取特征,也不需要使用諸如SIFT之類的特征提取算法,可以在訓練中自動完成特征的提取和抽象,并同時進行模式分類,大大降低了應用圖像識別的難度;相比一般的神經網絡,CNN在結構上和圖片的空間結構更為貼近,都是2D的有聯系的結構,并且CNN的卷積連接方式和人的視覺神經處理光信號的方式類似。
下面介紹一下經典的卷積網絡LeNet5。
大名鼎鼎的LeNet5?誕生于1994年,是最早的深層卷積神經網絡之一,并且推動了深度學習的發展。從1988年開始,在多次成功的迭代后,這項由Yann?LeCun完成的開拓性成果被命名為LeNet5。
LeCun認為,可訓練參數的卷積層是一種用少量參數在圖像的多個位置上提取相似特征的有效方式,這和直接把每個像素作為多層神經網絡的輸入不同。像素不應該被使用在輸入層,因為圖像具有很強的空間相關性,而使用圖像中獨立的像素直接作為輸入則利用不到這些相關性。
LeNet5當時的特性有如下幾點。
- 每個卷積層包含三個部分:卷積、池化和非線性激活函數
- 使用卷積提取空間特征
- 降采樣(Subsample)的平均池化層(Average?Pooling)
- 雙曲正切(Tanh)或S型(Sigmoid)的激活函數
- MLP作為最后的分類器
- 層與層之間的稀疏連接減少計算復雜度
LeNet5中的諸多特性現在依然在state-of-the-art卷積神經網絡中使用,可以說LeNet5是奠定了現代卷積神經網絡的基石之作。Lenet-5的結構下圖所示。
(點擊放大圖像)
它的輸入圖像為32×32的灰度值圖像,后面有3個卷積層,1個全連接層和1個高斯連接層。
下面我們來介紹一些其他幾個經典的卷積網絡結構,AlexNet、VGGNet、Google Inception Net和ResNet,這4種網絡依照出現的先后順序排列,深度和復雜度也依次遞進。
它們分別獲得了ILSVRC(ImageNet?Large?Scale?Visual?Recognition?Challenge)比賽分類項目的2012年冠軍(AlexNet, top-5錯誤率16.4%,使用額外數據可達到15.3%,8層神經網絡)、2014年亞軍(VGGNet,top-5錯誤率7.3%,19層神經網絡),2014年冠軍(InceptionNet,top-5錯誤率6.7%,22層神經網絡)和2015年的冠軍(ResNet,top-5錯誤率3.57%,152層神經網絡)。
(點擊放大圖像)
如圖所示,ILSVRC的top-5錯誤率在最近幾年取得重大突破,而主要的突破點都是在深度學習和卷積神經網絡,成績的大幅提升幾乎都伴隨著卷積神經網絡的層數加深。
(點擊放大圖像)
前面提到的計算機視覺比賽ILSVRC使用的數據都來自ImageNet,如上圖所示。ImageNet項目于2007年由斯坦福大學華人教授李飛飛創辦,目標是收集大量帶有標注信息的圖片數據供計算機視覺模型訓練。ImageNet擁有1500萬張標注過的高清圖片,總共擁有22000類,其中約有100萬張標注了圖片中主要物體的定位邊框。
(點擊放大圖像)
每年度的ILSVRC比賽數據集中大概擁有120萬張圖片,以及1000類的標注,是ImageNet全部數據的一個子集。比賽一般采用top-5和top-1分類錯誤率作為模型性能的評測指標,上圖所示為AlexNet識別ILSVRC數據集中圖片的情況,每張圖片下面是分類預測得分最高的5個分類及其分值。
AlexNet技術特點概要
AlexNet是現代深度CNN的奠基之作。
2012年,Hinton的學生Alex?Krizhevsky提出了深度卷積神經網絡模型AlexNet,它可以算是LeNet的一種更深更寬的版本。AlexNet中包含了幾個比較新的技術點,也首次在CNN中成功應用了ReLU、Dropout和LRN等Trick。同時AlexNet也使用了GPU進行運算加速,作者開源了他們在GPU上訓練卷積神經網絡的CUDA代碼。
AlexNet包含了6億3000萬個連接,6000萬個參數和65萬個神經元,擁有5個卷積層,其中3個卷積層后面連接了最大池化層,最后還有3個全連接層。AlexNet以顯著的優勢贏得了競爭激烈的ILSVRC?2012比賽,top-5的錯誤率降低至了16.4%,相比第二名的成績26.2%錯誤率有了巨大的提升。
AlexNet可以說是神經網絡在低谷期后的第一次發聲,確立了深度學習(深度卷積網絡)在計算機視覺的統治地位,同時也推動了深度學習在語音識別、自然語言處理、強化學習等領域的拓展。
AlexNet將LeNet的思想發揚光大,把CNN的基本原理應用到了很深很寬的網絡中。AlexNet主要使用到的新技術點如下。
(點擊放大圖像)
?
整個AlexNet有8個需要訓練參數的層(不包括池化層和LRN層),前5層為卷積層,后3層為全連接層,上圖所示。AlexNet最后一層是有1000類輸出的Softmax層用作分類。LRN層出現在第1個及第2個卷積層后,而最大池化層出現在兩個LRN層及最后一個卷積層后。
(點擊放大圖像)
AlexNet每層的超參數、參數量、計算量上圖所示。
我們可以發現一個比較有意思的現象,在前幾個卷積層,雖然計算量很大,但參數量很小,都在1M左右甚至更小,只占AlexNet總參數量的很小一部分。這就是卷積層有用的地方,可以通過較小的參數量提取有效的特征。
雖然每一個卷積層占整個網絡的參數量的1%都不到,但是如果去掉任何一個卷積層,都會使網絡的分類性能大幅地下降。
VGGNet技術特點概要
VGGNet是牛津大學計算機視覺組(Visual?Geometry?Group)和Google?DeepMind公司的研究員一起研發的的深度卷積神經網絡。VGGNet探索了卷積神經網絡的深度與其性能之間的關系,通過反復堆疊3*3的小型卷積核和2*2的最大池化層,VGGNet成功地構筑了16~19層深的卷積神經網絡。VGGNet相比之前state-of-the-art的網絡結構,錯誤率大幅下降,并取得了ILSVRC?2014比賽分類項目的第2名和定位項目的第1名。
VGGNet論文中全部使用了3*3的卷積核和2*2的池化核,通過不斷加深網絡結構來提升性能。下圖所示為VGGNet各級別的網絡結構圖,和每一級別的參數量,從11層的網絡一直到19層的網絡都有詳盡的性能測試。
(點擊放大圖像)
(點擊放大圖像)
雖然從A到E每一級網絡逐漸變深,但是網絡的參數量并沒有增長很多,這是因為參數量主要都消耗在最后3個全連接層。前面的卷積部分雖然很深,但是消耗的參數量不大,不過訓練比較耗時的部分依然是卷積,因其計算量比較大。
VGGNet擁有5段卷積,每一段內有2~3個卷積層,同時每段尾部會連接一個最大池化層用來縮小圖片尺寸。每段內的卷積核數量一樣,越靠后的段的卷積核數量越多:64?–?128?–?256?–?512?–?512。其中經常出現多個完全一樣的3*3的卷積層堆疊在一起的情況,這其實是非常有用的設計。
(點擊放大圖像)
如上圖所示,兩個3*3的卷積層串聯相當于1個5*5的卷積層,即一個像素會跟周圍5*5的像素產生關聯,可以說感受野大小為5*5。而3個3*3的卷積層串聯的效果則相當于1個7*7的卷積層。除此之外,3個串聯的3*3的卷積層,擁有比1個7*7的卷積層更少的參數量,只有后者的55%。
最重要的是,3個3*3的卷積層擁有比1個7*7的卷積層更多的非線性變換(前者可以使用三次ReLU激活函數,而后者只有一次),使得CNN對特征的學習能力更強。
作者在對比各級網絡時總結出了以下幾個觀點。
InceptionNet技術特點概要
Google?Inception?Net首次出現在ILSVRC?2014的比賽中(和VGGNet同年),就以較大優勢取得了第一名。那屆比賽中的Inception?Net通常被稱為Inception?V1,它最大的特點是控制了計算量和參數量的同時,獲得了非常好的分類性能——top-5錯誤率6.67%,只有AlexNet的一半不到。
Inception?V1有22層深,比AlexNet的8層或者VGGNet的19層還要更深。但其計算量只有15億次浮點運算,同時只有500萬的參數量,僅為AlexNet參數量(6000萬)的1/12,卻可以達到遠勝于AlexNet的準確率,可以說是非常優秀并且非常實用的模型。
Inception?V1降低參數量的目的有兩點:第一,參數越多模型越龐大,需要供模型學習的數據量就越大,而目前高質量的數據非常昂貴;第二,參數越多,耗費的計算資源也會更大。
Inception?V1參數少但效果好的原因除了模型層數更深、表達能力更強外,還有兩點:一是去除了最后的全連接層,用全局平均池化層(即將圖片尺寸變為1*1)來取代它。全連接層幾乎占據了AlexNet或VGGNet中90%的參數量,而且會引起過擬合,去除全連接層后模型訓練更快并且減輕了過擬合。
二是Inception?V1中精心設計的Inception?Module提高了參數的利用效率,其結構如圖10所示。這一部分也借鑒了Network?In?Network的思想,形象的解釋就是Inception?Module本身如同大網絡中的一個小網絡,其結構可以反復堆疊在一起形成大網絡。
(點擊放大圖像)
我們再來看Inception?Module的基本結構,其中有4個分支:第一個分支對輸入進行1*1的卷積,這其實也是NIN中提出的一個重要結構。1*1的卷積是一個非常優秀的結構,它可以跨通道組織信息,提高網絡的表達能力,同時可以對輸出通道升維和降維。
可以看到Inception?Module的4個分支都用到了1*1卷積,來進行低成本(計算量比3*3小很多)的跨通道的特征變換。
第二個分支先使用了1*1卷積,然后連接3*3卷積,相當于進行了兩次特征變換。第三個分支類似,先是1*1的卷積,然后連接5*5卷積。最后一個分支則是3*3最大池化后直接使用1*1卷積。
Inception?Module的4個分支在最后通過一個聚合操作合并(在輸出通道數這個維度上聚合)。
同時,Google?Inception?Net還是一個大家族,包括:
- 2014年9月的論文Going?Deeper?with?Convolutions提出的Inception?V1(top-5錯誤率6.67%)。
- 2015年2月的論文Batch?Normalization:?Accelerating?Deep?Network?Training?by?Reducing?Internal?Covariate提出的Inception?V2(top-5錯誤率4.8%)。
- 2015年12月的論文Rethinking?the?Inception?Architecture?for?Computer?Vision提出的Inception?V3(top-5錯誤率3.5%)。
- 2016年2月的論文Inception-v4,?Inception-ResNet?and?the?Impact?of?Residual?Connections?on?Learning提出的Inception?V4(top-5錯誤率3.08%)。
Inception?V2學習了VGGNet,用兩個3*3的卷積代替5*5的大卷積(用以降低參數量并減輕過擬合),還提出了著名的Batch?Normalization(以下簡稱BN)方法。BN是一個非常有效的正則化方法,可以讓大型卷積網絡的訓練速度加快很多倍,同時收斂后的分類準確率也可以得到大幅提高。
BN在用于神經網絡某層時,會對每一個mini-batch數據的內部進行標準化(normalization)處理,使輸出規范化到N(0,1)的正態分布,減少了Internal?Covariate?Shift(內部神經元分布的改變)。
BN的論文指出,傳統的深度神經網絡在訓練時,每一層的輸入的分布都在變化,導致訓練變得困難,我們只能使用一個很小的學習速率解決這個問題。而對每一層使用BN之后,我們就可以有效地解決這個問題,學習速率可以增大很多倍,達到之前的準確率所需要的迭代次數只有1/14,訓練時間大大縮短。
而達到之前的準確率后,可以繼續訓練,并最終取得遠超于Inception?V1模型的性能——top-5錯誤率4.8%,已經優于人眼水平。因為BN某種意義上還起到了正則化的作用,所以可以減少或者取消Dropout,簡化網絡結構。
ResNet技術特點概要
ResNet(Residual?Neural?Network)由微軟研究院的Kaiming?He等4名華人提出,通過使用Residual?Unit成功訓練152層深的神經網絡,在ILSVRC?2015比賽中獲得了冠軍,取得3.57%的top-5錯誤率,同時參數量卻比VGGNet低,效果非常突出。
ResNet的結構可以極快地加速超深神經網絡的訓練,模型的準確率也有非常大的提升。
ResNet最初的靈感出自這個問題:在不斷加神經網絡的深度時,會出現一個Degradation的問題,即準確率會先上升然后達到飽和,再持續增加深度則會導致準確率下降。
這并不是過擬合的問題,因為不光在測試集上誤差增大,訓練集本身誤差也會增大。假設有一個比較淺的網絡達到了飽和的準確率,那么后面再加上幾個的全等映射層,起碼誤差不會增加,即更深的網絡不應該帶來訓練集上誤差上升。
而這里提到的使用全等映射直接將前一層輸出傳到后面的思想,就是ResNet的靈感來源。假定某段神經網絡的輸入是x,期望輸出是H(x),如果我們直接把輸入x傳到輸出作為初始結果,那么此時我們需要學習的目標就是F(x)=H(x)-x。
(點擊放大圖像)
這就是一個ResNet的殘差學習單元(Residual?Unit),ResNet相當于將學習目標改變了,不再是學習一個完整的輸出H(x),只是輸出和輸入的差別H(x)-x,即殘差。
(點擊放大圖像)
上圖所示為VGGNet-19,以及一個34層深的普通卷積網絡,和34層深的ResNet網絡的對比圖。可以看到普通直連的卷積神經網絡和ResNet的最大區別在于,ResNet有很多旁路的支線將輸入直接連到后面的層,使得后面的層可以直接學習殘差,這種結構也被稱為shortcut或skip?connections。
傳統的卷積層或全連接層在信息傳遞時,或多或少會存在信息丟失、損耗等問題。ResNet在某種程度上解決了這個問題,通過直接將輸入信息繞道傳到輸出,保護信息的完整性,整個網絡則只需要學習輸入、輸出差別的那一部分,簡化學習目標和難度。
(點擊放大圖像)
上圖所示為ResNet在不同層數時的網絡配置,其中基礎結構很類似,都是前面提到的兩層和三層的殘差學習單元的堆疊。
在使用了ResNet的結構后,可以發現層數不斷加深導致的訓練集上誤差增大的現象被消除了,ResNet網絡的訓練誤差會隨著層數增大而逐漸減小,并且在測試集上的表現也會變好。
(點擊放大圖像)
小結
此就將ALexNet、VGGNet、Inception Net、ResNet四種經典的卷積介紹完了,下面我們簡單總結一下。我們簡單回顧卷積神經網絡的歷史,上圖所示大致勾勒出最近幾十年卷積神經網絡的發展方向。
Perceptron(感知機)于1957年由Frank?Resenblatt提出,而Perceptron不僅是卷積網絡,也是神經網絡的始祖。Neocognitron(神經認知機)是一種多層級的神經網絡,由日本科學家Kunihiko?Fukushima于20世紀80年代提出,具有一定程度的視覺認知的功能,并直接啟發了后來的卷積神經網絡。
LeNet-5由CNN之父Yann?LeCun于1997年提出,首次提出了多層級聯的卷積結構,可對手寫數字進行有效識別。可以看到前面這三次關于卷積神經網絡的技術突破,間隔時間非常長,需要十余年甚至更久才出現一次理論創新。
而后于2012年,Hinton的學生Alex依靠8層深的卷積神經網絡一舉獲得了ILSVRC?2012比賽的冠軍,瞬間點燃了卷積神經網絡研究的熱潮。AlexNet成功應用了ReLU激活函數、Dropout、最大覆蓋池化、LRN層、GPU加速等新技術,并啟發了后續更多的技術創新,卷積神經網絡的研究從此進入快車道。
在AlexNet之后,我們可以將卷積神經網絡的發展分為兩類,一類是網絡結構上的改進調整(圖6-18中的左側分支),另一類是網絡深度的增加(圖18中的右側分支)。
2013年,顏水成教授的Network?in?Network工作首次發表,優化了卷積神經網絡的結構,并推廣了1*1的卷積結構。在改進卷積網絡結構的工作中,后繼者還有2014年的Google?Inception?Net?V1,提出了Inception?Module這個可以反復堆疊的高效的卷積網絡結構,并獲得了當年ILSVRC比賽的冠軍。
2015年初的Inception?V2提出了Batch?Normalization,大大加速了訓練過程,并提升了網絡性能。2015年年末的Inception?V3則繼續優化了網絡結構,提出了Factorization?in?Small?Convolutions的思想,分解大尺寸卷積為多個小卷積乃至一維卷積。
而右側分支上,許多研究工作則致力于加深網絡層數,2014年,ILSVRC比賽的亞軍VGGNet全程使用3*3的卷積,成功訓練了深達19層的網絡,當年的季軍MSRA-Net也使用了非常深的網絡。
2015年,微軟的ResNet成功訓練了152層深的網絡,一舉拿下了當年ILSVRC比賽的冠軍,top-5錯誤率降低至3.46%。
我們可以看到,自AlexNet于2012年提出后,深度學習領域的研究發展極其迅速,基本上每年甚至每幾個月都會出現新一代的技術。新的技術往往伴隨著新的網絡結構,更深的網絡的訓練方法等,并在圖像識別等領域不斷創造新的準確率記錄。
CNN的技術日新月異,當然其中不可忽視的推動力是,我們擁有了更快的GPU計算資源用以實驗,以及非常方便的開源工具(比如TensorFlow)可以讓研究人員快速地進行探索和嘗試。在以前,研究人員如果沒有像Alex那樣高超的編程實力能自己實現cuda-convnet,可能都沒辦法設計CNN或者快速地進行實驗。
現在有了TensorFlow,研究人員和開發人員都可以簡單而快速地設計神經網絡結構并進行研究、測試、部署乃至實用。
答疑環節
Q1:tensorflow的學習路線?
黃文堅:如果想快速入門,可以結合MNIST數據集,嘗試MLP、CNN進行圖像分類,而后嘗試在MNSIT上實現AutoEncoder。此后,可以學習TensorBoard,這是一個非常方便的可視化工具。之后掌握進階的CNN、RNN,強化學習訓練方式。然后如果有興趣,可以掌握單機多GPU并行計算,多機多GPU分布式訓練。目前TensorFlow中還推出了很多組件,比如TF.Learn,Slim,XLA、Fold等,可以針對需求探索。
Q2:目前主流的深度學習工具主要包括TensorFlow,Caffe和Mxnet。相比于其他兩個庫,您認為TensorFlow的主要優勢是哪些?未來TensorFlow的發展趨勢著眼于哪些方面,謝謝老師~
黃文堅:Caffe是比較經典的老框架,缺陷在于使用配置文件定義網絡結構,調試網絡不是很方便,并且基于層的構筑方式,一層一層的堆疊網絡,對于一些更靈活的圖的結構,表示不方便,并且分布式也不完善。
MXnet是國人推出的框架,主要作者是陳天奇和李沐。MXNet非常靈活,支持多種編程范式,并且分布式性能很好,支持的前端語言綁定很多。缺點是,開發團隊小,框架產品代碼質量穩定性不如TensorFlow。并且非常缺完善的文檔和資料。
TensorFlow是Google大力研發的框架,大約有100-200人的全職的Engineer在協作開發,擁有產品級的代碼質量,完善的穩定,高可靠性,適合生產環境使用。同時其計算圖定義模式,也非常靈活,可以進行各種靈活的調試。并且目前大部分新推出的Paper和研究,都使用TensorFlow進行實現,可用的模型代碼非常多。
在TensorFlow Models庫中,也有大量可靠的開源模型實現,比如SyntaxNet,TextSum等。并且TensorFlow在Github上,獲得的star數名列機器學習庫第一,基本是第2-第10名之和。
Q3:tensorflow在文本領域表現如何?
黃文堅:做文本分析和處理,主要使用RNN,少數情況使用CNN。這兩種網絡TensorFlow都支持的非常好和完善。并且新推出的TensorFLow Fold支持動態的批輸入,可以對動態的RNN結構產生巨大的提速。
Q4:如何選擇網絡的層數和神經元個數?
黃文堅:深度學習的層數和神經元個數條數一直是一個經驗占比非常重的問題。在TensorFlow中,可以使用TensorBoard觀察train loss和test loss,如果train loss下降慢,并且test loss沒有上升,可以加大模型擬合能力,即加深網絡和增大神經元個數。如果train loss難以下降,并且test loss開始反彈,則應控制模型的容量,即模型的擬合能力,保持層數和神經元個數不過大,同時使用各種減輕過擬合的方法,比如dropout、batch normalization等。
如果train loss難以下降,并且test loss開始反彈,則應控制模型的容量,即模型的擬合能力,保持層數和神經元個數不過大,同時使用各種減輕過擬合的方法,比如dropout、batch normalization等。
Q5:如何將tensorflow應用在實際項目中,涉及的數據轉換及數據結構應該是怎樣定的?
黃文堅:TensorFlow的格式可以使用numpy的數組,輸入數據通過placeholder轉為tensor,即多維數組格式,這是TensorFlow的核心數據格式。
同時對有空間關聯性和時間管理性的數據,應連接CNN、RNN進行處理,其他類型數據,應使用MLP。
Q6:RNN和CNN分別適用哪些場景?
黃文堅:CNN適合空間和時間有關聯性的場景,比如圖片分類,文本分類,時間序列分類等。
RNN主要適合有時間關聯性的場景,并且對時間先后順序敏感,適合文本分類,語言模型等。
Q7:我是java程序員,5年工作經驗,如何更好學習TensorFlow?
黃文堅:TensorFlow最主流的接口是Python,不過目前也推出了Java接口。如果感興趣,可以直接先從Java接口入手,不過非腳本語言,調試可能不方便,后期可以再學習Python接口。
Q8:黃老師您好。請問如何看待Keras和Tensorflow的關系?Keras作為更高層的庫,應該和TF一起學習掌握還是更推薦底層的TF作為深度學習框架的入門呢?
黃文堅:keras已經被合并到TensorFlow中了,目前可以屬于TF的一個組件。推薦先學習TensorFlow,掌握一些底層機制,后面當需要快速構建大型神經網絡實驗時,可以學習keras。并且學習過tensorflow后,keras將非常簡單。
作者介紹
黃文堅,《TensorFlow實戰》作者,該書獲得Google TensorFlow工程研發總監Rajat Monga、360首席科學家顏水成教授、北大長江學者崔斌教授的推薦,出版后曾獲京東、亞馬遜、當當計算機類圖書銷量第一,并獲臺灣知名出版社引進版權。現任職PPmoney大數據算法總監,負責集團的風控、理財、互聯網證券等業務的數據挖掘工作。Google TensorFlow Contributor。前明略數據技術合伙人,領導了對諸多大型銀行、保險公司、基金公司的數據挖掘項目,包括金融風控、新聞輿情分析、保險復購預測等,并多次獲客戶方報送評獎。曾就職于阿里巴巴搜索引擎算法團隊,負責天貓上億用戶的個性化搜索系統。曾參加阿里巴巴大數據推薦算法大賽,于7000多只隊伍中獲得前10名。本科、研究生畢業于香港科技大學,在頂級會議和期刊SIGMOBILE MobiCom、IEEE Transactions on Image Processing發表論文,研究成果獲SIGMOBILE MobiCom最佳移動應用技術獎,并獲得兩項美國專利和一項中國專利。
轉載于:https://www.cnblogs.com/davidwang456/articles/9029176.html
總結
以上是生活随笔為你收集整理的CNN浅析和历年ImageNet冠军模型解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在线支付之风控系统架构选型
- 下一篇: 集群调度框架的架构演进之路