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