《Convolutional Neural Networks》是Andrw Ng深度學習專項課程中的第四門課。這門課主要介紹卷積神經網路(CNN)的基本概念、模型和具體應用。該門課共有4周課時,所以我將分成4次筆記來總結,這是第2節筆記。
1. Why look at case studies
本週課程將主要介紹幾個典型的CNN案例。透過對具體CNN模型及案例的研究,來幫助我們理解知識並訓練實際的模型。
典型的CNN模型包括:
- LeNet-5
-
AlexNet
-
VGG
除了這些效能良好的CNN模型之外,我們還會介紹Residual Network(ResNet)。其特點是可以構建很深很深的神經網路(目前最深的好像有152層)。
另外,還會介紹Inception Neural Network。接下來,我們將一一講解。
2. Classic Networks
LeNet-5模型是Yann LeCun教授於1998年提出來的,它是第一個成功應用於數字識別問題的卷積神經網路。在MNIST資料中,它的準確率達到大約99.2%。典型的LeNet-5結構包含CONV layer,POOL layer和FC layer,順序一般是CONV layer->POOL layer->CONV layer->POOL layer->FC layer->FC layer->OUTPUT layer,即\hat y。下圖所示的是一個數字識別的LeNet-5的模型結構:
該LeNet模型總共包含了大約6萬個引數。值得一提的是,當時Yann LeCun提出的LeNet-5模型池化層使用的是average pool,而且各層啟用函式一般是Sigmoid和tanh。現在,我們可以根據需要,做出改進,使用max pool和啟用函式ReLU。
AlexNet模型是由Alex Krizhevsky、Ilya Sutskever和Geoffrey Hinton共同提出的,其結構如下所示:
AlexNet模型與LeNet-5模型類似,只是要複雜一些,總共包含了大約6千萬個引數。同樣可以根據實際情況使用啟用函式ReLU。原作者還提到了一種最佳化技巧,叫做Local Response Normalization(LRN)。 而在實際應用中,LRN的效果並不突出。
VGG-16模型更加複雜一些,一般情況下,其CONV layer和POOL layer設定如下:
- CONV = 3×3 filters, s = 1, same
-
MAX-POOL = 2×2, s = 2
VGG-16結構如下所示:
VGG-16的引數多達1億3千萬。
3. ResNets
我們知道,如果神經網路層數越多,網路越深,源於梯度消失和梯度爆炸的影響,整個模型難以訓練成功。解決的方法之一是人為地讓神經網路某些層跳過下一層神經元的連線,隔層相連,弱化每層之間的強聯絡。這種神經網路被稱為Residual Networks(ResNets)。
Residual Networks由許多隔層相連的神經元子模組組成,我們稱之為Residual block。單個Residual block的結構如下圖所示:
上圖中紅色部分就是skip connection,直接建立a^{[l]}與a^{[l+2]}之間的隔層聯絡。相應的表示式如下:
z^{[l+1]}=W^{[l+1]}a^{[l]}+b^{[l+1]}
a^{[l+1]}=g(z^{[l+1]})
z^{[l+2]}=W^{[l+2]}a^{[l+1]}+b^{[l+2]}
a^{[l+2]}=g(z^{[l+2]}+a^{[l]})
a^{[l]}直接隔層與下一層的線性輸出相連,與z^{[l+2]}共同透過啟用函式(ReLU)輸出a^{[l+2]}。
該模型由Kaiming He, Xiangyu Zhang, Shaoqing Ren和Jian Sun共同提出。由多個Residual block組成的神經網路就是Residual Network。實驗表明,這種模型結構對於訓練非常深的神經網路,效果很好。另外,為了便於區分,我們把非Residual Networks稱為Plain Network。
Residual Network的結構如上圖所示。
與Plain Network相比,Residual Network能夠訓練更深層的神經網路,有效避免發生發生梯度消失和梯度爆炸。從下面兩張圖的對比中可以看出,隨著神經網路層數增加,Plain Network實際效能會變差,training error甚至會變大。然而,Residual Network的訓練效果卻很好,training error一直呈下降趨勢。
4. Why ResNets Work
下面用個例子來解釋為什麼ResNets能夠訓練更深層的神經網路。
如上圖所示,輸入x經過很多層神經網路後輸出a^{[l]},a^{[l]}經過一個Residual block輸出a^{[l+2]}。a^{[l+2]}的表示式為:
a^{[l+2]}=g(z^{[l+2]}+a^{[l]})=g(W^{[l+2]}a^{[l+1]}+b^{[l+2]}+a^{[l]})
輸入x經過Big NN後,若W^{[l+2]}\approx0,b^{[l+2]}\approx0,則有:
a^{[l+2]}=g(a^{[l]})=ReLU(a^{[l]})=a^{[l]}\ \ \ \ when\ a^{[l]}\geq0
可以看出,即使發生了梯度消失,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的結構:
ResNets同型別層之間,例如CONV layers,大多使用same型別,保持維度相同。如果是不同型別層之間的連線,例如CONV layer與POOL layer之間,如果維度不同,則引入矩陣W_s。
5. Networks in Networks and 1×1 Convolutions
Min Lin, Qiang Chen等人提出了一種新的CNN結構,即1×1 Convolutions,也稱Networks in Networks。這種結構的特點是濾波器運算元filter的維度為1×1。對於單個filter,1×1的維度,意味著卷積操作等同於乘積操作。
那麼,對於多個filters,1×1 Convolutions的作用實際上類似全連線層的神經網路結構。效果等同於Plain Network中a^{[l]}到a^{[l+1]}的過程。這點還是比較好理解的。
1×1 Convolutions可以用來縮減輸入圖片的通道數目。方法如下圖所示:
6. Inception Network Motivation
之前我們介紹的CNN單層的濾波運算元filter尺寸是固定的,1×1或者3×3等。而Inception Network在單層網路上可以使用多個不同尺寸的filters,進行same convolutions,把各filter下得到的輸出拼接起來。除此之外,還可以將CONV layer與POOL layer混合,同時實現各種效果。但是要注意使用same pool。
Inception Network由Christian Szegedy, Wei Liu等人提出。與其它只選擇單一尺寸和功能的filter不同,Inception Network使用不同尺寸的filters並將CONV和POOL混合起來,將所有功能輸出組合拼接,再由神經網路本身去學習引數並選擇最好的模組。
Inception Network在提升效能的同時,會帶來計算量大的問題。例如下面這個例子:
此CONV layer需要的計算量為:28x28x32x5x5x192=120m,其中m表示百萬單位。可以看出但這一層的計算量都是很大的。為此,我們可以引入1×1 Convolutions來減少其計算量,結構如下圖所示:
通常我們把該1×1 Convolution稱為“瓶頸層”(bottleneck layer)。引入bottleneck layer之後,總共需要的計算量為:28x28x16x192+28x28x32x5x5x16=12.4m。明顯地,雖然多引入了1×1 Convolution層,但是總共的計算量減少了近90%,效果還是非常明顯的。由此可見,1×1 Convolutions還可以有效減少CONV layer的計算量。
7.Inception Network
上一節我們使用1×1 Convolution來減少Inception Network計算量大的問題。引入1×1 Convolution後的Inception module如下圖所示:
多個Inception modules組成Inception Network,效果如下圖所示:
上述Inception Network除了由許多Inception modules組成之外,值得一提的是網路中間隱藏層也可以作為輸出層Softmax,有利於防止發生過擬合。
8. Using Open-Source Implementation
本節主要介紹GitHub的使用,GitHub是一個面向開源及私有軟體專案的託管平臺,上面包含有許多優秀的CNN開源專案。關於GitHub具體內容不再介紹,有興趣的小夥伴自行查閱。
9. Transfer Learning
有關Transfer Learning的相關內容,我們在 Coursera吳恩達《構建機器學習專案》課程筆記(2)– 機器學習策略(下)中已經詳細介紹過,這裡就不再贅述了。
10. Data Augmentation
常用的Data Augmentation方法是對已有的樣本集進行Mirroring和Random Cropping。
另一種Data Augmentation的方法是color shifting。color shifting就是對圖片的RGB通道數值進行隨意增加或者減少,改變圖片色調。
除了隨意改變RGB通道數值外,還可以更有針對性地對圖片的RGB通道進行PCA color augmentation,也就是對圖片顏色進行主成分分析,對主要的通道顏色進行增加或減少,可以採用高斯擾動做法。這樣也能增加有效的樣本數量。具體的PCA color augmentation做法可以查閱AlexNet的相關論文。
最後提一下,在構建大型神經網路的時候,data augmentation和training可以由兩個不同的執行緒來進行。
11. State of Computer Vision
神經網路需要資料,不同的網路模型所需的資料量是不同的。Object dection,Image recognition,Speech recognition所需的資料量依次增加。一般來說,如果data較少,那麼就需要更多的hand-engineering,對已有data進行處理,比如上一節介紹的data augmentation。模型演算法也會相對要複雜一些。如果data很多,可以構建深層神經網路,不需要太多的hand-engineering,模型演算法也就相對簡單一些。
值得一提的是hand-engineering是一項非常重要也比較困難的工作。很多時候,hand-engineering對模型訓練效果影響很大,特別是在資料量不多的情況下。
在模型研究或者競賽方面,有一些方法能夠有助於提升神經網路模型的效能:
- Ensembling: Train several networks independently and average their outputs.
-
Multi-crop at test time: Run classifier on multiple versions of test images and average results.
但是由於這兩種方法計算成本較大,一般不適用於實際專案開發。
最後,我們還要靈活使用開原始碼:
- Use archittectures of networks published in the literature
-
Use open source implementations if possible
-
Use pretrained models and fine-tune on your dataset
更多AI資源請關注公眾號:AI有道(ID:redstonewill)