ResNet, AlexNet, VGG, Inception: 理解各種卷積網路的結構
卷計神經網路(Convolutional Neural Networks, CNN)對於視覺識別任務是絕佳的。好的卷積網路具有上百萬引數和很多隱藏層。事實上,一個糟糕的經驗法則(?,a bad rule of thumb)是:“隱藏層的個數越多,網路越好”。AlexNet, VGG, Inception, ResNet 是很流行的網路。你會好奇:為什麼這些網路效能好?它們是怎麼設計的?為什麼它們的結構會如此?這些問題的答案不是平凡的和確定的,單單這篇博文不能全部涉及。然而,在博文中,我會嘗試去討論部分問題。網路結構設計是一個複雜的過程,需要花一段時間去學習,而要實驗設計自己的結構則要花更長的時間。但首先,讓我們分幾個部分來看:
為什麼卷積網路可以打敗傳統的計算機視覺?
影象分類是把給定的影象分到預先指定的一個類別中。傳統的影象分類包含兩個模組:特徵提取(feature extraction)和分類(classification)。
特徵提取是從原始畫素值中提取高層次資訊以捕獲各類別中的差異。特徵提取以無監督的方式完成,從畫素中提取資訊時與影象的類別無關。傳統應用廣泛的特徵包括 GIST,HOG,SIFT,LBP 等。在特徵提取之後,分類模組在影象和對應的類別上進行訓練。一些分類模組例子有支援向量機(SVM),邏輯斯蒂迴歸(Logistic Regression),隨機森林(Random Forest),決策樹(Decision tree)等。
傳統影象分類的問題是特徵提取不能基於類別和影象進行調整(tweaked)。所以,當選中的特徵對區分類別缺乏代表性時,不管採用了什麼型別的分類策略,分類模型的準確率都會差很多。在傳統分類框架下,取得最好結果的模型都包含了共同的主題,即選取多個特徵提取器然後組合它們來獲得更好的特徵。但是這需要很多的啟發,以及大量的人力來調整引數以使準確率達到相當好的水平。這裡的相當好是指接近人類的準確率水平。這就是為什麼使用傳統的計算機視覺,建立一個能用於實際遇到的大量資料的好的計算機視覺系統(像OCR,face verification,image classifiers,object detectors等)需要很多年。我曾經使用卷積網路在6周內為一家公司取得很好的效果,而這若用傳統的計算機視覺需要將近一年。
這種方法的另一個問題是它與我們人類學習識別事物的方式完全不同。小孩剛出生時是沒有能力感知周圍事物的,但隨著不斷的處理資料,他就能對事物進行識別。這是深度學習基於的哲學,在深度學習內不需要硬編碼(hard-coded)的特徵提取器。它把提取和分類模組組合到一個整合的系統,基於監督資料,學習從影象中提取判別表示和對影象分類。
其中一個這樣的系統是多層感知器(Multilayer Perceptrons, MLP),也就是由稠密連線的多層神經元組成的神經網路。由於缺乏足夠的訓練樣本,一個含有大量引數的深度神經網路不可能訓練出不過擬合的系統。但對於卷積神經網路(Convolutional Neural Networks, ConvNets/CNN),使用像 ImageNet 這樣的大型資料集來訓練整個網路是可以避免過擬合的。這背後的原因是神經元之間的引數共享和卷積層之間的稀疏連線(參見圖2)。在卷積運算中,同一層的神經元區域性連線到輸入神經元,而引數集在 2-D 特徵對映(feature map)之間共享。
為了理解卷機網路的設計哲學,你可能會問:這裡的目標是什麼?
a. 準確率
如果你正在建造一個智慧機器,一個絕對的判別標準是它要儘可能的準確。這裡也有一個公平的問題,因為準確率不僅依賴於網路,也依賴於可用於訓練的資料量。因此,這些網路需要在像 ImageNet 這樣的標準資料集上進行比較。
ImageNet是一個持續進行中的工程,目前它有21841個類別和14197122張圖片。從2010年開始,ImageNet 舉辦了視覺識別的年度競賽,它從 ImageNet 資料集中提供給參賽者120萬張屬於1000個不同類別的影象,每一個參賽的網路結構基於這些影象上報準確率。
b. 計算量
大量的卷積網路在訓練時需要大量的記憶體和計算資源,因此,這是一個特別要關注的問題。類似的,如果你要在移動裝置上部署模型,那麼最終訓練好的模型的大小也尤其需要考慮。正如你所猜的,要產生更高的準確率需要更多計算消耗的網路。因此,永遠要在準確率和計算量之間進行折衷。
除此之外,還有很多的因素需要考慮,比如訓練的容易程度、網路的泛化能力等。下面描述的都是最流行的網路,並以它們發表的先後順序列舉,越往後準確率越高。
AlexNet
這個結構是相對於傳統方法在 ImageNet 分類準確率上具有顯著提升的最早的網路之一。它由5個卷積層和3個全連線層組成,見下圖。
由 Alex Krizhevshy 提出的 AlexNet,使用 ReLU (Rectified Linear Unit)作為非線性啟用,來替代傳統神經網路的早期標準啟用函式 Tanh 或 Sigmoid。ReLU 定義為
f(x) = max{0, x}
ReLU 的好處是,相比於 Sigmoid 來說,訓練速度更快,因為 Sigmoid 在飽和區域的導數很小,從而幾乎沒有權重的更新(圖4)。這稱為梯度消失問題(vanishing gradient problem)。
在 AlexNet 中,ReLU 層緊跟在每一個卷積層和全連線層(fully-connected layer,FC)之後。
這個網路還通過在每一個 FC 層之後使用 Dropout 層來減小過擬合。Dropout 層有一個概率 p 與它關聯,而且這個概率獨立的應用到每一個神經元。它隨機的以概率 p 來關閉神經元的啟用,如圖5。
為什麼 Dropout 有效?
Dropout 背後的思想類似於模型整合。源於 Dropout 層,不同的被關閉的神經元集合表示不同的結構,而且這些不同的結構並行的訓練。對 n 個神經元使用 Dropout,子結構共有 2^n 個。所以它相當於對所有這些模型的整合進行平均來作出預測。這提供了一個結構化的模型正則化來避免過擬合。Dropout 有用的另一種看法是,因為每一個神經元都是隨機選擇的,這可以避免它們之間的相互適應從而獨立的建立有意義的特徵。
VGG16
這個結構是牛津的VGG組(Visual Geometry Group)提出的,它是通過用多個 3x3 的過濾器來替換核大小較大的過濾器(11 和 5,分別對應於第一、第二個卷積層)自AlexNet 改進而來的。對於給定的感知野(輸出依賴的輸入影象的有效區域大小),堆疊多個小的卷積核比一個大的卷積核要好,因為多個非線性層能增加網路的深度,而這有助於學習更多複雜的特徵,而且是以代價更小的方式。
例如,3 個步幅為 1 的 3x3 過濾器具有 7 的感知大小,但是它的引數個數只有 3*(9C^2),而大小為 7 的卷積核卻有 49C^2個引數(假設輸入、輸出的特徵對映個數都是C)。另外,3x3 的卷積核有助於保留影象更細水平的特徵。VGG 網路的結構如下表:
從表中可見,在 VGG-D 中的模組多次使用了相同大小的過濾器來提取更復雜和更有代表性的特徵。模組(blocks/modules)的概念成為 VGG 之後的網路的共同主題。
VGG 卷積層之後有 3 個全連線層。網路的寬度從小的 64 開始,在每一個降取樣層/池化層之後增長 2 倍。它在 ImageNet 上的 top-5 準確率為 92.3%。
GoogLeNet/Inception
儘管 VGG 在 ImageNet 資料集上取得了現象級的準確率,但因為大量的計算需求(包括記憶體和時間),把它部署在當前最適度大小的 GPU 上仍然存在問題。它因為卷積層的寬度過大而變得不再高效。
例如,輸入、輸出都具有 512 個通道且卷積核大小為 3x3 的卷積層,它的計算量(?,the order of calculations)是 9x512x512。
在一個位置的卷積運算中,每一個輸出通道(在上面的例子中是512個)都連線到每一個輸入通道,我們稱之為稠密連線結構。GoogLeNet 基於的思想是,因為啟用之間的相關性,深層網路中的大部分啟用或者是不必要的(0 值),或者是冗餘的。因此,深層網路的最有效的結構是啟用之間是稀疏連線,這說明所有的 512 個輸出通道並不與所有的 512 個輸入通道都相連。當前存在一些產生稀疏權重/連線的剪枝技術。但是稀疏矩陣乘法在 BLAS 或 CuBlas包(用於 GPU 的 CUDA)中並沒有做優化,因而比它們的稠密版本還要慢。
GoogLeNet 設計了一個稱為 Inception 的模組,它近似一個具有正常稠密結構(見圖)的稀疏CNN。如前所述,因為只有少量的神經元是有效的,特定核大小的卷積過濾器個數(或寬度)保持很小。另外,它還使用不同大小的卷積來捕獲可變尺度(5x5,3x3,1x1)的細節。
關於這個模組的另一個顯著特點是它具有所謂的瓶頸層(bottleneck layer,圖中1x1的卷積層),它能顯著的減少所需的計算量(解釋如下)。
讓我們以 GoogLeNet 的第一個 Inception 模組為例, 它有 192 個輸入通道。它有 128 個 3x3 的過濾器和 32 個 5x5 的過濾器。5x5 過濾器的計算量是 25x32x192,當隨著網路深度變深,網路寬度和 5x5 過濾器的個數進一步增長時,計算量就會達到爆炸的程度。為了避免這樣,Inception 模組在應用大的卷積核進行卷積之前使用 1x1 的卷積來減少輸入通道的維數。因此,在第一個 Inception 模組,在做 5x5 卷積之前,輸入首先餵給僅僅只有 16 個過濾器的 1x1 卷積。這樣把計算量下降到 16x192 + 25x32x16。所有這些改變使得網路具有更大的寬度和深度。
GoogLeNet 另一個改變是,在最後一個卷積層之後,使用一個整體的全域性池化層(它對所有的 2D 特徵對映的通道值取平均)來替換全連線層。這極大的減少了引數的個數。這可以用 AlexNet 來進行理解,它大概 90% 的引數都在 FC 層。使用大的網路寬度和深度使得 GoogLeNet 去掉 FC 層之後並沒有影響準確率。它在 ImageNet 上的 top-5 準確率達到 93.3%,而且比 VGG 更快。
Residual Networks
到目前為止,我們看到隨著深度的增加,只要網路不產生過擬合,網路的準確率也增加。但是增加深度帶來的問題是在比較淺層的時候權重改變所需的訊號(它來源於網路最後真實和預測之間的比較)會變得很小,這實質意味著在淺層的時候網路就幾乎學不到什麼了。這稱之為梯度消失(vanishing gradient)。訓練深層網路的第二個問題是,在巨大的引數空間進行優化,當增加層數時會導致訓練誤差更大。這稱為惡化(degradation)問題。殘差網路通過殘差模組來構造網路使得可以訓練深層模型。可以通過下圖來直觀的感受這種方式為什麼會起作用:
想象一個網路 A,它產生 x 大小的訓練誤差。在 A 的頂端加入一些層(我們把這些額外的層稱為 C)來構造一個網路 B,並且新加入層的引數值設定為對 A 的輸出不做任何變化。這就意味著這個新的網路的訓練誤差也是 x。因此,當我們訓練網路 B 時,訓練誤差不會高於 A 的訓練誤差。但實際情況卻相反,唯一的原因說明加入這些層 C 之後學習恆等對映(對輸入不做任何改變,僅僅是複製)並不是一個平凡的問題,因為求解器並沒有得到這個解。為了解決這個問題,上面的模組在模組的輸入和輸出之間使用恆等對映直接建立了一條路徑,這樣加入的層 C 就只需要去學習可用輸入的頂部的特徵。因為 C 只需要學習殘差,整個模組被稱為殘差模組(residual module)。
另外,類似於 GoogLeNet,在分類層之前使用整體平均池化。通過上面所述的變化,ResNets 在高達 152 層的網路深度下也可以學習。它的準確率比 VGGNet 和 GoogLeNet 都要高,而且比 VGGNet 計算更高效。ResNet-152 的 top-5 準確率達到 95.51。
ResNet 的結構類似於 VGGNet,大都由 3x3 的過濾器組成。以 VGGNet 為基礎,通過插入上面描述的快捷連線(shortcut connection)來形成殘差網路。這可以從下圖中看出:從 VGG-19 來合成淺層的一些小片段。
殘差網路的威力可以從論文4(譯註:Deep residual learning for image recognition)的一個實驗來作出判斷。普通的 34 層網路比普通的 18 層網路具有更高的驗證誤差。這就是惡化問題(degradation problem)的體現。而 34 層的殘差網路卻比 18 層的殘差網路具有更小的訓練誤差。
隨著我們設計越來越精細的結構,某些網路並不會保留很多年,但他們的核心原理卻可以讓它們的設計更被理解。希望這篇文章可以在神經網路設計方面給你提供一些好的看法。