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