本文的主要目的,是簡單介紹時(shí)下流行的深度學(xué)習(xí)算法的基礎(chǔ)知識,本人也看過許多其他教程,感覺其中大部分講的還是太過深奧,于是便有了寫一篇科普文的想法。博主也是現(xiàn)學(xué)現(xiàn)賣,文中如有不當(dāng)之處,請各位指出,共同進(jìn)步。
本文的目標(biāo)讀者是對機(jī)器學(xué)習(xí)和神經(jīng)網(wǎng)絡(luò)有一定了解的同學(xué)(包括:梯度下降、神經(jīng)網(wǎng)絡(luò)、反向傳播算法等),機(jī)器學(xué)習(xí)的相關(guān)知識。
深度學(xué)習(xí)簡介
深度學(xué)習(xí)是指多層神經(jīng)網(wǎng)絡(luò)上運(yùn)用各種機(jī)器學(xué)習(xí)算法解決圖像,文本等各種問題的算法集合。深度學(xué)習(xí)從大類上可以歸入神經(jīng)網(wǎng)絡(luò),不過在具體實(shí)現(xiàn)上有許多變化。深度學(xué)習(xí)的核心是特征學(xué)習(xí),旨在通過分層網(wǎng)絡(luò)獲取分層次的特征信息,從而解決以往需要人工設(shè)計(jì)特征的重要難題。深度學(xué)習(xí)是一個(gè)框架,包含多個(gè)重要算法:
Convolutional Neural Networks(CNN)卷積神經(jīng)網(wǎng)絡(luò)
AutoEncoder自動編碼器
Sparse Coding稀疏編碼
Restricted Boltzmann Machine(RBM)限制波爾茲曼機(jī)
Deep Belief Networks(DBN)深信度網(wǎng)絡(luò)
Recurrent neural Network(RNN)多層反饋循環(huán)神經(jīng)網(wǎng)絡(luò)神經(jīng)網(wǎng)絡(luò)
對于不同問題(圖像,語音,文本),需要選用不同網(wǎng)絡(luò)模型才能達(dá)到更好效果。
此外,最近幾年增強(qiáng)學(xué)習(xí)(Reinforcement Learning)與深度學(xué)習(xí)的結(jié)合也創(chuàng)造了許多了不起的成果,AlphaGo就是其中之一。
人類視覺原理
深度學(xué)習(xí)的許多研究成果,離不開對大腦認(rèn)知原理的研究,尤其是視覺原理的研究。
1981 年的諾貝爾醫(yī)學(xué)獎(jiǎng),頒發(fā)給了 David Hubel(出生于加拿大的美國神經(jīng)生物學(xué)家) 和TorstenWiesel,以及 Roger Sperry。前兩位的主要貢獻(xiàn),是“發(fā)現(xiàn)了視覺系統(tǒng)的信息處理”,可視皮層是分級的。
人類的視覺原理如下:從原始信號攝入開始(瞳孔攝入像素 Pixels),接著做初步處理(大腦皮層某些細(xì)胞發(fā)現(xiàn)邊緣和方向),然后抽象(大腦判定,眼前的物體的形狀,是圓形的),然后進(jìn)一步抽象(大腦進(jìn)一步判定該物體是只氣球)。下面是人腦進(jìn)行人臉識別的一個(gè)示例:
對于不同的物體,人類視覺也是通過這樣逐層分級,來進(jìn)行認(rèn)知的:
我們可以看到,在最底層特征基本上是類似的,就是各種邊緣,越往上,越能提取出此類物體的一些特征(輪子、眼睛、軀干等),到最上層,不同的高級特征最終組合成相應(yīng)的圖像,從而能夠讓人類準(zhǔn)確的區(qū)分不同的物體。
那么我們可以很自然的想到:可以不可以模仿人類大腦的這個(gè)特點(diǎn),構(gòu)造多層的神經(jīng)網(wǎng)絡(luò),較低層的識別初級的圖像特征,若干底層特征組成更上一層特征,最終通過多個(gè)層級的組合,最終在頂層做出分類呢?答案是肯定的,這也是許多深度學(xué)習(xí)算法(包括CNN)的靈感來源。
卷積網(wǎng)絡(luò)介紹
卷積神經(jīng)網(wǎng)絡(luò)是一種多層神經(jīng)網(wǎng)絡(luò),擅長處理圖像特別是大圖像的相關(guān)機(jī)器學(xué)習(xí)問題。
卷積網(wǎng)絡(luò)通過一系列方法,成功將數(shù)據(jù)量龐大的圖像識別問題不斷降維,最終使其能夠被訓(xùn)練。CNN最早由Yann LeCun提出并應(yīng)用在手寫字體識別上(MINST)。LeCun提出的網(wǎng)絡(luò)稱為LeNet,其網(wǎng)絡(luò)結(jié)構(gòu)如下:
這是一個(gè)最典型的卷積網(wǎng)絡(luò),由卷積層、池化層、全連接層組成。其中卷積層與池化層配合,組成多個(gè)卷積組,逐層提取特征,最終通過若干個(gè)全連接層完成分類。
卷積層完成的操作,可以認(rèn)為是受局部感受野概念的啟發(fā),而池化層,主要是為了降低數(shù)據(jù)維度。
綜合起來說,CNN通過卷積來模擬特征區(qū)分,并且通過卷積的權(quán)值共享及池化,來降低網(wǎng)絡(luò)參數(shù)的數(shù)量級,最后通過傳統(tǒng)神經(jīng)網(wǎng)絡(luò)完成分類等任務(wù)。
降低參數(shù)量級
為什么要降低參數(shù)量級?從下面的例子就可以很容易理解了。
如果我們使用傳統(tǒng)神經(jīng)網(wǎng)絡(luò)方式,對一張圖片進(jìn)行分類,那么,我們把圖片的每個(gè)像素都連接到隱藏層節(jié)點(diǎn)上,那么對于一張1000x1000像素的圖片,如果我們有1M隱藏層單元,那么一共有10^12個(gè)參數(shù),這顯然是不能接受的。(如下圖所示)
但是我們在CNN里,可以大大減少參數(shù)個(gè)數(shù),我們基于以下兩個(gè)假設(shè):
1)最底層特征都是局部性的,也就是說,我們用10x10這樣大小的過濾器就能表示邊緣等底層特征
2)圖像上不同小片段,以及不同圖像上的小片段的特征是類似的,也就是說,我們能用同樣的一組分類器來描述各種各樣不同的圖像
基于以上兩個(gè),假設(shè),我們就能把第一層網(wǎng)絡(luò)結(jié)構(gòu)簡化如下:
我們用100個(gè)10x10的小過濾器,就能夠描述整幅圖片上的底層特征。
卷積(Convolution)
卷積運(yùn)算的定義如下圖所示:
如圖所示,我們有一個(gè)5x5的圖像,我們用一個(gè)3x3的卷積核:
1 0 1
0 1 0
1 0 1
來對圖像進(jìn)行卷積操作(可以理解為有一個(gè)滑動窗口,把卷積核與對應(yīng)的圖像像素做乘積然后求和),得到了3x3的卷積結(jié)果。
這個(gè)過程我們可以理解為我們使用一個(gè)過濾器(卷積核)來過濾圖像的各個(gè)小區(qū)域,從而得到這些小區(qū)域的特征值。
在實(shí)際訓(xùn)練過程中,卷積核的值是在學(xué)習(xí)過程中學(xué)到的。
在具體應(yīng)用中,往往有多個(gè)卷積核,可以認(rèn)為,每個(gè)卷積核代表了一種圖像模式,如果某個(gè)圖像塊與此卷積核卷積出的值大,則認(rèn)為此圖像塊十分接近于此卷積核。如果我們設(shè)計(jì)了6個(gè)卷積核,可以理解:我們認(rèn)為這個(gè)圖像上有6種底層紋理模式,也就是我們用6中基礎(chǔ)模式就能描繪出一副圖像。以下就是24種不同的卷積核的示例:
池化(Pooling)
池化聽起來很高深,其實(shí)簡單的說就是下采樣。池化的過程如下圖所示:
上圖中,我們可以看到,原始圖片是20x20的,我們對其進(jìn)行下采樣,采樣窗口為10x10,最終將其下采樣成為一個(gè)2x2大小的特征圖。
之所以這么做的原因,是因?yàn)榧词棺鐾炅司矸e,圖像仍然很大(因?yàn)榫矸e核比較小),所以為了降低數(shù)據(jù)維度,就進(jìn)行下采樣。
之所以能這么做,是因?yàn)榧词箿p少了許多數(shù)據(jù),特征的統(tǒng)計(jì)屬性仍能夠描述圖像,而且由于降低了數(shù)據(jù)維度,有效地避免了過擬合。
在實(shí)際應(yīng)用中,池化根據(jù)下采樣的方法,分為最大值下采樣(Max-Pooling)與平均值下采樣(Mean-Pooling)。
LeNet介紹
下面再回到LeNet網(wǎng)絡(luò)結(jié)構(gòu):
這回我們就比較好理解了,原始圖像進(jìn)來以后,先進(jìn)入一個(gè)卷積層C1,由6個(gè)5x5的卷積核組成,卷積出28x28的圖像,然后下采樣到14x14(S2)。
接下來,再進(jìn)一個(gè)卷積層C3,由16個(gè)5x5的卷積核組成,之后再下采樣到5x5(S4)。
注意,這里S2與C3的連接方式并不是全連接,而是部分連接,如下圖所示:
其中行代表S2層的某個(gè)節(jié)點(diǎn),列代表C3層的某個(gè)節(jié)點(diǎn)。
我們可以看出,C3-0跟S2-0,1,2連接,C3-1跟S2-1,2,3連接,后面依次類推,仔細(xì)觀察可以發(fā)現(xiàn),其實(shí)就是排列組合:
0 0 0 1 1 1
0 0 1 1 1 0
0 1 1 1 0 0
...
1 1 1 1 1 1
我們可以領(lǐng)悟作者的意圖,即用不同特征的底層組合,可以得到進(jìn)一步的高級特征,例如:/ + = ^ (比較抽象O(∩_∩)O~),再比如好多個(gè)斜線段連成一個(gè)圓等等。
最后,通過全連接層C5、F6得到10個(gè)輸出,對應(yīng)10個(gè)數(shù)字的概率。
最后說一點(diǎn)個(gè)人的想法哈,我認(rèn)為第一個(gè)卷積層選6個(gè)卷積核是有原因的,大概也許可能是因?yàn)?~9其實(shí)能用以下6個(gè)邊緣來代表:
是不是有點(diǎn)道理呢,哈哈
然后C3層的數(shù)量選擇上面也說了,是從選3個(gè)開始的排列組合,所以也是可以理解的。
其實(shí)這些都是針對特定問題的trick,現(xiàn)在更加通用的網(wǎng)絡(luò)的結(jié)構(gòu)都會復(fù)雜得多,至于這些網(wǎng)絡(luò)的參數(shù)如何選擇,那就需要我們好好學(xué)習(xí)了。
訓(xùn)練過程
卷積神經(jīng)網(wǎng)絡(luò)的訓(xùn)練過程與傳統(tǒng)神經(jīng)網(wǎng)絡(luò)類似,也是參照了反向傳播算法。
第一階段,向前傳播階段:
a)從樣本集中取一個(gè)樣本(X,Yp),將X輸入網(wǎng)絡(luò);
b)計(jì)算相應(yīng)的實(shí)際輸出Op。
在此階段,信息從輸入層經(jīng)過逐級的變換,傳送到輸出層。這個(gè)過程也是網(wǎng)絡(luò)在完成訓(xùn)練后正常運(yùn)行時(shí)執(zhí)行的過程。在此過程中,網(wǎng)絡(luò)執(zhí)行的是計(jì)算(實(shí)際上就是輸入與每層的權(quán)值矩陣相點(diǎn)乘,得到最后的輸出結(jié)果):
第二階段,向后傳播階段
a)算實(shí)際輸出Op與相應(yīng)的理想輸出Yp的差;
b)按極小化誤差的方法反向傳播調(diào)整權(quán)矩陣。
以上內(nèi)容摘自其他博客,由于我也沒有仔細(xì)了解這一塊,建議直接參考原博客。
參考資料
Deep Learning(深度學(xué)習(xí))學(xué)習(xí)筆記整理系列之(七)?
Deep Learning論文筆記之(四)CNN卷積神經(jīng)網(wǎng)絡(luò)推導(dǎo)和實(shí)現(xiàn)
卷積神經(jīng)網(wǎng)絡(luò)(一):LeNet5的基本結(jié)構(gòu)
UFLDL Tutorial?
文章轉(zhuǎn)載自:Alex Cai
評論
查看更多