- 作者:韓信子@ShowMeAI
- 教程地址:https://www.showmeai.tech/tutorials/35
- 本文地址:https://www.showmeai.tech/article-detail/222
- 聲明:版權所有,轉載請聯系平台與作者並注明出處
收藏ShowMeAI查看更多精彩內容
本系列為吳恩達老師《深度學習專項課程(Deep Learning Specialization)》學習與總結整理所得,對應的課程視頻可以在這里查看。
引言
在ShowMeAI前一篇文章 卷積神經網絡解讀 中我們對以下內容進行了介紹:
- 卷積計算、填充
- 卷積神經網絡單層結構
- 池化層結構
- 卷積神經網絡典型結構
- CNN特點與優勢
本篇內容ShowMeAI展開介紹和總結幾個有名的典型CNN案例。這些CNN是最典型和有效的結構,吳恩達老師希望通過對具體CNN模型案例的分析講解,幫助我們理解CNN並訓練實際的模型。
本篇涉及到的經典CNN模型包括:
- LeNet-5
- AlexNet
- VGG
- ResNet(Residual Network,殘差網絡)
- Inception Neural Network
1.經典卷積網絡
1.1 LeNet-5
手寫字體識別模型LeNet5由Yann LeCun教授於90年代提出來,是最早的卷積神經網絡之一。它是第一個成功應用於數字識別問題的卷積神經網絡。在MNIST數據中,它的准確率達到大約99.2%。
LeNet5通過巧妙的設計,利用卷積、參數共享、池化等操作提取特征,避免了大量的計算成本,最后再使用全連接神經網絡進行分類識別,這個網絡也是最近大量神經網絡架構的起點。
-
LeNet-5針對灰度圖像而訓練,因此輸入圖片維度為\((32,32,1)\)(注意其中通道數為1)。
-
該模型總共包含了約6萬個參數,遠少於標准神經網絡所需。
-
典型的LeNet-5結構包含卷積層(CONV layer),池化層(POOL layer)和全連接層(FC layer),排列順序一般為CONV layer \(\Longrightarrow\) POOL layer \(\Longrightarrow\) CONV layer \(\Longrightarrow\) POOL layer \(\Longrightarrow\) FC layer \(\Longrightarrow\) FC layer \(\Longrightarrow\) OUTPUT layer。一個或多個卷積層后面跟着一個池化層的模式至今仍十分常用。
-
當LeNet-5模型被提出時,其池化層使用的是平均池化,而且各層激活函數一般選用Sigmoid和tanh。現在我們更多的會使用最大池化並選用ReLU作為激活函數。
相關論文:LeCun et.al., 1998. Gradient-based learning applied to document recognition。吳恩達老師建議精讀第二段,泛讀第三段。
1.2 AlexNet
AlexNet由Alex Krizhevsky於2012年提出,奪得2012年ILSVRC比賽的冠軍,top5預測的錯誤率為16.4%,遠超第一名。
AlexNet采用8層的神經網絡,5個卷積層和3個全連接層(3個卷積層后面加了最大池化層),包含6億3000萬個鏈接,6000萬個參數和65萬個神經元。具體的網絡結構如下圖:
模型結構解析:
- 卷積層 \(\Longrightarrow\) (最大)池化層 \(\Longrightarrow\) 全連接層的結構。
- AlexNet模型與LeNet-5模型類似,但是更復雜,包含約6000萬個參數。另外,AlexNet模型使用了ReLU函數。
- 當用於訓練圖像和數據集時,AlexNet能夠處理非常相似的基本構造模塊,這些模塊往往包含大量的隱藏單元或數據。
相關論文:Krizhevsky et al.,2012. ImageNet classification with deep convolutional neural networks。這是一篇易於理解並且影響巨大的論文,計算機視覺群體自此開始重視深度學習。
1.3 VGG
VGG是Oxford的Visual Geometry Group的組提出的CNN神經網絡。該網絡是在ILSVRC 2014上的相關工作,主要工作是證明了增加網絡的深度能夠在一定程度上影響網絡最終的性能。在提出后的幾年內,大家廣泛應用其作為典型CNN結構。
- VGG又稱VGG-16網絡,「16」指網絡中包含16個卷積層和全連接層。
- 超參數較少,只需要專注於構建卷積層。
- 結構不復雜且規整,在每一組卷積層進行濾波器翻倍操作。
- VGG需要訓練的特征數量巨大,包含多達約1.38億個參數。
相關論文:Simonvan & Zisserman 2015. Very deep convolutional networks for large-scale image recognition。
2.殘差網絡 ResNets
2.1 Residual Network結構
上面提到的VGG網絡在當時已經是堆疊層次構建CNN比較極限的深度了,隨着神經網絡層數變多和網絡變深,會帶來嚴重的梯度消失和梯度爆炸問題(參考ShowMeAI文章 深度學習的實用層面 關於梯度消失和梯度爆炸的講解),整個模型難以訓練成功。
在網絡結構層面,一種解決方法是人為地讓神經網絡某些層跳過下一層神經元的連接,隔層相連,弱化每層之間的強聯系。這種神經網絡被稱為Residual Networks(ResNets)殘差網絡。
上圖的結構被稱為殘差塊(Residual block)。通過捷徑(Short cut,或者稱跳接/Skip connections)可以將\(a^{[l]}\)添加到第二個ReLU過程中,直接建立\(a^{[l]}\)與\(a^{[l+2]}\)之間的隔層聯系。表達式如下:
構建一個殘差網絡就是將許多殘差塊堆積在一起,形成一個深度網絡。
為了便於區分,在 ResNets 的論文 He et al., 2015. Deep residual networks for image recognition 中,非殘差網絡被稱為普通直連網絡(Plain Network)。將它變為殘差網絡的方法是加上所有的跳遠連接。
理論上,隨着網絡深度的增加,模型學習能力變強,效果應該提升。但實際上,如下圖所示,一個普通直連網絡,隨着神經網絡層數增加,訓練錯誤會先先減少后增多。但使用跳接的殘差網絡,隨着網絡變深,訓練集誤差持續呈現下降趨勢。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-aNBHgLIA-1649925808194)(http://image.showmeai.tech/deep_learning_tutorial/186.png)]
殘差網絡有助於解決梯度消失和梯度爆炸問題,使得在訓練更深的網絡的同時,又能保證良好的性能。
2.2 殘差網絡有效的原因
下面我們借助1個例子來解釋為什么ResNets有效,為什么它能支撐訓練更深的神經網絡。
如圖所示,假設輸入\(x\)經過很多層神經網絡(上圖的big NN)后輸出\(a^{[l]}\),\(a^{[l]}\)經過一個Residual block輸出\(a^{[l+2]}\)。\(a^{[l+2]}\)的表達式如下:
輸入\(x\)經過Big NN后,若\(W^{[l+2]}\approx0\),\(b^{[l+2]}\approx0\),則有:
上述計算公式表明,即使發生了梯度消失\((W^{[l+2]}\approx0\),\(b^{[l+2]}\approx0)\),也能直接建立\(a^{[l+2]}\)與\(a^{[l]}\)的線性關系(此時\(a^{[l+2]}=a^{[l]}\),就是identity function)。
\(a^{[l]}\)直接連到\(a^{[l+2]}\),從效果來說,相當於直接忽略了\(a^{[l]}\)之后的這兩層神經層。很深的神經網絡,由於許多Residual blocks的存在,弱化削減了某些神經層之間的聯系,實現隔層線性傳遞,而不是一味追求非線性關系,模型本身也就能「容忍」更深層的神經網絡了。而且從性能上來說,這兩層額外的Residual blocks也不會降低Big NN的性能。
當然,沒有發生梯度消失時,Residual blocks會忽略short cut,能訓練得到跟Plain Network起到同樣效果的非線性關系。
注意,如果Residual blocks中\(a^{[l]}\)和\(a^{[l+2]}\)的維度不同,通常可以引入矩陣\(W_s\),與\(a^{[l]}\)相乘,使得\(W_s*a^{[l]}\)的維度與\(a^{[l+2]}\)一致。參數矩陣\(W_s\)有來兩種方法得到:
- ① 將\(W_s\)作為學習參數,通過模型訓練得到
- ② 固定\(W_s\)值(類似單位矩陣),不需要訓練,\(W_s\)與\(a^{[l]}\)的乘積僅僅使得\(a^{[l]}\)截斷或者補零
上述兩種方法都可行。
下圖所示的是CNN中ResNets的結構對比普通直連網絡和VGG19:
3.1x1卷積
在CNN中有一種現在廣泛使用的CNN結構:\(1 \times 1\)Convolution(\(1 \times 1\)卷積,也稱Networks in Networks)。它指濾波器的尺寸為1。當通道數為1時,\(1 \times 1\)卷積意味着卷積操作等同於乘積操作。
而當通道數更多時,\(1 \times 1\)卷積的作用實際上類似全連接層的神經網絡結構,從而對數據進行升降維度(取決於濾波器個數)。
池化能壓縮數據的高度(\(n_H\))及寬度(\(n_W\)),而\(1 \times 1\)卷積能壓縮數據的通道數(\(n_C\))。在如下圖所示的例子中,用32個大小為\(1 \times 1 \times 192\)的濾波器進行卷積,就能使原先數據包含的192個通道壓縮為32個。如下動圖演示了\(1 \times 1\)卷積的計算:
4.Inception網絡
下面介紹一下Inception網絡,它是CNN分類器發展史上一個重要的里程碑。
在Google提出Inception之前,大部分流行CNN僅僅是把卷積層堆疊得越來越多,使網絡越來越深,以此希望能夠得到更好的性能。
大家觀察我們之前介紹到的CNN典型結構,都是只選擇單一尺寸和類型的濾波器。而Inception網絡的作用即是代替人工來確定卷積層中的濾波器尺寸與類型,或者確定是否需要創建卷積層或池化層。
如上圖所示,Inception網絡選用不同尺寸的濾波器進行Same 卷積,並將卷積和池化得到的輸出組合拼接起來,最終讓網絡自己去學習需要的參數和采用的濾波器組合。
4.1 計算成本問題
在提升性能的同時,Inception網絡有着較大的計算成本。如下圖的例子:
圖中有\(32\)個濾波器,每個濾波器的大小為\(5 \times 5 \times 192\)。輸出大小為\(28 \times 28 \times 32\),總共需要計算得到\(28 \times 28 \times 32\)個結果數,對於每個數,要執行\(5 \times 5 \times 192\)次乘法運算。加法運算次數與乘法運算次數近似相等。因此,這一層的計算量可以近似為\(28 \times 28 \times 32 \times 5 \times 5 \times 192=1.2\)億。
Inception引入了\(1 \times 1\)卷積來減少計算量問題:
如上圖所示,我們先使用\(1 \times 1\)卷積把輸入數據從192個通道減少到16個通道,再對這個較小層運行\(5 \times 5\)卷積,得到最終輸出。這種改進方式的計算量為\(28 \times 28 \times 192 \times 16 + 28 \times 28 \times 32 \times 5 \times 5 \times 15=1.24\)千萬,減少了約90%。
這里的\(1 \times 1\)的卷積層通常被稱作瓶頸層(Bottleneck layer)。借助在網絡中合理設計瓶頸層,可以在保持網絡性能的前提下顯著縮小計算規模。
4.2 完整的Inception網絡
引入\(1 \times 1\)卷積后的Inception模塊如上所示。注意,為了將所有的輸出組合起來,紅色的池化層使用Same類型的填充(padding)來池化使得輸出的寬高不變,通道數也不變。
多個Inception模塊組成一個完整的Inception網絡(被稱為GoogLeNet,以向LeNet致敬),如下圖所示:
注意,在上圖中,Inception網絡除了有許多Inception模塊(圖上紅框框出)之外,網絡中間隱藏層也可以作為輸出層Softmax(圖中黑色圈圈出),有利於防止發生過擬合。
經過研究者們的不斷發展,Inception模型的V2、V3、V4以及引入殘差網絡的版本被提出,這些變體都基於Inception V1版本的基礎思想上。
5.使用開源的實現方案
很多神經網絡結構復雜,且有很多細致的設計和調整,訓練過程也包含非常多tricks,很難僅通過閱讀論文來重現他人的成果。想要搭建一個同樣的神經網絡,查看開源的實現方案會快很多。
6.遷移學習
在ShowMeAI的前序文章 AI應用實踐策略(下) 中我們提到過遷移學習。計算機視覺是一個經常用到遷移學習的領域。在搭建計算機視覺的應用時,相比於從頭訓練權重,下載別人已經訓練好的網絡結構的權重,用其做預訓練模型,然后轉換到自己感興趣的任務上,有助於加速開發。
對於類似前面提到的VGG/ResNet/Inception等訓練好的卷積神經網絡,可以凍結住所有層,只訓練針對當前任務添加的Softmax分類層參數即可。大多數深度學習框架都允許用戶指定是否訓練特定層的權重。
凍結的層由於不需要改變和訓練,可以看作一個固定函數。可以將這個固定函數存入硬盤,以便后續使用,而不必每次再使用訓練集進行訓練了。
吳恩達老師指出,上述的做法適用於小數據集場景,如果你有一個更大的數據集,應該凍結更少的層,然后訓練后面的層。越多的數據意味着凍結越少的層,訓練更多的層。如果有一個極大的數據集,你可以將開源的網絡和它的權重整個當作初始化(代替隨機初始化),然后訓練整個網絡。
7.數據擴增
計算機視覺領域的應用都需要大量的數據。當數據不夠時,數據擴增(Data Augmentation)可以幫助我們構建更多的數據樣本。
常用的數據擴增包括鏡像翻轉、隨機裁剪、色彩轉換等。如下圖為鏡像和隨機裁剪得到新的圖片。
色彩轉換是對圖片的RGB通道數值進行隨意增加或者減少,改變圖片色調。另外,PCA顏色增強指更有針對性地對圖片的RGB通道進行主成分分析(Principles Components Analysis,PCA),對主要的通道顏色進行增加或減少,可以采用高斯擾動做法來增加有效的樣本數量。具體的PCA顏色增強做法可以查閱AlexNet的相關論文或者開源代碼。
下圖為使用color shifting色調轉換進行data augmentation的示例。
在構建大型神經網絡的時候,為了提升效率,我們可以使用兩個或多個不同的線程並行來實現數據擴增和模型訓練。
8.計算機視覺現狀
深度學習需要大量數據,不同的神經網絡模型所需的數據量是不同的。目標檢測、圖像識別、語音識別所需的數據量依次增加。一般來說,如果數據較少,那么就需要對已有數據做更多的手工工程(hand-engineering),比如上一節介紹的數據擴增操作。模型算法也需要特別設計,會相對要復雜一些。
如果數據很多,可以構建深層神經網絡,不需要太多的手工工程,模型算法也就相對簡單一些。
手工工程(Hand-engineering,又稱hacks)指精心設計的特性、網絡體系結構或是系統的其他組件。手工工程是一項非常重要也比較困難的工作。在數據量不多的情況下,手工工程是獲得良好表現的最佳方式。正因為數據量不能滿足需要,歷史上計算機視覺領域更多地依賴於手工工程。近幾年數據量急劇增加,因此手工工程量大幅減少。
除此之外,在模型研究或者競賽方面,有一些方法能夠有助於提升神經網絡模型的性能:
- 集成(Ensembling):獨立地訓練幾個神經網絡,並平均輸出它們的輸出。
- 測試階段數據擴增(Multi-crop at test time):將數據擴增應用到測試集,對結果進行平均。
但是實際工業應用項目會考慮性能效率,上述技巧方法計算和內存成本較大,一般很少使用。
參考資料
- LeCun et.al., 1998. Gradient-based learning applied to document recognition
- Krizhevsky et al.,2012. ImageNet classification with deep convolutional neural networks
- Simonvan & Zisserman 2015. Very deep convolutional networks for large-scale image recognition
- He et al., 2015. Deep residual networks for image recognition
- Szegedy et al., 2014, Going Deeper with Convolutions
ShowMeAI系列教程推薦
- 大廠技術實現方案系列
- 圖解Python編程:從入門到精通系列教程
- 圖解數據分析:從入門到精通系列教程
- 圖解AI數學基礎:從入門到精通系列教程
- 圖解大數據技術:從入門到精通系列教程
- 圖解機器學習算法:從入門到精通系列教程
- 機器學習實戰:手把手教你玩轉機器學習系列
- 深度學習教程:吳恩達專項課程 · 全套筆記解讀
- 自然語言處理教程:斯坦福CS224n課程 · 課程帶學與全套筆記解讀
- 深度學習與計算機視覺教程:斯坦福CS231n · 全套筆記解讀
推薦文章
- 深度學習教程 | 深度學習概論
- 深度學習教程 | 神經網絡基礎
- 深度學習教程 | 淺層神經網絡
- 深度學習教程 | 深層神經網絡
- 深度學習教程 | 深度學習的實用層面
- 深度學習教程 | 神經網絡優化算法
- 深度學習教程 | 網絡優化:超參數調優、正則化、批歸一化和程序框架
- 深度學習教程 | AI應用實踐策略(上)
- 深度學習教程 | AI應用實踐策略(下)
- 深度學習教程 | 卷積神經網絡解讀
- 深度學習教程 | 經典CNN網絡實例詳解
- 深度學習教程 | CNN應用:目標檢測
- 深度學習教程 | CNN應用:人臉識別和神經風格轉換
- 深度學習教程 | 序列模型與RNN網絡
- 深度學習教程 | 自然語言處理與詞嵌入
- 深度學習教程 | Seq2seq序列模型和注意力機制