1. 程式人生 > >【深度學習】Inception的前世今生(一)--GoogLeNet

【深度學習】Inception的前世今生(一)--GoogLeNet

在2014年ILSVRC比賽上,GoogleNet 用了僅僅是AlexNet的12%的引數量,卻拿到了分類top-5的第一名。在之前的深度學習網路的設計中,會存在兩個重要缺陷:
1) 更深更寬的網路模型會產生巨量引數
2) 網路規模的加大會極大的增加計算量

解決這個兩個缺陷的根本方法是將全連線甚至一般的卷積轉換成稀疏連線。在現實中,生物的神經系統則是稀疏的,因此研究者認為大型神經網路的合理連線方式也應該是稀疏的。受生物學上的Hebbian定理的啟發,《Provable Bounds for Learning Some Deep Representations》文章指出:如果資料集的概率分佈可以被一個很大很稀疏的神經網路的神經網路所表達,那麼構築這個網路的最佳方法是逐層構築網路:將上一層高度相關的結點聚類,並將聚類出來的每一個小簇連線到一起。

然而文章指出:今天的計算架構在計算非均勻稀疏資料的時候效率很低。儘管使用稀疏矩陣,並且將算術操作降低100倍,但是在計算的時候可能並不能得到pay off。原因是目前的CPU和GPU所使用的底層計算庫更偏向於密集矩陣的高效能運算。

這樣就提出了一個問題:是否有一種方法,既能保持網路結構的稀疏性質,又能利用密集矩陣的高計算效能。在這個問題上,google提出了Inception結構。

那麼在介紹GoogLeNet之前,我們將上述描述總結一下,也就是GooLeNet結構的主要思想是如何找出最優的區域性稀疏結構並將其覆蓋為近似的稠密元件。以我的理解是:就是通過計算dense矩陣來approach最優的稀疏結構。

(說句題外話,這個14年的想法,在17年的今天依舊非常流行。目前在移動端和主流的分類網路中應用的group convolution可能靈感來源於此)

GoogLeNet模型特點

GoogLeNet採用Inception結構,不僅進一步提升了預測分類的成功率,而且極大的減少了引數量,分析其原因有以下特點

  1. 採用了模組化的結果,方便增添和修改
  2. 網路最後用average pooling代替全連線層,將Top-1的成功率提高了0.6%
  3. 網路移除了全連線層,但保留了dropout層
  4. 網路增加了兩個輔助的softmax用於向前傳導梯度,避免梯度消失

GoogLeNet模組設計

這裡寫圖片描述

根據這幅圖我再解釋一下GoogLeNet的核心思路:如何用dense計算來approach 稀疏結構。

在一般的計算中,layer by layer中,一般是
previous layer — conv —Next layer

在googleNet中
previous layer —{conv1x1, conv3x3, conv5x5 } —Next layer

將之前中間的密集的conv 構建成了 三種conv計算,並在最後concat起來。然而對於每個conv分支,依然是dense computing。這便是用dense approach sparsity。

那麼為什麼要選取卷積核為1x1,3x3, 5x5的三種卷積核呢?
一方面:只是為了塊對齊方便。卷積核大小設定為1,3,5。在卷積步長為1時,要分別設定pad為0,1,2,則卷積後就可以得到相同維度的特徵。
另一方面:根據hebbian原理,將相關性高的一簇神經元節點連線在一起。在普通資料集中,這可能需要對神經元節點聚類,但是在圖片資料中,天然的就是臨近區域的資料相關性高,因此相鄰的畫素點被卷積操作連線在一起。《Tensorflow實戰》這本書在描述GoogLeNet的時候,指出:在同一個空間位置但在不同通道的卷積核輸出結果相關性極高。因此,一個1x1的卷積就可以很自然地把這些相關性很高的、在同一個空間位置但是不同特徵通道的特徵連線在一起,而稍微大一點的尺寸的卷積,比如3x3,5x5的資料相關性也很高,因此可以適當增大卷積核來增加多樣性。而網路越到後面,特徵也越抽象,每個特徵所涉及的感受野也更大。因此隨著深度的增加,3x3和5x5的卷積比例也增加。但是5x5的卷積核仍然會帶來巨大的計算量,必須採用1x1卷積核進行降維。因此結構也就成了下面這個樣子。

這裡寫圖片描述



最後附一個比較容易理解Inception結構的想法:

Angrew Ng在他的課上說:其實GoogleNet可以這麼理解,當你不知道用1x1,3x3還是5x5的卷積核來調整網路哪個更好時,那麼為什麼不都嘗試一下呢?那麼這個就是Inception結構了