不要再纠结卷积的公式啦!0公式深度解析全连接前馈网络与卷积神经网络
Hello~你們的小夕終于吐泡泡了~前幾天小夕又加班趕project啦,拖了好幾天,都快患上拖稿焦慮癥了_(:з」∠)_
?
關(guān)于卷積神經(jīng)網(wǎng),小夕就不從卷積講啦。以前不止一個(gè)粉絲問我卷積神經(jīng)網(wǎng)絡(luò)中卷積的意義,甚至在知乎上被邀請(qǐng)回答一個(gè)“卷積神經(jīng)網(wǎng)絡(luò)為什么不叫互相關(guān)神經(jīng)網(wǎng)絡(luò)”的類似的奇怪問題,終于忍不住,還是趕緊把CNN寫了吧(說的自己要去拯救世界了一樣\(//?//)\
?
我們還是從前面更簡單的機(jī)器學(xué)習(xí)model開始。回顧一下前面已經(jīng)講過N*N*N次的全連接前饋神經(jīng)網(wǎng)絡(luò),前面文章中小夕講過,對(duì)于一個(gè)有一個(gè)隱含層的全連接前饋網(wǎng)絡(luò):
?
?
這里就可以看作是兩層簡單的分類器的前后級(jí)聯(lián),前一層分類器的輸出就是后一層分類器的輸入,那么顯然前一層分類器的每個(gè)輸出(即每個(gè)隱單元)代表什么含義我們是不清楚的,也就是前一層分類器學(xué)到的是分類未知意義的類別!而后一層分類器則直接利用前一個(gè)分類器得到的未知類別來學(xué)習(xí)輸出最終我們定義的類別!舉個(gè)栗子。
?
比如輸入是一副圖像:
?
?
這個(gè)圖像假設(shè)是100*100的,也就是有10000個(gè)像素點(diǎn)。每個(gè)像素點(diǎn)取值0-255。
?
試想一下,如果我們不想人為定義特征,想要直接將原始圖像丟進(jìn)去,去分類圖像是否包含狗這個(gè)類別。那么這時(shí)就相當(dāng)于輸入層有10000維,也就是有10000個(gè)特征,每個(gè)特征就是一個(gè)像素點(diǎn)的值。
?
如果我們的機(jī)器學(xué)習(xí)模型不加隱含層的話:
?
?
這時(shí)的模型顯然是將每個(gè)像素點(diǎn)直接連接到了“是不是狗”這兩個(gè)最終類別上。然而我們稍微想一下也知道,其實(shí)每個(gè)像素點(diǎn)的值跟是不是狗并沒有什么聯(lián)系(你不能說這個(gè)像素點(diǎn)是黑的(值為0),就說這個(gè)像素點(diǎn)是狗身上的,同樣,像素點(diǎn)是白的(值為255)也不能說明這個(gè)像素點(diǎn)是不是狗身上的。)所以顯然直接用每個(gè)像素點(diǎn)的值做特征去決策是不是狗這件事是非常不靠譜的!(每個(gè)特征都跟類別關(guān)系不大啊姐姐)
?
但是,如果我們加一個(gè)隱含層呢?這樣情況會(huì)不會(huì)好一些呢?
?
設(shè)想一下,如前所述,加一個(gè)隱含層后,模型可以學(xué)習(xí)出一層未知類別,而這些類別完全可以做到跟像素點(diǎn)強(qiáng)相關(guān)!比如一個(gè)隱含類別是“以圖像中心為圓心,半徑為50的地方是否有一個(gè)圓形”
?
學(xué)習(xí)出這個(gè)分類器很簡單,model只需要讓這個(gè)圓圈所在的像素點(diǎn)對(duì)應(yīng)的權(quán)重很大(比如2),讓其他特征的權(quán)重接近0。這樣這個(gè)地方出現(xiàn)的圓越明顯(像素值越接近0),就會(huì)導(dǎo)致該子分類器的輸出接近0,而這個(gè)地方?jīng)]有出現(xiàn)圓的時(shí)候(像素值接近255)就會(huì)導(dǎo)致分類器的輸出很大,看,很輕松的就學(xué)會(huì)了這個(gè)簡單的分類任務(wù)吧(當(dāng)然,為了學(xué)到這個(gè)地方有沒有圓,還需要考慮圓周圍的像素點(diǎn)(要有足夠?qū)Ρ榷炔拍苷f明這里真有圓哦),不過忽略這些細(xì)節(jié)啦,懂了小夕瑤表達(dá)的意思就好)。
?
好啦,這個(gè)子分類器訓(xùn)練好啦,也就是一個(gè)隱節(jié)點(diǎn)弄好了,那么同樣的道理,其他的子分類器(隱節(jié)點(diǎn))也可以學(xué)習(xí)到一些奇怪而簡單的隱含類別,這一系列的類別組合起來完全有可能是這樣子的
看,基于這些類別(也就是對(duì)下一級(jí)分類器而言的特征),下一級(jí)分類器就很容易分類這個(gè)圖片是不是狗啦~比如上面這個(gè)圖片中,就大約有7個(gè)隱節(jié)點(diǎn),分別負(fù)責(zé)7個(gè)線條存在與否的分類決策。那么下一級(jí)分類器只需要讓這7個(gè)特征的權(quán)重都大一些,這樣當(dāng)這些特征全部存在的時(shí)候,顯然這就是一條狗啊!那么后一級(jí)分類器就能很自信的決策說:“這圖片是一條狗!”看~這比直接讓單個(gè)像素點(diǎn)與狗掛鉤的做法科學(xué)多了,自信多了吧~
?
這就是用深度全連接前饋神經(jīng)網(wǎng)絡(luò)做分類的基本原理。
?
但是!你一定能發(fā)現(xiàn)問題!這樣顯然有很大的局限性!比如狗一旦換個(gè)姿勢(shì)呢?狗一旦換個(gè)大小呢?圖像中的狗蜷縮在一個(gè)角落呢?
?
顯然!這時(shí)全連接前饋網(wǎng)絡(luò)的隱含層的任務(wù)量要爆炸了!要有非常多非常多的隱節(jié)點(diǎn)來學(xué)到非常多隱含類別/隱含特征才可能足夠應(yīng)付這么多復(fù)雜局面!
?
而隱含層節(jié)點(diǎn)大量增多后將會(huì)導(dǎo)致神經(jīng)網(wǎng)絡(luò)的參數(shù)迅速增加!比如上面這個(gè)例子,增加一個(gè)隱節(jié)點(diǎn)就要增加10000+2個(gè)參數(shù),顯然代價(jià)是非常大的。那么有沒有更好的解決方案呢?
?
很顯然啊!既然我們的簡單分類器要學(xué)的是一個(gè)簡單的圓,一個(gè)簡單的直線,一個(gè)簡單的決策任務(wù),那么所有的學(xué)習(xí)圓的隱節(jié)點(diǎn)完全可以合并為一個(gè)節(jié)點(diǎn)啊!這時(shí)我們可以用一個(gè)遠(yuǎn)小于整幅圖像的“窗”來表示。比如就用一個(gè)20*20的窗(這樣就只有400個(gè)參數(shù),而之前全連接的時(shí)候要100*100=10000個(gè)參數(shù)),而且這個(gè)窗就負(fù)責(zé)找出圖片中各處的小圓!這個(gè)“窗”就叫“卷積核”,(顯然本質(zhì)上就是一個(gè)縮小版的輸入到一個(gè)隱節(jié)點(diǎn)的連接權(quán)重)為了尋找圖像中各個(gè)角落的小圓,我們就可以讓這個(gè)卷積核依次滑過圖像的各個(gè)角落,只要在某處發(fā)現(xiàn)了小圓,就在該處激活,即標(biāo)記好這里有個(gè)小圓。
?
因此,就跟前面全連接的時(shí)候一樣,為了學(xué)到多個(gè)特征,我們肯定要設(shè)置多個(gè)卷積核呀~每個(gè)卷機(jī)核負(fù)責(zé)一種簡單的分類任務(wù)(說到這個(gè)份上了,大家也能猜到,這依然是跟全連接的時(shí)候一樣,這里的簡單分類任務(wù)其實(shí)就是為下一層的子分類器拋棄舊特征,創(chuàng)造新特征啦)。
?
顯然,依然跟全連接時(shí)一樣,比如同樣是20*20的卷積核,不同的參數(shù)就代表提取出了不同的特征,有的負(fù)責(zé)提取20*20塊里的小圓,有的負(fù)責(zé)提取三角,有的提取直線等等~同一組大小的多個(gè)卷積核,就統(tǒng)稱為一個(gè)20*20的濾波器(filter)(即一個(gè)某size的濾波器下可以設(shè)置學(xué)習(xí)多個(gè)卷積核)
?
而我們既然需要從20*20的塊里去分類小圓,因此當(dāng)然也可能需要從50*50的塊里尋找大圓啦~因此在一個(gè)卷積層,我們還可以設(shè)置多個(gè)size的濾波器~當(dāng)然每個(gè)size的濾波器下可以設(shè)置多個(gè)卷積核來提取不同特征。
?
我們?cè)賮砜紤]更復(fù)雜的情況!
我們知道,很多時(shí)候的輸入并不是只有一個(gè)表示層!比如彩色圖像就會(huì)包含紅色、藍(lán)色、綠色這三個(gè)圖層,而不像前面的灰度圖一樣僅僅包含一個(gè)圖層。
有時(shí)候彩色圖像的一個(gè)圓圈僅僅出現(xiàn)在藍(lán)色圖層里,而沒有出現(xiàn)在其他兩個(gè)圖層,因此顯然如果我們的負(fù)責(zé)提取圓圈的卷積核僅在一個(gè)圖層里滑動(dòng)的話,可能會(huì)在很多位置遺漏很多信息,因此當(dāng)輸入的數(shù)據(jù)可以表示成很多層(即有很多不同角度的數(shù)據(jù)表示)的時(shí)候,卷積核要在每個(gè)位置處把所有的圖層都映射/"卷積"一下,并且求和,才是真正確定圖像在這個(gè)位置處到底有沒有該卷積核要找的特征的做法。這里輸入的多個(gè)層被稱為多個(gè)輸入通道(channel-in),所以一個(gè)卷積層,不僅可以設(shè)置多個(gè)size的濾波器,還可以在每個(gè)size的濾波器下設(shè)置多個(gè)卷積核,還可以讓同一個(gè)卷積核每次同時(shí)考慮輸入數(shù)據(jù)的多個(gè)通道!
?
我們?cè)賮砜紤]更更復(fù)雜的情況!
?
假如我們現(xiàn)在的分類任務(wù)變了!變得更難了!現(xiàn)在我們直接想識(shí)別出一個(gè)圖片中是不是正在發(fā)生貓狗大戰(zhàn)!
?
?
這樣的話!我們要有好多好多分類器啊!我們要識(shí)別貓,要識(shí)別狗,要識(shí)別頭上的包,要識(shí)別創(chuàng)可貼等等,這么多子分類任務(wù)怎么辦呢?能不能直接納入一個(gè)卷積層呢?
?
當(dāng)然可以啦!既然都可以有多個(gè)輸入通道,當(dāng)然也可以設(shè)置多個(gè)輸出通道(channel-out)啊!一個(gè)輸出通道就代表著一個(gè)子分類任務(wù)~(當(dāng)然啦,每個(gè)子分類任務(wù)都會(huì)有它的一套filter及其一堆卷積核)。(當(dāng)然啦,這些子分類任務(wù)也是人類不清楚的,神經(jīng)網(wǎng)絡(luò)自己知道)
?
至此,完整的卷積層就定義完成啦。我們?cè)倏偨Y(jié)一下,一個(gè)卷積核在每個(gè)位置處要同時(shí)考慮所有的channel-in;然后一個(gè)size的filter下可以設(shè)置多個(gè)卷積核用于提取不同特征;然后可以設(shè)置不同size的多個(gè)filter來控制特征提取的粒度;然后可以設(shè)置多個(gè)輸出通道channel-out表示多個(gè)分類任務(wù)。而且跟全連接前饋網(wǎng)絡(luò)一樣,被卷積核映射完(即線性映射結(jié)束后)別忘了丟激活函數(shù)哦~
?
所以在圖像中,一個(gè)卷積層就分成多個(gè)size的filter,每個(gè)size的filter就對(duì)應(yīng)著一個(gè)channel-in*width*height*channel-out的4D參數(shù)Tensor,其中的width和height就是卷積核這個(gè)窗口的寬和高啦~這種二維窗口的卷積核也稱為2D卷積,同理三維卷積窗口就是3D卷積,參數(shù)Tensor就是5D的啦。
想一想,還有沒有什么需要解決的問題呢?
剛才我們討論的對(duì)象僅僅是針對(duì)卷機(jī)核在一個(gè)位置上的操作!顯然一個(gè)卷積核滑過整個(gè)輸入數(shù)據(jù)后,會(huì)在各種產(chǎn)生很多輸出,那么這么多輸出怎么取舍呢?
試想一下,其實(shí)我們要找出來貓的話,不管貓的位置是在圖片左上角的角落,還是右下角,還是鋪滿整個(gè)圖片,其實(shí)我們都說這個(gè)圖片中包含了貓!大部分時(shí)候我們對(duì)它的位置不感興趣,僅僅是關(guān)心這個(gè)圖片中到底有沒有這個(gè)東西,因此我們只需要判斷該卷積核在所有的位置點(diǎn)產(chǎn)生的最強(qiáng)輸出有多強(qiáng)就夠啦~而其他位置點(diǎn)的輸出直接拋棄就好咯~這個(gè)操作就叫最大池化(max-pooling)!這也是為什么大部分情況下最大池化是最有效的池化方式。
?
顯然,處理一個(gè)卷積核的所有位置點(diǎn),除了取最大值的方式,肯定還有一些場(chǎng)景需要其他更合理的方式。這些方式都叫池化。
除了最大池化,還有時(shí)會(huì)用均值池化(average-pooling)、取前n個(gè)最大值池化(max-n pooling)等,從名字就能猜到池化方式啦,就不一一啰嗦了~當(dāng)然,對(duì)所有位置點(diǎn)進(jìn)行一次池化的話叫全局池化,相當(dāng)于提取了全局的一個(gè)特征或者說一個(gè)類別。如果我們對(duì)池化操作也定義一個(gè)范圍(即一個(gè)窗/一個(gè)池化核)的話,就是局部池化啦~得到的就是局部特征/類別。
?
哦對(duì)了,都已經(jīng)講解到這里啦,很顯然池化是肯定跟在卷積層后面的(當(dāng)然,由于卷積后務(wù)必跟一個(gè)激活函數(shù)保證模型的非線性,所以如果激活函數(shù)也算一層的話,池化層是跟在激活層后面的)。
?
好啦~卷積神經(jīng)網(wǎng)絡(luò)講完了,卷積-激活-池化,就這么簡單。當(dāng)然,正如之前所說,如果池化的結(jié)果仍然是作為一個(gè)隱含類別的話(即池化的輸出不接我們最終的分類任務(wù)的話),那么這依然跟前面一樣,可以作為下一層的特征去使用。因此池化層后面當(dāng)然又可以接新一輪的卷積-激活-池化,也就是形成真正意義上的深度神經(jīng)網(wǎng)絡(luò)。
?
總結(jié)
以上是生活随笔為你收集整理的不要再纠结卷积的公式啦!0公式深度解析全连接前馈网络与卷积神经网络的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 新年立个小目标!代码写得更规范!
- 下一篇: 从论文到PPT,一键生成!从此报告不用愁