1. 程式人生 > >深入理解GoogLeNet結構(原創)

深入理解GoogLeNet結構(原創)

inception(也稱GoogLeNet)是2014年Christian Szegedy提出的一種全新的深度學習結構,在這之前的AlexNet、VGG等結構都是通過增大網路的深度(層數)來獲得更好的訓練效果,但層數的增加會帶來很多負作用,比如overfit、梯度消失、梯度爆炸等。inception的提出則從另一種角度來提升訓練結果:能更高效的利用計算資源,在相同的計算量下能提取到更多的特徵,從而提升訓練結果。

inception原文連結:https://arxiv.org/pdf/1409.4842.pdf

網上關於inception的文章一大堆,大部分都是互相抄襲,少數原創的文章也只侷限於結構的描述,或者只是機械的翻譯下paper,並沒有告訴你這個結構是怎麼來的,看完後仍是一頭霧水。本文重點聚焦於inception背後的原理,有部分是自己的理解,如果理解有誤也請指正。

一、核心思想

inception模組的基本機構如下圖,整個inception結構就是由多個這樣的inception模組串聯起來的。inception結構的主要貢獻有兩個:一是使用1x1的卷積來進行升降維;二是在多個尺寸上同時進行卷積再聚合。

圖1:inception模組

1、1x1卷積

可以看到圖1中有多個黃色的1x1卷積模組,這樣的卷積有什麼用處呢?

