經典的 CNN 網絡模型:
此外還有 ResNet(Residual Network,殘差網絡),以及 Inception Neural Network。
1. 經典網絡 1.1 LeNet-5特點:
LeNet-5 針對灰度圖像而訓練,因此輸入圖片的通道數為 1。該模型總共包含了約 6 萬個參數,遠少於標準神經網絡所需。典型的 LeNet-5 結構包含卷積層(CONV layer),池化層(POOL layer)和全連接層(FC layer),排列順序一般為 CONV layer->POOL layer->CONV layer->POOL layer->FC layer->FC layer->OUTPUT layer。一個或多個卷積層後面跟著一個池化層的模式至今仍十分常用。當 LeNet-5模型被提出時,其池化層使用的是平均池化,而且各層激活函數一般選用 Sigmoid 和 tanh。現在,我們可以根據需要,做出改進,使用最大池化並選用 ReLU 作為激活函數。相關論文:LeCun et.al., 1998. Gradient-based learning applied to document recognition。吳恩達老師建議精讀第二段,泛讀第三段。
1.2 AlexNet特點:
AlexNet 模型與 LeNet-5 模型類似,但是更複雜,包含約 6000 萬個參數。另外,AlexNet 模型使用了 ReLU 函數。當用於訓練圖像和數據集時,AlexNet 能夠處理非常相似的基本構造模塊,這些模塊往往包含大量的隱藏單元或數據。相關論文:Krizhevsky et al.,2012. ImageNet classification with deep convolutional neural networks。這是一篇易於理解並且影響巨大的論文,計算機視覺群體自此開始重視深度學習。
1.3 VGG特點:
VGG 又稱 VGG-16 網絡,「16」指網絡中包含 16 個卷積層和全連接層。結構不複雜且規整,在每一組卷積層進行濾波器翻倍操作。VGG 需要訓練的特徵數量巨大,包含多達約 1.38 億個參數。有些文章還介紹了 VGG-19 網絡,它甚至比 VGG-16 還要大。但由於 VGG-16 的表現幾乎和 VGG-19 不分高下,所以很多人還是會使用 VGG-16。相關論文:Simonvan & Zisserman 2015. Very deep convolutional networks for large-scale image recognition。
2. 殘差網絡(ResNets)因為存在梯度消失和梯度爆炸問題,網絡越深,就越難以訓練成功。跳躍連接(Skip connection),它可以從某一層網絡層獲取激活,然後迅速反饋給另外一層,甚至是神經網絡的更深層。我們可以利用跳躍連接構建能夠訓練深度網絡的殘差網絡(Residual Networks,簡稱為 ResNets)。
上圖的結構被稱為殘差塊(Residual block)。通過捷徑(Short cut,或者稱跳遠連接,Skip connections) 可以將
構建一個殘差網絡就是將許多殘差塊堆積在一起,形成一個深度網絡。
為了便於區分,在 ResNets 的論文He et al., 2015. Deep residual networks for image recognition中,非殘差網絡被稱為普通網絡(Plain Network)。將它變為殘差網絡的方法是加上所有的跳遠連接。
在理論上,隨著網絡深度的增加,性能應該越來越好。但實際上,對於一個普通網絡,隨著神經網絡層數增加,訓練錯誤會先減少,然後開始增多。但殘差網絡的訓練效果顯示,即使網絡再深,其在訓練集上的表現也會越來越好。
殘差網絡有助於解決梯度消失和梯度爆炸問題,使得在訓練更深的網絡的同時,又能保證良好的性能。
2.1 殘差網絡有效的原因假設有一個大型神經網絡,其輸入為
則有:
當發生梯度消失時,
因此,這兩層額外的殘差塊不會降低網絡性能。而如果沒有發生梯度消失時,訓練得到的非線性關係會使得表現效果進一步提高。
注意,如果
上圖是論文提供的 CNN 中 ResNet 的一個典型結構。卷積層通常使用 Same 卷積以保持維度相同,而不同類型層之間的連接(例如卷積層和池化層),如果維度不同,則需要引入矩陣
3. 1x1 卷積1x1 卷積(1x1 convolution,或稱為 Network in Network)指濾波器的尺寸為 1。當通道數為 1 時,1x1 卷積意味著卷積操作等同於乘積操作。
而當通道數更多時,1x1 卷積的作用實際上類似全連接層的神經網絡結構,壓縮或保持輸入層中的通道數量,甚至是增加通道數量。
池化能壓縮數據的高度
雖然論文Lin et al., 2013. Network in network中關於架構的詳細內容並沒有得到廣泛應用,但是 1x1 卷積的理念十分有影響力,許多神經網絡架構(包括 Inception 網絡)都受到它的影響。
4. Inception 網絡在之前的卷積網絡中,我們只能選擇單一尺寸和類型的濾波器。而 Inception 網絡的作用即是代替人工來確定卷積層中的濾波器尺寸與類型,或者確定是否需要創建卷積層或池化層。
如圖,Inception 網絡選用不同尺寸的濾波器進行 Same 卷積,並將卷積和池化得到的輸出組合拼接起來,最終讓網絡自己去學習需要的參數和採用的濾波器組合。
相關論文:Szegedy et al., 2014, Going Deeper with Convolutions
4.1 計算成本在提升性能的同時,Inception 網絡有著較大的計算成本。下圖是一個例子:
圖中有 32 個濾波器,每個濾波器的大小為 5x5x192。輸出大小為 28x28x32,所以需要計算 28x28x32 個數字,對於每個數,都要執行 5x5x192 次乘法運算。加法運算次數與乘法運算次數近似相等。因此,可以看作這一層的計算量為 28x28x32x5x5x192 = 1.2億。
為了解決計算量大的問題,可以引入 1x1 卷積來減少其計算量。
對於同一個例子,我們使用 1x1 卷積把輸入數據從 192 個通道減少到 16 個通道,然後對這個較小層運行 5x5 卷積,得到最終輸出。這個 1x1 的卷積層通常被稱作瓶頸層(Bottleneck layer)。
改進後的計算量為 28x28x192x16 + 28x28x32x5x5x15 = 1.24 千萬,減少了約 90%。
只要合理構建瓶頸層,就可以既顯著縮小計算規模,又不會降低網絡性能。
4.2 完整的 Inception 網絡上圖是引入 1x1 卷積後的 Inception 模塊。值得注意的是,為了將所有的輸出組合起來,紅色的池化層使用 Same 類型的填充(padding)來池化使得輸出的寬高不變,通道數也不變。
多個 Inception 模塊組成一個完整的 Inception 網絡(被稱為 GoogLeNet,以向 LeNet 致敬),如下圖所示:
注意黑色橢圓圈出的隱藏層,這些分支都是 Softmax 的輸出層,可以用來參與特徵的計算及結果預測,起到調整並防止發生過擬合的效果。
經過研究者們的不斷發展,Inception 模型的 V2、V3、V4 以及引入殘差網絡的版本被提出,這些變體都基於 Inception V1 版本的基礎思想上。
5. 使用開源的實現方案很多神經網絡複雜細緻,並充斥著參數調節的細節問題,因而很難僅通過閱讀論文來重現他人的成果。想要搭建一個同樣的神經網絡,查看開源的實現方案會快很多。
6. 遷移學習計算機視覺是一個經常用到遷移學習的領域。在搭建計算機視覺的應用時,相比於從頭訓練權重,下載別人已經訓練好的網絡結構的權重,用其做預訓練,然後轉換到自己感興趣的任務上,有助於加速開發。
對於已訓練好的卷積神經網絡,可以將所有層都看作是凍結的,只需要訓練與你的 Softmax 層有關的參數即可。大多數深度學習框架都允許用戶指定是否訓練特定層的權重。
而凍結的層由於不需要改變和訓練,可以看作一個固定函數。可以將這個固定函數存入硬碟,以便後續使用,而不必每次再使用訓練集進行訓練了。
上述的做法適用於你只有一個較小的數據集。如果你有一個更大的數據集,應該凍結更少的層,然後訓練後面的層。越多的數據意味著凍結越少的層,訓練更多的層。如果有一個極大的數據集,你可以將開源的網絡和它的權重整個當作初始化(代替隨機初始化),然後訓練整個網絡。
7. 數據擴增計算機視覺領域的應用都需要大量的數據。當數據不夠時,數據擴增(Data Augmentation) 就有幫助。常用的數據擴增包括鏡像翻轉、隨機裁剪、色彩轉換。
其中,色彩轉換是對圖片的 RGB 通道數值進行隨意增加或者減少,改變圖片色調。另外,PCA 顏色增強指更有針對性地對圖片的 RGB 通道進行主成分分析(Principles Components Analysis,PCA),對主要的通道顏色進行增加或減少,可以採用高斯擾動做法來增加有效的樣本數量。具體的 PCA 顏色增強做法可以查閱 AlexNet 的相關論文或者開原始碼。
在構建大型神經網絡的時候,數據擴增和模型訓練可以由兩個或多個不同的線程並行來實現。
8. 計算機視覺現狀通常,學習算法有兩種知識來源:
手工工程(Hand-engineering,又稱 hacks) 指精心設計的特性、網絡體系結構或是系統的其他組件。手工工程是一項非常重要也比較困難的工作。在數據量不多的情況下,手工工程是獲得良好表現的最佳方式。正因為數據量不能滿足需要,歷史上計算機視覺領域更多地依賴於手工工程。近幾年數據量急劇增加,因此手工工程量大幅減少。
另外,在模型研究或者競賽方面,有一些方法能夠有助於提升神經網絡模型的性能:
集成(Ensembling):獨立地訓練幾個神經網絡,並平均輸出它們的輸出Multi-crop at test time:將數據擴增應用到測試集,對結果進行平均但是由於這些方法計算和內存成本較大,一般不適用於構建實際的生產項目。