Coursera吴恩达《卷积神经网络》课程笔记(2)-- 深度卷积模型:案例研究
紅色石頭的個(gè)人網(wǎng)站:redstonewill.com
《Convolutional Neural Networks》是Andrw Ng深度學(xué)習(xí)專項(xiàng)課程中的第四門課。這門課主要介紹卷積神經(jīng)網(wǎng)絡(luò)(CNN)的基本概念、模型和具體應(yīng)用。該門課共有4周課時(shí),所以我將分成4次筆記來總結(jié),這是第2節(jié)筆記。
1. Why look at case studies
本周課程將主要介紹幾個(gè)典型的CNN案例。通過對(duì)具體CNN模型及案例的研究,來幫助我們理解知識(shí)并訓(xùn)練實(shí)際的模型。
典型的CNN模型包括:
LeNet-5
AlexNet
VGG
除了這些性能良好的CNN模型之外,我們還會(huì)介紹Residual Network(ResNet)。其特點(diǎn)是可以構(gòu)建很深很深的神經(jīng)網(wǎng)絡(luò)(目前最深的好像有152層)。
另外,還會(huì)介紹Inception Neural Network。接下來,我們將一一講解。
2. Classic Networks
LeNet-5模型是Yann LeCun教授于1998年提出來的,它是第一個(gè)成功應(yīng)用于數(shù)字識(shí)別問題的卷積神經(jīng)網(wǎng)絡(luò)。在MNIST數(shù)據(jù)中,它的準(zhǔn)確率達(dá)到大約99.2%。典型的LeNet-5結(jié)構(gòu)包含CONV layer,POOL layer和FC layer,順序一般是CONV layer->POOL layer->CONV layer->POOL layer->FC layer->FC layer->OUTPUT layer,即y^y^。下圖所示的是一個(gè)數(shù)字識(shí)別的LeNet-5的模型結(jié)構(gòu):
該LeNet模型總共包含了大約6萬個(gè)參數(shù)。值得一提的是,當(dāng)時(shí)Yann LeCun提出的LeNet-5模型池化層使用的是average pool,而且各層激活函數(shù)一般是Sigmoid和tanh?,F(xiàn)在,我們可以根據(jù)需要,做出改進(jìn),使用max pool和激活函數(shù)ReLU。
AlexNet模型是由Alex Krizhevsky、Ilya Sutskever和Geoffrey Hinton共同提出的,其結(jié)構(gòu)如下所示:
AlexNet模型與LeNet-5模型類似,只是要復(fù)雜一些,總共包含了大約6千萬個(gè)參數(shù)。同樣可以根據(jù)實(shí)際情況使用激活函數(shù)ReLU。原作者還提到了一種優(yōu)化技巧,叫做Local Response Normalization(LRN)。 而在實(shí)際應(yīng)用中,LRN的效果并不突出。
VGG-16模型更加復(fù)雜一些,一般情況下,其CONV layer和POOL layer設(shè)置如下:
CONV = 3x3 filters, s = 1, same
MAX-POOL = 2x2, s = 2
VGG-16結(jié)構(gòu)如下所示:
VGG-16的參數(shù)多達(dá)1億3千萬。
3. ResNets
我們知道,如果神經(jīng)網(wǎng)絡(luò)層數(shù)越多,網(wǎng)絡(luò)越深,源于梯度消失和梯度爆炸的影響,整個(gè)模型難以訓(xùn)練成功。解決的方法之一是人為地讓神經(jīng)網(wǎng)絡(luò)某些層跳過下一層神經(jīng)元的連接,隔層相連,弱化每層之間的強(qiáng)聯(lián)系。這種神經(jīng)網(wǎng)絡(luò)被稱為Residual Networks(ResNets)。
Residual Networks由許多隔層相連的神經(jīng)元子模塊組成,我們稱之為Residual block。單個(gè)Residual block的結(jié)構(gòu)如下圖所示:
上圖中紅色部分就是skip connection,直接建立a[l]a[l]與a[l+2]a[l+2]之間的隔層聯(lián)系。相應(yīng)的表達(dá)式如下:
z[l+1]=W[l+1]a[l]+b[l+1]z[l+1]=W[l+1]a[l]+b[l+1]
a[l+1]=g(z[l+1])a[l+1]=g(z[l+1])
z[l+2]=W[l+2]a[l+1]+b[l+2]z[l+2]=W[l+2]a[l+1]+b[l+2]
a[l+2]=g(z[l+2]+a[l])a[l+2]=g(z[l+2]+a[l])
a[l]a[l]直接隔層與下一層的線性輸出相連,與z[l+2]z[l+2]共同通過激活函數(shù)(ReLU)輸出a[l+2]a[l+2]。
該模型由Kaiming He, Xiangyu Zhang, Shaoqing Ren和Jian Sun共同提出。由多個(gè)Residual block組成的神經(jīng)網(wǎng)絡(luò)就是Residual Network。實(shí)驗(yàn)表明,這種模型結(jié)構(gòu)對(duì)于訓(xùn)練非常深的神經(jīng)網(wǎng)絡(luò),效果很好。另外,為了便于區(qū)分,我們把非Residual Networks稱為Plain Network。
Residual Network的結(jié)構(gòu)如上圖所示。
與Plain Network相比,Residual Network能夠訓(xùn)練更深層的神經(jīng)網(wǎng)絡(luò),有效避免發(fā)生發(fā)生梯度消失和梯度爆炸。從下面兩張圖的對(duì)比中可以看出,隨著神經(jīng)網(wǎng)絡(luò)層數(shù)增加,Plain Network實(shí)際性能會(huì)變差,training error甚至?xí)兇?。然?#xff0c;Residual Network的訓(xùn)練效果卻很好,training error一直呈下降趨勢。
4. Why ResNets Work
下面用個(gè)例子來解釋為什么ResNets能夠訓(xùn)練更深層的神經(jīng)網(wǎng)絡(luò)。
如上圖所示,輸入x經(jīng)過很多層神經(jīng)網(wǎng)絡(luò)后輸出a[l]a[l],a[l]a[l]經(jīng)過一個(gè)Residual block輸出a[l+2]a[l+2]。a[l+2]a[l+2]的表達(dá)式為:
a[l+2]=g(z[l+2]+a[l])=g(W[l+2]a[l+1]+b[l+2]+a[l])a[l+2]=g(z[l+2]+a[l])=g(W[l+2]a[l+1]+b[l+2]+a[l])
輸入x經(jīng)過Big NN后,若W[l+2]≈0W[l+2]≈0,b[l+2]≈0b[l+2]≈0,則有:
a[l+2]=g(a[l])=ReLU(a[l])=a[l]????when?a[l]≥0a[l+2]=g(a[l])=ReLU(a[l])=a[l]whena[l]≥0
可以看出,即使發(fā)生了梯度消失,W[l+2]≈0W[l+2]≈0,b[l+2]≈0b[l+2]≈0,也能直接建立a[l+2]a[l+2]與a[l]a[l]的線性關(guān)系,且a[l+2]=a[l]a[l+2]=a[l],這其實(shí)就是identity function。a[l]a[l]直接連到a[l+2]a[l+2],從效果來說,相當(dāng)于直接忽略了a[l]a[l]之后的這兩層神經(jīng)層。這樣,看似很深的神經(jīng)網(wǎng)絡(luò),其實(shí)由于許多Residual blocks的存在,弱化削減了某些神經(jīng)層之間的聯(lián)系,實(shí)現(xiàn)隔層線性傳遞,而不是一味追求非線性關(guān)系,模型本身也就能“容忍”更深層的神經(jīng)網(wǎng)絡(luò)了。而且從性能上來說,這兩層額外的Residual blocks也不會(huì)降低Big NN的性能。
當(dāng)然,如果Residual blocks確實(shí)能訓(xùn)練得到非線性關(guān)系,那么也會(huì)忽略short cut,跟Plain Network起到同樣的效果。
有一點(diǎn)需要注意的是,如果Residual blocks中a[l]a[l]和a[l+2]a[l+2]的維度不同,通??梢砸刖仃?span id="ozvdkddzhkzd" class="MathJax_Preview" style="color: inherit; display: none;">WsWs,與a[l]a[l]相乘,使得Ws?a[l]Ws?a[l]的維度與a[l+2]a[l+2]一致。參數(shù)矩陣WsWs有來兩種方法得到:一種是將WsWs作為學(xué)習(xí)參數(shù),通過模型訓(xùn)練得到;另一種是固定WsWs值(類似單位矩陣),不需要訓(xùn)練,WsWs與a[l]a[l]的乘積僅僅使得a[l]a[l]截?cái)嗷蛘哐a(bǔ)零。這兩種方法都可行。
下圖所示的是CNN中ResNets的結(jié)構(gòu):
ResNets同類型層之間,例如CONV layers,大多使用same類型,保持維度相同。如果是不同類型層之間的連接,例如CONV layer與POOL layer之間,如果維度不同,則引入矩陣WsWs。
5. Networks in Networks and 1x1 Convolutions
Min Lin, Qiang Chen等人提出了一種新的CNN結(jié)構(gòu),即1x1 Convolutions,也稱Networks in Networks。這種結(jié)構(gòu)的特點(diǎn)是濾波器算子filter的維度為1x1。對(duì)于單個(gè)filter,1x1的維度,意味著卷積操作等同于乘積操作。
那么,對(duì)于多個(gè)filters,1x1 Convolutions的作用實(shí)際上類似全連接層的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)。效果等同于Plain Network中a[l]a[l]到a[l+1]a[l+1]的過程。這點(diǎn)還是比較好理解的。
1x1 Convolutions可以用來縮減輸入圖片的通道數(shù)目。方法如下圖所示:
6. Inception Network Motivation
之前我們介紹的CNN單層的濾波算子filter尺寸是固定的,1x1或者3x3等。而Inception Network在單層網(wǎng)絡(luò)上可以使用多個(gè)不同尺寸的filters,進(jìn)行same convolutions,把各filter下得到的輸出拼接起來。除此之外,還可以將CONV layer與POOL layer混合,同時(shí)實(shí)現(xiàn)各種效果。但是要注意使用same pool。
Inception Network由Christian Szegedy, Wei Liu等人提出。與其它只選擇單一尺寸和功能的filter不同,Inception Network使用不同尺寸的filters并將CONV和POOL混合起來,將所有功能輸出組合拼接,再由神經(jīng)網(wǎng)絡(luò)本身去學(xué)習(xí)參數(shù)并選擇最好的模塊。
Inception Network在提升性能的同時(shí),會(huì)帶來計(jì)算量大的問題。例如下面這個(gè)例子:
此CONV layer需要的計(jì)算量為:28x28x32x5x5x192=120m,其中m表示百萬單位??梢钥闯龅@一層的計(jì)算量都是很大的。為此,我們可以引入1x1 Convolutions來減少其計(jì)算量,結(jié)構(gòu)如下圖所示:
通常我們把該1x1 Convolution稱為“瓶頸層”(bottleneck layer)。引入bottleneck layer之后,總共需要的計(jì)算量為:28x28x16x192+28x28x32x5x5x16=12.4m。明顯地,雖然多引入了1x1 Convolution層,但是總共的計(jì)算量減少了近90%,效果還是非常明顯的。由此可見,1x1 Convolutions還可以有效減少CONV layer的計(jì)算量。
7.Inception Network
上一節(jié)我們使用1x1 Convolution來減少Inception Network計(jì)算量大的問題。引入1x1 Convolution后的Inception module如下圖所示:
多個(gè)Inception modules組成Inception Network,效果如下圖所示:
上述Inception Network除了由許多Inception modules組成之外,值得一提的是網(wǎng)絡(luò)中間隱藏層也可以作為輸出層Softmax,有利于防止發(fā)生過擬合。
8. Using Open-Source Implementation
本節(jié)主要介紹GitHub的使用,GitHub是一個(gè)面向開源及私有軟件項(xiàng)目的托管平臺(tái),上面包含有許多優(yōu)秀的CNN開源項(xiàng)目。關(guān)于GitHub具體內(nèi)容不再介紹,有興趣的小伙伴自行查閱。
9. Transfer Learning
有關(guān)Transfer Learning的相關(guān)內(nèi)容,我們在 Coursera吳恩達(dá)《構(gòu)建機(jī)器學(xué)習(xí)項(xiàng)目》課程筆記(2)– 機(jī)器學(xué)習(xí)策略(下)中已經(jīng)詳細(xì)介紹過,這里就不再贅述了。
10. Data Augmentation
常用的Data Augmentation方法是對(duì)已有的樣本集進(jìn)行Mirroring和Random Cropping。
另一種Data Augmentation的方法是color shifting。color shifting就是對(duì)圖片的RGB通道數(shù)值進(jìn)行隨意增加或者減少,改變圖片色調(diào)。
除了隨意改變RGB通道數(shù)值外,還可以更有針對(duì)性地對(duì)圖片的RGB通道進(jìn)行PCA color augmentation,也就是對(duì)圖片顏色進(jìn)行主成分分析,對(duì)主要的通道顏色進(jìn)行增加或減少,可以采用高斯擾動(dòng)做法。這樣也能增加有效的樣本數(shù)量。具體的PCA color augmentation做法可以查閱AlexNet的相關(guān)論文。
最后提一下,在構(gòu)建大型神經(jīng)網(wǎng)絡(luò)的時(shí)候,data augmentation和training可以由兩個(gè)不同的線程來進(jìn)行。
11. State of Computer Vision
神經(jīng)網(wǎng)絡(luò)需要數(shù)據(jù),不同的網(wǎng)絡(luò)模型所需的數(shù)據(jù)量是不同的。Object dection,Image recognition,Speech recognition所需的數(shù)據(jù)量依次增加。一般來說,如果data較少,那么就需要更多的hand-engineering,對(duì)已有data進(jìn)行處理,比如上一節(jié)介紹的data augmentation。模型算法也會(huì)相對(duì)要復(fù)雜一些。如果data很多,可以構(gòu)建深層神經(jīng)網(wǎng)絡(luò),不需要太多的hand-engineering,模型算法也就相對(duì)簡單一些。
值得一提的是hand-engineering是一項(xiàng)非常重要也比較困難的工作。很多時(shí)候,hand-engineering對(duì)模型訓(xùn)練效果影響很大,特別是在數(shù)據(jù)量不多的情況下。
在模型研究或者競賽方面,有一些方法能夠有助于提升神經(jīng)網(wǎng)絡(luò)模型的性能:
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.
但是由于這兩種方法計(jì)算成本較大,一般不適用于實(shí)際項(xiàng)目開發(fā)。
最后,我們還要靈活使用開源代碼:
Use archittectures of networks published in the literature
Use open source implementations if possible
Use pretrained models and fine-tune on your dataset
更多AI資源請關(guān)注公眾號(hào):紅色石頭的機(jī)器學(xué)習(xí)之路(ID:redstonewill)
總結(jié)
以上是生活随笔為你收集整理的Coursera吴恩达《卷积神经网络》课程笔记(2)-- 深度卷积模型:案例研究的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Coursera吴恩达《优化深度神经网络
- 下一篇: Coursera吴恩达《卷积神经网络》课