作用1:在相同尺寸的感受野中疊加更多的卷積,能提取到更豐富的特徵。這個觀點來自於Network in Network(NIN, https://arxiv.org/pdf/1312.4400.pdf),圖1裡三個1x1卷積都起到了該作用。

圖2:線性卷積和NIN結構對比

圖2左側是是傳統的卷積層結構(線性卷積),在一個尺度上只有一次卷積;右圖是Network in Network結構(NIN結構),先進行一次普通的卷積(比如3x3),緊跟再進行一次1x1的卷積,對於某個畫素點來說1x1卷積等效於該畫素點在所有特徵上進行一次全連線的計算,所以右側圖的1x1卷積畫成了全連線層的形式,需要注意的是NIN結構中無論是第一個3x3卷積還是新增的1x1卷積,後面都緊跟著啟用函式(比如relu)。將兩個卷積串聯,就能組合出更多的非線性特徵。舉個例子,假設第1個3x3卷積+啟用函式近似於f1(x)=ax2+bx+c,第二個1x1卷積+啟用函式近似於f2(x)=mx2+nx+q,那f1(x)和f2(f1(x))比哪個非線性更強,更能模擬非線性的特徵?答案是顯而易見的。NIN的結構和傳統的神經網路中多層的結構有些類似,後者的多層是跨越了不同尺寸的感受野(通過層與層中間加pool層),從而在更高尺度上提取出特徵;NIN結構是在同一個尺度上的多層(中間沒有pool層),從而在相同的感受野範圍能提取更強的非線性。

作用2:使用1x1卷積進行降維,降低了計算複雜度。圖2中間3x3卷積和5x5卷積前的1x1卷積都起到了這個作用。當某個卷積層輸入的特徵數較多,對這個輸入進行卷積運算將產生巨大的計算量;如果對輸入先進行降維,減少特徵數後再做卷積計算量就會顯著減少。下圖是優化前後兩種方案的乘法次數比較,同樣是輸入一組有192個特徵、32x32大小,輸出256組特徵的資料,第一張圖直接用3x3卷積實現,需要192x256x3x3x32x32=452984832次乘法;第二張圖先用1x1的卷積降到96個特徵,再用3x3卷積恢復出256組特徵,需要192x96x1x1x32x32+96x256x3x3x32x32=245366784次乘法,使用1x1卷積降維的方法節省了一半的計算量。有人會問,用1x1卷積降到96個特徵後特徵數不就減少了麼,會影響最後訓練的效果麼?答案是否定的,只要最後輸出的特徵數不變(256組),中間的降維類似於壓縮的效果,並不影響最終訓練的結果。

圖3:增加了1x1卷積後降低了計算量

2、多個尺寸上進行卷積再聚合

圖2可以看到對輸入做了4個分支,分別用不同尺寸的filter進行卷積或池化,最後再在特徵維度上拼接到一起。這種全新的結構有什麼好處呢?Szegedy從多個角度進行了解釋:

解釋1:在直觀感覺上在多個尺度上同時進行卷積,能提取到不同尺度的特徵。特徵更為豐富也意味著最後分類判斷時更加準確。

解釋2:利用稀疏矩陣分解成密集矩陣計算的原理來加快收斂速度。舉個例子下圖左側是個稀疏矩陣(很多元素都為0,不均勻分佈在矩陣中),和一個2x2的矩陣進行卷積,需要對稀疏矩陣中的每一個元素進行計算;如果像右圖那樣把稀疏矩陣分解成2個子密集矩陣,再和2x2矩陣進行卷積,稀疏矩陣中0較多的區域就可以不用計算,計算量就大大降低。這個原理應用到inception上就是要在特徵維度上進行分解!傳統的卷積層的輸入資料只和一種尺度(比如3x3)的卷積核進行卷積,輸出固定維度(比如256個特徵)的資料,所有256個輸出特徵基本上是均勻分佈在3x3尺度範圍上,這可以理解成輸出了一個稀疏分佈的特徵集;而inception模組在多個尺度上提取特徵(比如1x1,3x3,5x5),輸出的256個特徵就不再是均勻分佈,而是相關性強的特徵聚集在一起(比如1x1的的96個特徵聚集在一起,3x3的96個特徵聚集在一起,5x5的64個特徵聚集在一起),這可以理解成多個密集分佈的子特徵集。這樣的特徵集中因為相關性較強的特徵聚集在了一起,不相關的非關鍵特徵就被弱化,同樣是輸出256個特徵,inception方法輸出的特徵“冗餘”的資訊較少。用這樣的“純”的特徵集層層傳遞最後作為反向計算的輸入,自然收斂的速度更快。

圖4: 將稀疏矩陣分解成子密集矩陣來進行計算

解釋3:Hebbin赫布原理。Hebbin原理是神經科學上的一個理論,解釋了在學習的過程中腦中的神經元所發生的變化,用一句話概括就是fire togethter, wire together。赫布認為“兩個神經元或者神經元系統,如果總是同時興奮,就會形成一種‘組合’,其中一個神經元的興奮會促進另一個的興奮”。比如狗看到肉會流口水,反覆刺激後,腦中識別肉的神經元會和掌管唾液分泌的神經元會相互促進,“纏繞”在一起,以後再看到肉就會更快流出口水。用在inception結構中就是要把相關性強的特徵匯聚到一起。這有點類似上面的解釋2,把1x1,3x3,5x5的特徵分開。因為訓練收斂的最終目的就是要提取出獨立的特徵,所以預先把相關性強的特徵匯聚,就能起到加速收斂的作用。

在inception模組中有一個分支使用了max pooling,作者認為pooling也能起到提取特徵的作用,所以也加入模組中。注意這個pooling的stride=1,pooling後沒有減少資料的尺寸。

二、論文關鍵點解析

Page 3:The fundamental way of solving both issues would be by ultimately moving from fully connected to sparsely connected architectures, even inside the convolutions. Besides mimicking biological systems, this would also have the advantage of firmer theoretical underpinnings due to the ground-breaking work of Arora et al. [2]. Their main result states that if the probability distribution of the data-set is representable by a large, very sparse deep neural network, then the optimal network topology can be constructed layer by layer by analyzing the correlation statistics of the activations of the last layer and clustering neurons with highly correlated outputs.

作者提出需要將全連線的結構轉化成稀疏連線的結構。稀疏連線有兩種方法,一種是空間(spatial)上的稀疏連線,也就是傳統的CNN卷積結構:只對輸入影象的某一部分patch進行卷積,而不是對整個影象進行卷積,共享引數降低了總引數的數目減少了計算量;另一種方法是在特徵(feature)維度進行稀疏連線,就是前一節提到的在多個尺寸上進行卷積再聚合,把相關性強的特徵聚集到一起,每一種尺寸的卷積只輸出256個特徵中的一部分,這也是種稀疏連線。作者提到這種方法的理論基礎來自於Arora et al的論文Provable bounds for learning some deep representations(Arora et al這篇論文數學要求太高了,沒讀懂)。

Page3:On the downside, todays computing infrastructures are very inefficient when it comes to numerical calculation on non-uniform sparse data structures. Even if the number of arithmetic operations is reduced by100×, the overhead of lookups and cache misses is so dominant that switching to sparse matrices would not pay off. The gap is widened even further by the use of steadily improving, highly tuned, numerical libraries that allow for extremely fast dense matrix multiplication, exploit-ing the minute details of the underlying CPU or GPU hardware [16,9]. Also, non-uniform sparse models require more sophisticated engineering and computing infrastructure. Most current vision oriented machine learning systems utilize sparsity in the spatial domain just by the virtue of employing convolutions. However, convolutions are implemented as collections of dense connections to the patches in the earlier layer. ConvNets have traditionally used random and sparse connection tables in the feature dimensions since [11] in order to break the symmetry and improve learning, the trend changed back to full connections with [9] in order to better optimize parallel computing. The uniformity of the structure and a large number of filters and greater batch size allow for utilizing efficient dense computation.

作者提到如今的計算機對稀疏資料進行計算的效率是很低的,即使使用稀疏矩陣演算法也得不償失(見筆者圖4描述的計算方法,注意圖4左側的那種稀疏矩陣在計算機內部都是使用元素值+行列值的形式來儲存,只儲存非0元素)。使用稀疏矩陣演算法來進行計算雖然計算量會大大減少,但會增加中間快取(具體原因請研究稀疏矩陣的計算方法)。

當今最常見的利用資料稀疏性的方法是通過卷積對區域性patch進行計算(CNN方法,就是前面提到的在spatial上利用稀疏性);另一種利用資料稀疏性的方法是在特徵維度進行利用,比如ConvNets結構,它使用特徵連線表來決定哪些卷積的輸出才累加到一起(普通結構使用一個卷積核對所有輸入特徵做卷積,再將所有結果累加到一起,輸出一個特徵; 而ConvNets是選擇性的對某些卷積結果做累加)。ConvNets利用稀疏性的方法現在已經很少用了,因為只有在特徵維度上進行全連線才能更高效的利用gpu的平行計算的能力,否則你就得為這樣的特徵連線表單獨設計cuda的介面函式,單獨設計的函式往往無法最大限度的發揮gpu平行計算的能力。

Page 4:This raises the question whether there is any hope for a next, intermediate step: an architecture that makes use of the extra sparsity, even at filter level, as suggested by the theory, but exploits our current hardware by utilizing computations on dense matrices. The vast literature on sparse matrix computations (e.g. [3]) suggests that clustering sparse matrices into relatively dense submatrices tends to give state of the art practical performance for sparse matrix multiplication.

前面提到ConvNets這樣利用稀疏性的方法現在已經很少用了,那還有什麼方法能在特徵維度上利用稀疏性麼?這就引申出了這篇論文的重點:將相關性強的特徵匯聚到一起,也就是上一章提到的在多個尺度上卷積再聚合。

Page 6:The use of average pooling before the classifier is based on [12], although our implementation differs in that we use an extra linear layer.

Network in Network(NIN, https://arxiv.org/pdf/1312.4400.pdf)最早提出了用Global Average Pooling(GAP)層來代替全連線層的方法,具體方法就是對每一個feature上的所有點做平均,有n個feature就輸出n個平均值作為最後的softmax的輸入。它的好處:1、對資料在整個feature上作正則化,防止了過擬合;2、不再需要全連線層,減少了整個結構引數的數目(一般全連線層是整個結構中引數最多的層),過擬合的可能性降低;3、不用再關注輸入影象的尺寸,因為不管是怎樣的輸入都是一樣的平均方法,傳統的全連線層要根據尺寸來選擇引數數目,不具有通用性。

Page 6:By adding auxiliary classifiers connected to these intermediate layers, we would expect to encourage discrimination in the lower stages in the classifier, increase the gradient signal that gets propagated back, and provide additional regularization.

inception結構在在某些層級上加了分支分類器,輸出的loss乘以個係數再加到總的loss上,作者認為可以防止梯度消失問題(事實上在較低的層級上這樣處理基本沒作用,作者在後來的inception v3論文中做了澄清)。