- 視頻地址:https://www.youtube.com/embed/FmpDIaiMIeA
- 文檔參閱:pdf [2MB] & ppt [6MB] & Web View & GitBook
- 補充知識:深度學(xué)習(xí) — 反向傳播理論推導(dǎo)
當你聽到說深度學(xué)習(xí)打破了某項新技術(shù)障礙,那么十有八九就會涉及到卷積神經(jīng)網(wǎng)絡(luò)。它們也被稱作CNNs或著ConvNets,是深層神經(jīng)網(wǎng)絡(luò)領(lǐng)域的主力。它們已經(jīng)學(xué)會對圖像進行分類,在某些情況下甚至超過了人類。如果有一個方法證明了這種假設(shè),那就是CNN。特別酷的一點就是,當你將它們分解為基本模塊時,它們很容易被理解。這里有一個視頻,很詳細地討論了關(guān)于這些圖像問題。
先驗工作
A toy ConvNet:X’s and O’s
識別一幅圖片是包含有字母"X"還是字母"O"?
為了幫助指導(dǎo)你理解卷積神經(jīng)網(wǎng)絡(luò),我們講采用一個非常簡化的例子:確定一幅圖像是包含有"X"還是"O"?
這個例子足夠說明CNN背后的原理,同時它足夠簡單,能夠避免陷入不必要的細節(jié)。在CNN中有這樣一個問題,就是每次給你一張圖,你需要判斷它是否含有"X"或者"O"。并且假設(shè)必須兩者選其一,不是"X"就是"O"。理想的情況就像下面這個樣子:
對于計算機來說,只要圖像稍稍有一點變化,不是標準的,那么要解決這個問題還是不是那么容易的:
計算機要解決上面這個問題,一個比較天真的做法就是先保存一張"X"和"O"的標準圖像(就像前面給出的例子),然后將其他的新給出的圖像來和這兩張標準圖像進行對比,看看到底和哪一張圖更匹配,就判斷為哪個字母。但是這么做的話,其實是非常不可靠的,因為計算機還是比較死板的。在計算機的“視覺”中,一幅圖看起來就像是一個二維的像素數(shù)組(可以想象成一個棋盤),每一個位置對應(yīng)一個數(shù)字。在我們這個例子當中,像素值"1"代表白色,像素值"-1"代表黑色。
當比較兩幅圖的時候,如果有任何一個像素值不匹配,那么這兩幅圖就不匹配,至少對于計算機來說是這樣的。
對于這個例子,計算機認為上述兩幅圖中的白色像素除了中間的3*3的小方格里面是相同的,其他四個角上都不同:
因此,從表面上看,計算機判別右邊那幅圖不是"X",兩幅圖不同,得出結(jié)論:
但是這么做,顯得太不合理了。理想的情況下,我們希望,對于那些僅僅只是做了一些像平移,縮放,旋轉(zhuǎn),微變形等簡單變換的圖像,計算機仍然能夠識別出圖中的"X"和"O"。就像下面這些情況,我們希望計算機依然能夠很快并且很準的識別出來:
這也就是CNN出現(xiàn)所要解決的問題。
Features
對于CNN來說,它是一塊一塊地來進行比對。它拿來比對的這個“小塊”我們稱之為Features(特征)。在兩幅圖中大致相同的位置找到一些粗糙的特征進行匹配,CNN能夠更好的看到兩幅圖的相似性,相比起傳統(tǒng)的整幅圖逐一比對的方法。
每一個feature就像是一個小圖(就是一個比較小的有值的二維數(shù)組)。不同的Feature匹配圖像中不同的特征。在字母"X"的例子中,那些由對角線和交叉線組成的features基本上能夠識別出大多數(shù)"X"所具有的重要特征。
這些features很有可能就是匹配任何含有字母"X"的圖中字母X的四個角和它的中心。那么具體到底是怎么匹配的呢?如下:
看到這里是不是有了一點頭目呢。但其實這只是第一步,你知道了這些Features是怎么在原圖上面進行匹配的。但是你還不知道在這里面究竟進行的是怎樣的數(shù)學(xué)計算,比如這個下面3*3的小塊到底干了什么?
接下來就跟進介紹里面的數(shù)學(xué)操作,也就是我們常說的“卷積”操作。
卷積(Convolution)
當給你一張新的圖時,CNN并不能準確地知道這些features到底要匹配原圖的哪些部分,所以它會在原圖中每一個可能的位置進行嘗試。這樣在原始整幅圖上每一個位置進行匹配計算,我們相當于把這個feature變成了一個過濾器。這個我們用來匹配的過程就被稱為卷積操作,這也就是卷積神經(jīng)網(wǎng)絡(luò)名字的由來。
這個卷積操作背后的數(shù)學(xué)知識其實非常的簡單。要計算一個feature和其在原圖上對應(yīng)的某一小塊的結(jié)果,只需要簡單地將兩個小塊內(nèi)對應(yīng)位置的像素值進行乘法運算,然后將整個小塊內(nèi)乘法運算的結(jié)果累加起來,最后再除以小塊內(nèi)像素點總個數(shù)即可。如果兩個像素點都是白色(也就是值均為1),那么1*1 = 1,如果均為黑色,那么(-1)*(-1) = 1。不管哪種情況,每一對能夠匹配上的像素,其相乘結(jié)果為1。類似地,任何不匹配的像素相乘結(jié)果為-1。如果一個feature(比如n*n)內(nèi)部所有的像素都和原圖中對應(yīng)一小塊(n*n)匹配上了,那么它們對應(yīng)像素值相乘再累加就等于n2,然后除以像素點總個數(shù)n2,結(jié)果就是1。同理,如果每一個像素都不匹配,那么結(jié)果就是-1。具體過程如下:
對于中間部分,也是一樣的操作:
最后整張圖算完,大概就像下面這個樣子:
然后換用其他feature進行同樣的操作,最后得到的結(jié)果就是這樣了:
為了完成我們的卷積,我們不斷地重復(fù)著上述過程,將feature和圖中每一塊進行卷積操作。最后通過每一個feature的卷積操作,我們會得到一個新的二維數(shù)組。這也可以理解為對原始圖像進行過濾的結(jié)果,我們稱之為feature map,它是每一個feature從原始圖像中提取出來的“特征”。其中的值,越接近為1表示對應(yīng)位置和feature的匹配越完整,越是接近-1,表示對應(yīng)位置和feature的反面匹配越完整,而值接近0的表示對應(yīng)位置沒有任何匹配或者說沒有什么關(guān)聯(lián)。
這樣我們的原始圖,經(jīng)過不同feature的卷積操作就變成了一系列的feature map。我們可以很方便,直觀地將這整個操作視為一個單獨的處理過程。在CNN中,我們稱之為卷積層(convolution layer),這樣你可能很快就會想到后面肯定還有其他的layer。沒錯,后面會提到。我們可以將卷積層看成下面這個樣子:
因此可想而知,CNN其實做的操作也沒什么復(fù)雜的。但是盡管我們能夠以這一點篇幅就描述了CNN的工作,其內(nèi)部的加法,乘法和除法操作的次數(shù)其實會增加地很快。從數(shù)學(xué)的角度來說,它們會隨著圖像的大小,每一個filter的大小和filter的數(shù)目呈線性增長。由于有這么多因素的影響,很容易使得這個問題的計算量變得相當?shù)凝嫶?,這也難怪很多微處理器制造商現(xiàn)在都在生產(chǎn)制造專業(yè)的芯片來跟上CNN計算的需求。
池化(Pooling)
CNN中使用的另一個有效的工具被稱為“池化(Pooling)”。池化可以將一幅大的圖像縮小,同時又保留其中的重要信息。池化背后的數(shù)學(xué)頂多也就是小學(xué)二年級水平。它就是將輸入圖像進行縮小,減少像素信息,只保留重要信息。通常情況下,池化都是2*2大小,比如對于max-pooling來說,就是取輸入圖像中2*2大小的塊中的最大值,作為結(jié)果的像素值,相當于將原始圖像縮小了4倍。(注:同理,對于average-pooling來說,就是取2*2大小塊的平均值作為結(jié)果的像素值。)
對于本文的這個例子,池化操作具體如下:
不足的外面補"0":
經(jīng)過最大池化操作(比如2*2大?。┲?,一幅圖就縮小為原來的四分之一了:
然后對所有的feature map執(zhí)行同樣的操作,得到如下結(jié)果:
因為最大池化(max-pooling)保留了每一個小塊內(nèi)的最大值,所以它相當于保留了這一塊最佳的匹配結(jié)果(因為值越接近1表示匹配越好)。這也就意味著它不會具體關(guān)注窗口內(nèi)到底是哪一個地方匹配了,而只關(guān)注是不是有某個地方匹配上了。這也就能夠看出,CNN能夠發(fā)現(xiàn)圖像中是否具有某種特征,而不用在意到底在哪里具有這種特征。這也就能夠幫助解決之前提到的計算機逐一像素匹配的死板做法。
當對所有的feature map執(zhí)行池化操作之后,相當于一系列輸入的大圖變成了一系列小圖。同樣地,我們可以將這整個操作看作是一個操作,這也就是CNN中的池化層(pooling layer),如下:
通過加入池化層,可以很大程度上減少計算量,降低機器負載。
Normalization
激活函數(shù)Relu (Rectified Linear Units)
這是一個很小但是很重要的操作,叫做Relu(Rectified Linear Units),或者修正線性單元。它的數(shù)學(xué)公式也很簡單:
![][01]
[01]:http://latex.codecogs.com/png.latex?f(x)%20=%20max(0,%20x)
對于輸入的負值,輸出全為0,對于正值,原樣輸出。關(guān)于其功能,更多詳見 這里。
下面我們看一下本文的離例子中relu激活函數(shù)具體操作:
最后,對整幅圖操作之后,結(jié)果如下:
同樣地,在CNN中,我們這一系列操作視為一個操作,那么就得到Relu Layer,如下:
Deep Learning
最后,我們將上面所提到的卷積,池化,激活放在一起,就是下面這個樣子:
然后,我們加大網(wǎng)絡(luò)的深度,增加更多的層,就得到深度神經(jīng)網(wǎng)絡(luò)了:
然后在不同的層,我們進行可視化,就可以看到本文開頭提到的先驗知識里面的結(jié)果了:
全連接層(Fully connected layers)
根據(jù)結(jié)果判定為"X":
在這個過程中,我們定義這一系列操作為”全連接層“(Fully connected layers):
全連接層也能夠有很多個,如下:
【綜合上述所有結(jié)構(gòu)】
這一整個過程,從前到后,被稱作”前向傳播“,得到一組輸出,然后通過反向傳播來不斷糾正錯誤,進行學(xué)習(xí)。
反向傳播 (Backpropagation)
此處數(shù)學(xué)原理可以參見:深度學(xué)習(xí) —— 反向傳播理論推導(dǎo).
Gradient Descent Optimizer
Hyperparameters
Application
Learn more
If you'd like to dig deeper into deep learning, check out my Demystifying Deep Learning post. I also recommend the notes from the Stanford CS 231 course by Justin Johnson and Andrej Karpathy that provided inspiration for this post, as well as the writings of Christopher Olah, an exceptionally clear writer on the subject of neural networks.
If you are one who loves to learn by doing, there are a number of popular deep learning tools available. Try them all! And then tell us what you think.
Caffe
CNTK
Deeplearning4j
TensorFlow
Theano
Torch
Many others
I hope you've enjoyed our walk through the neighborhood of Convolutional Neural Networks. Feel free to start up a conversation.
本文重點在前面的具體操作部分,所以后面的部分沒有細說,只是帶過了,如有必要,后期會逐漸完善,謝謝!
Reference:
(注:感謝您的閱讀,希望本文對您有所幫助。如果覺得不錯歡迎分享轉(zhuǎn)載,但請先點擊 這里 獲取授權(quán)。本文由 版權(quán)印 提供保護,禁止任何形式的未授權(quán)違規(guī)轉(zhuǎn)載,謝謝!)