卷積神經網路(Convolutional Neural Networks,CNN),其應用包括影像辨識、自然語言處理(NLP)等領域。若能從其發展至今的脈絡開始了解,必定可以更進一步地理解專案的想法,將該技術掌握得更得心應手。以下就其發展和結構分別說明。
LeNet是最早的分類卷積網路,在1998年由Yann Lecun提出。當時,LeNet被設計用於手寫數字辨識,但是因為其理論解釋性較差,並且效果不如處理人工特徵的SVM,所以一直沒有得到重視。
一直到2012年,AlexNet在ILSVRC(也就是ImageNet比賽)中一舉奪魁,才觸發了人們對於深度學習的熱情,從此深度學習進入了高速發展的時期,之後便誕生了VGG、ResNet等一系列卷積網路架構。
1. LeNet
LeNet的結構如圖4-4所示,其中只有3種網路層——卷積層、池化層和全連接層。在啟動函數的選擇上,LeNet選擇了雙曲正切函數(Tanh),確定了卷積神經網路的基本結構。
現在有些深度學習框架中已經不提供定義好的LeNet 網路了,即使有,也是經過簡化改良之後的LeNet-5,用於辨識MNIST資料集的LeNet-5結構如圖4-5 所示。
Tanh 啟動函數被替換成了ReLU 啟動函數。
2. AlexNet
AlexNet中主要是提出了ReLU啟動函數和Dropout方法,同時還引入了資料增強操作,使模型的泛化能力得到進一步提高。但是這個網路中的參數量達到了6000萬,AlexNet的作者使用了兩片GTX 580訓練了五六天才得到分類結果。最終的分類結果也不負所望,以超越第二名10.9%的絕對優勢奪得第一名。AlexNet 網路結構如圖4-6 所示。
AlexNet中包含了5個卷積層和3個全連接層,層數比LeNet多,但是卷積、池化這樣的整體流程並沒有改變。AlexNet中用到的3個訓練技巧對最終的結果造成了積極作用。
- ReLU:ReLU啟動函數具有非線性的特徵,又不會像Sigmoid和Tanh那樣,容易出現梯度彌散的問題。
- Dropout:其原理類似於sklearn中的整合演算法,在訓練過程中,會以一定機率讓神經網路節點失去活性。在預測過程中,會將所有節點的輸出乘以這個機率值。這樣訓練出來的神經網路能夠得到類似多模型整合的效果,緩解了模型的過擬合問題。
- 資料增強:資料增強過程相當於增加了樣本的多樣性,使模型具有更強的泛化能力。
3. VGGNet
我們可以將VGGNet看作一個加深版的AlexNet,它使用了3個全連接層,使模型的總參數量達到了1.3億,這個架構最大的貢獻是它證明了:使用小尺寸的卷積核心並增加網路深度可以有效提升模型效果。不過有關VGGNet的論文中提到,當網路層數疊加到19層時,其準確率幾乎達到飽和,即此時無法再透過加深網路來提高準確率了。
這個網路在當時看來已經非常深了,VGG的作者在訓練VGG模型的時候,是先訓練了淺層網路(VGG-11),等淺層網路穩定之後,再往上增加新的卷積層,這樣逐步將網路深度增加到13、16、19。圖4-7展示了VGG-16的網路結構。
VGG使用多個小卷積核心替代了大卷積核心,比如使用3個3×3卷積核心得到的特徵圖尺寸和使用1個7×7卷積核心得到的特徵圖尺寸相同,7×7卷積核心有49×channel個參數,而3個3×3卷積核心只有27×channel個參數(channel 是通道數)。
在VGG之後出現的網路中,卷積核心基本以3×3卷積和1×1卷積為主。
4. GoogleNet
GoogleNet也叫InceptionNet,與AlexNet和VGGNet這種單純依靠加深網路結構進而改進網路性能的想法不一樣,它另闢蹊徑,在加深網路的同時,改進了網路結構:引入Inception模組(見圖4-8),使用分支結構。在僅有500萬參數的情況下,GoogleNet力壓VGG模型獲得2014年ILSVRC分類比賽的冠軍(VGG是定位比賽的冠軍和分類比賽的亞軍)。
GoogleNet為了能讓模型更進一步地收斂,在較淺層的特徵圖上設計了輔助損失單元,這樣得到的淺層特徵也能有很好的區分能力。
Inception v2中提出了Batch Normalization(本書將其簡稱為BatchNorm),對啟動值進行了規範化操作,使網路梯度反向傳播時不再受參數尺度影響,這個方法已經被後來很多網路架構應用。在有些專案中,為了最佳化模型的速度和記憶體佔用情況,會將BatchNorm合併到卷積中。
5. ResNet
ResNet可以說是卷積神經網路發展史上里程碑式的貢獻,其獨創的殘差結構(見圖4-9)能夠有效緩解梯度彌散問題,在網路層數達到100多層的時候,仍然可以有效地進行訓練。
考慮到x的維度與F(x)的維度可能不匹配,需進行維度匹配工作,在恆等層採用1×1 卷積核心來增加維度。
在網路進一步加深之後,圖4-9中的殘差模組變得不是特別有效,所以又設計了一種瓶頸參數模組,如圖4-10所示。第一個1×1卷積有著降維的作用,將原來256維的x降維到64維,從而使3×3卷積得以在較低維度上進行運算,有著提高運算效率的作用。3×3卷積計算完畢之後,再使用1×1卷積進行升維,以便與原有的x相加。