CNN笔记:通俗理解卷积神经网络
通俗理解卷積神經(jīng)網(wǎng)絡(luò)(cs231n與5月dl班課程筆記)
http://blog.csdn.net/v_july_v/article/details/51812459
1 前言
? ? 2012年我在北京組織過8期machine learning讀書會(huì),那時(shí)“機(jī)器學(xué)習(xí)”非常火,很多人都對其抱有巨大的熱情。當(dāng)我2013年再次來到北京時(shí),有一個(gè)詞似乎比“機(jī)器學(xué)習(xí)”更火,那就是“深度學(xué)習(xí)”。
? ? 本博客內(nèi)寫過一些機(jī)器學(xué)習(xí)相關(guān)的文章,但上一篇技術(shù)文章“LDA主題模型”還是寫于2014年11月份,畢竟自2015年開始創(chuàng)業(yè)做在線教育后,太多的雜事、瑣碎事,讓我一直想再寫點(diǎn)技術(shù)性文章但每每恨時(shí)間抽不開。然由于公司在不斷開機(jī)器學(xué)習(xí)、深度學(xué)習(xí)等相關(guān)的在線課程,耳濡目染中,總會(huì)順帶學(xué)習(xí)學(xué)習(xí)。
? ? 我雖不參與講任何課程(公司的所有在線課程都是由目前講師團(tuán)隊(duì)的17位講師講),但依然可以用最最小白的方式 把一些初看復(fù)雜的東西抽絲剝繭的通俗寫出來。這算重寫技術(shù)博客的價(jià)值所在。
? ? 在dl中,有一個(gè)很重要的概念,就是卷積神經(jīng)網(wǎng)絡(luò)CNN,基本是入門dl必須搞懂的東西。本文基本根據(jù)斯坦福的機(jī)器學(xué)習(xí)公開課、cs231n、與七月在線寒老師講的5月dl班第4次課CNN與常用框架視頻所寫,是一篇課程筆記。本只是想把重點(diǎn)放在其卷積計(jì)算具體是怎么計(jì)算怎么操作的,但后面不斷補(bǔ)充,故寫成了關(guān)于卷積神經(jīng)網(wǎng)絡(luò)的通俗導(dǎo)論性的文章。有何問題,歡迎不吝指正。
2 人工神經(jīng)網(wǎng)絡(luò)
2.1 神經(jīng)元
? ??神經(jīng)網(wǎng)絡(luò)由大量的節(jié)點(diǎn)(或稱“神經(jīng)元”、“單元”)和相互連接而成。每個(gè)神經(jīng)元接受輸入的線性組合,進(jìn)行非線性變換(亦稱激活函數(shù)activation function)后輸出。每兩個(gè)節(jié)點(diǎn)之間的連接代表加權(quán)值,稱之為權(quán)重(weight)。不同的權(quán)重和激活函數(shù),則會(huì)導(dǎo)致神經(jīng)網(wǎng)絡(luò)不同的輸出。
? ??舉個(gè)手寫識別的例子,給定一個(gè)未知數(shù)字,讓神經(jīng)網(wǎng)絡(luò)識別是什么數(shù)字。此時(shí)的神經(jīng)網(wǎng)絡(luò)的輸入由一組被輸入圖像的像素所激活的輸入神經(jīng)元所定義。在通過激活函數(shù)進(jìn)行非線性變換后,神經(jīng)元被激活然后被傳遞到其他神經(jīng)元。重復(fù)這一過程,直到最后一個(gè)輸出神經(jīng)元被激活。從而識別當(dāng)前數(shù)字是什么字。
? ? 神經(jīng)網(wǎng)絡(luò)的每個(gè)神經(jīng)元/單元如下
? ? 類似wx + b的形式,其中
- a1~an為輸入向量,當(dāng)然,也常用x1~xn表示輸入
- w1~wn為權(quán)重
- b為偏置bias
- f 為激活函數(shù)
- t 為輸出
? ? 如果只是上面這樣一說,估計(jì)以前沒接觸過的十有八九又必定迷糊了。事實(shí)上,在20世紀(jì)50/60年代,上述簡單神經(jīng)元被稱之為感知機(jī),可以把感知機(jī)理解為一個(gè)根據(jù)不同因素、以及各個(gè)因素的重要性程度而做決策的模型。
? ? 舉個(gè)例子,這周末北京有一草莓音樂節(jié),那去不去呢?決定你是否去有3個(gè)因素,這三個(gè)因素可以對應(yīng)三個(gè)輸入,分別用x1、x2、x3表示,此外,這三個(gè)因素對做決策的影響程度不一樣,各自的影響程度用權(quán)重w1、w2、w3表示。一般來說,音樂節(jié)的演唱嘉賓會(huì)非常影響你去不去,唱得好的前提下 即便天氣不好、沒人陪同都可忍受,但如果唱得不好還不如你上臺唱呢。所以,我們可以如下表示:
- x1:是否有喜歡的演唱嘉賓。x1 = 1 你喜歡這些嘉賓,x1 = 0 你不喜歡這些嘉賓。嘉賓因素的權(quán)重w1 = 5
- x2:天氣好壞。x2 = 1 天氣好,x2 = 0 天氣不好。天氣權(quán)重w2 = 2。
- x3:是否有人陪你同去。x3 = 1 有人陪你同去,x2 = 0 沒人陪你同去。是否有陪同的權(quán)重w3 = 3。
2.2 激活函數(shù)
? ? 常用的激活函數(shù)有sigmoid、tanh、relu等等,前兩者sigmoid/tanh比較常見于全鏈接層,后者relu常見于卷積層。這里先簡要介紹下最基礎(chǔ)的sigmoid函數(shù)(btw,在本博客中SVM那篇文章開頭有提過)。
? ??sigmoid的函數(shù)表達(dá)式如下
? ? 其中z是一個(gè)線性組合,比如z可以等于:w0 + w1*x1 + w2*x2。通過代入很大的正數(shù)或很小的負(fù)數(shù)到函數(shù)中可知,g(z)結(jié)果趨近于0或1。
? ? 因此,sigmoid函數(shù)的圖形表示如下:
? ? 也就是說, sigmoid函數(shù)的 功能是相當(dāng)于把一個(gè)實(shí)數(shù)壓縮至0到1之間。輸入非常大的正數(shù)時(shí),輸出結(jié)果會(huì)接近1,而輸入非常大的負(fù)數(shù)時(shí),則會(huì)得到接近0的結(jié)果。壓縮至0到1有何用處呢?用處是這樣一來變可以把激活函數(shù)看作一種“分類的概率”,比如激活函數(shù)的輸出為0.9的話便可以解釋為90%的概率為正樣本。
2.3 神經(jīng)網(wǎng)絡(luò)
? ? 將下圖的這種單個(gè)神經(jīng)元
? ? 組織在一起,便形成了神經(jīng)網(wǎng)絡(luò)。下圖便是一個(gè)三層神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)
? ? 上圖中最左邊的原始輸入信息稱之為輸入層,最右邊的神經(jīng)元稱之為輸出層(上圖中輸出層只有一個(gè)神經(jīng)元),中間的叫隱藏層。
? ??啥叫輸入層、輸出層、隱藏層呢?
- 輸入層(Input layer),眾多神經(jīng)元(Neuron)接受大量非線形輸入訊息。輸入的訊息稱為輸入向量。
- 輸出層(Output layer),訊息在神經(jīng)元鏈接中傳輸、分析、權(quán)衡,形成輸出結(jié)果。輸出的訊息稱為輸出向量。
- 隱藏層(Hidden layer),簡稱“隱層”,是輸入層和輸出層之間眾多神經(jīng)元和鏈接組成的各個(gè)層面。如果有多個(gè)隱藏層,則意味著多個(gè)激活函數(shù)。
? ? 同時(shí),每一層都可能由單個(gè)或多個(gè)神經(jīng)元組成,每一層的輸出將會(huì)作為下一層的輸入數(shù)據(jù)。比如下圖中間隱藏層來說,隱藏層的3個(gè)神經(jīng)元a1、a2、a3皆各自接受來自多個(gè)不同權(quán)重的輸入,接著,a1、a2、a3又在自身各自不同權(quán)重的影響下 成為的輸出層的輸入,最終由輸出層輸出最終結(jié)果。
? ? 上圖(注:圖引自斯坦福機(jī)器學(xué)習(xí)公開課)中
- 表示第j層第i個(gè)單元的激活函數(shù)
- 表示從第j層映射到第j+1層的控制函數(shù)的權(quán)重矩陣?
? ? 此外,上文中講的都是一層隱藏層,但實(shí)際中也有多層隱藏層的,即輸入層和輸出層中間夾著數(shù)層隱藏層,層和層之間是全連接的結(jié)構(gòu),同一層的神經(jīng)元之間沒有連接。
3 卷積神經(jīng)網(wǎng)絡(luò)之層級結(jié)構(gòu)
? ?cs231n課程里給出了卷積神經(jīng)網(wǎng)絡(luò)各個(gè)層級結(jié)構(gòu),如下圖
? ? 上圖中CNN要做的事情是:給定一張圖片,是車還是馬未知,是什么車也未知,現(xiàn)在需要模型判斷這張圖片里具體是一個(gè)什么東西,總之輸出一個(gè)結(jié)果:如果是車 那是什么車
? ? 所以
- 最左邊是數(shù)據(jù)輸入層,對數(shù)據(jù)做一些處理,比如去均值(把輸入數(shù)據(jù)各個(gè)維度都中心化為0,避免數(shù)據(jù)過多偏差,影響訓(xùn)練效果)、歸一化(把所有的數(shù)據(jù)都?xì)w一到同樣的范圍)、PCA/白化等等。CNN只對訓(xùn)練集做“去均值”這一步。
? ? 中間是
- CONV:卷積計(jì)算層,線性乘積 求和。
- RELU:激勵(lì)層,上文2.2節(jié)中有提到:ReLU是激活函數(shù)的一種。
- POOL:池化層,簡言之,即取區(qū)域平均或最大。
? ? 最右邊是
- FC:全連接層
4 CNN之卷積計(jì)算層
4.1 什么是卷積
首先,我們來了解下什么是卷積操作。 對圖像(不同的數(shù)據(jù)窗口數(shù)據(jù))和濾波矩陣(一組固定的權(quán)重:因?yàn)槊總€(gè)神經(jīng)元的權(quán)重固定,所以又可以看做一個(gè)恒定的濾波器filter)做內(nèi)積(逐個(gè)元素相乘再求和)的操作就是所謂的『卷積』操作,也是卷積神經(jīng)網(wǎng)絡(luò)的名字來源。 比如下圖中,圖中左邊部分是原始輸入數(shù)據(jù),圖中中間部分是濾波器filter,圖中右邊是輸出的新的二維數(shù)據(jù)。分解下上圖 對應(yīng)位置上是數(shù)字先乘后相加 = 中間濾波器filter與數(shù)據(jù)窗口做內(nèi)積,其具體計(jì)算過程則是:4*0 + 0*0 + 0*0 + 0*0 + 0*1 + 0*1 + 0*0 + 0*1 + -4*2 = -8
4.2 圖像上的卷積
在計(jì)算過程中,輸入是一定區(qū)域大小(width*height)的數(shù)據(jù),和濾波器filter(一組固定的權(quán)重)做內(nèi)積后等到新的二維數(shù)據(jù)。 對于下圖中,左邊是圖像輸入,中間部分就是濾波器filter(一組固定的權(quán)重),不同的濾波器filter會(huì)得到不同的輸出數(shù)據(jù),比如輪廓、顏色深淺。相當(dāng)于如果想提取圖像的不同特征,則用不同的濾波器filter,提取想要的關(guān)于圖像的特定信息:輪廓或顏色深淺。? ? 如下圖所示
??
4.3 cs231d的動(dòng)態(tài)卷積圖? ??
cs231n課程中,給了一張動(dòng)圖,網(wǎng)址是:http://cs231n.github.io/assets/conv-demo/index.html 如果初看此圖,可能不一定能立馬理解啥意思,但結(jié)合上文的內(nèi)容后,理解這個(gè)動(dòng)圖已經(jīng)不是很困難的事情。 下述動(dòng)圖中,左邊是輸入,中間部分是兩個(gè)不同的濾波器Filter w0、Filter w1,最右邊則是兩個(gè)不同的輸出。? ? 隨著左邊數(shù)據(jù)窗口的平移滑動(dòng),濾波器Filter w0對不同的局部數(shù)據(jù)進(jìn)行卷積計(jì)算。
? ? 值得一提的是:
- 左邊數(shù)據(jù)在變化,每次濾波器都是針對某一局部的數(shù)據(jù)窗口進(jìn)行卷積,這就是所謂的CNN中的局部感知機(jī)制。
- 與此同時(shí),數(shù)據(jù)窗口滑動(dòng),但中間濾波器Filter w0的權(quán)重(即每個(gè)神經(jīng)元連接數(shù)據(jù)窗口的的權(quán)重)是固定不變的,這個(gè)權(quán)重不變即所謂的CNN中的參數(shù)共享機(jī)制。
? ? 我第一次看到上面這個(gè)動(dòng)態(tài)圖的時(shí)候,只覺得很炫,另外就是據(jù)說“相乘后想加”,但到底具體是個(gè)怎么相乘后想加的過程?則無法一眼看出,網(wǎng)上也沒有一目了然的計(jì)算過程。本文來細(xì)究下。
? ? 首先,我們來分解下上述動(dòng)圖,如下圖
? ? 接著,我們細(xì)究下上圖的具體計(jì)算過程。即上圖中的輸出結(jié)果-1具體是怎么計(jì)算得到的呢?其實(shí),類似wx + b,w對應(yīng)濾波器Filter w0,x對應(yīng)不同的數(shù)據(jù)窗口,b對應(yīng)Bias b0,相當(dāng)于濾波器Filter w0與一個(gè)個(gè)數(shù)據(jù)窗口相乘再求和后,最后加上Bias b0得到輸出結(jié)果-1,如下過程所示:
-1*?0?+?0*0?+?1*0?
+
0*0?+?1*0?+?0*1
+
0*0?+?-1*2?+?-1*0
+
0*0?+?-1*0?+?-1*0
+
-1*0?+?1*0?+?-1*0
+
0*0?+?-1*0?+?1*1
+
0*0?+?-1*0?+?1*0
+
0*0?+?0*1?+?-1*0
+
0*0?+?1*0?+?-1*1
+
?
1
=
-1
? ? 然后濾波器Filter w0固定不變,數(shù)據(jù)窗口向右移動(dòng)2步,繼續(xù)做內(nèi)積計(jì)算,得到4的輸出結(jié)果
? ? 最后,換做另外一個(gè)不同的濾波器Filter w1、不同的偏置Bias b1,再跟圖中最左邊的數(shù)據(jù)窗口做卷積,可得到另外一個(gè)不同的輸出。
5 CNN之激勵(lì)層與池化層
5.1 ReLU激勵(lì)層
? ? 2.2節(jié)介紹了激活函數(shù)sigmoid,但實(shí)際梯度下降中,容易飽和和終止梯度傳遞,且沒有0中心化。咋辦呢,可以嘗試另外一個(gè)激活函數(shù):ReLU,其圖形表示如下
? ? ReLU的優(yōu)點(diǎn)是收斂快,求梯度簡單。
5.2 池化pool層
? ? 前頭說了,池化,簡言之,即取區(qū)域平均或最大,如下圖所示
? ? 上圖所展示的是取區(qū)域最大,即上圖左邊部分中 左上角2x2的矩陣中6最大,右上角2x2的矩陣中8最大,左下角2x2的矩陣中3最大,右下角2x2的矩陣中4最大,所以得到上圖右邊部分的結(jié)果:6 8 3 4。很簡單不是?
6 后記
? ? 本文基本上邊看5月dl班寒講的CNN視頻邊做筆記,之前斷斷續(xù)續(xù)看過不少CNN相關(guān)的資料(包括cs231n),但今晚看過視頻之后,才系統(tǒng)了解CNN到底是個(gè)什么東西,作為聽眾 寒講的真心贊、清晰。然后在寫CNN相關(guān)的東西時(shí),發(fā)現(xiàn)一些前置知識(比如神經(jīng)元、多層神經(jīng)網(wǎng)絡(luò)等也需要介紹下),包括CNN的其它層次機(jī)構(gòu)(比如激勵(lì)層),所以本文本只想簡要介紹下卷積操作的,但考慮到知識之間的前后關(guān)聯(lián),所以越寫越長,便成本文了。
? ? 此外,在寫作本文的過程中,請教了我們講師團(tuán)隊(duì)里的寒、馮兩位,感謝他們。
? ? July、二零一六年七月三日晚更新。
7 參考文獻(xiàn)
總結(jié)
以上是生活随笔為你收集整理的CNN笔记:通俗理解卷积神经网络的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ubuntu桌面版与服务器版的区别
- 下一篇: 微软人工智能平台开源:利用《我的世界》测