AI芯片之卷積神經(jīng)網(wǎng)絡(luò)原理
卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Network,CNN)是一種前饋神經(jīng)網(wǎng)絡(luò),它的人工神經(jīng)元可以響應(yīng)一部分覆蓋范圍內(nèi)的周圍單元,對(duì)于大型圖像處理有出色表現(xiàn)。 它包括卷積層(convolutional layer)和池化層(pooling layer)。
對(duì)比:卷積神經(jīng)網(wǎng)絡(luò)、全連接神經(jīng)網(wǎng)絡(luò)
左圖:全連接神經(jīng)網(wǎng)絡(luò)(平面),組成:輸入層、激活函數(shù)、全連接層
右圖:卷積神經(jīng)網(wǎng)絡(luò)(立體),組成:輸入層、卷積層、激活函數(shù)、池化層、全連接層
在卷積神經(jīng)網(wǎng)絡(luò)中有一個(gè)重要的概念:深度
卷積層
卷積:在原始的輸入上進(jìn)行特征的提取。特征提取簡(jiǎn)言之就是,在原始輸入上一個(gè)小區(qū)域一個(gè)小區(qū)域進(jìn)行特征的提取,稍后細(xì)致講解卷積的計(jì)算過程。
上圖中,左方塊是輸入層,尺寸為32*32的3通道圖像。右邊的小方塊是filter,尺寸為5*5,深度為3。將輸入層劃分為多個(gè)區(qū)域,用filter這個(gè)固定尺寸的助手,在輸入層做運(yùn)算,最終得到一個(gè)深度為1的特征圖。
上圖中,展示出一般使用多個(gè)filter分別進(jìn)行卷積,最終得到多個(gè)特征圖。
上圖使用了6個(gè)filter分別卷積進(jìn)行特征提取,最終得到6個(gè)特征圖。將這6層疊在一起就得到了卷積層輸出的結(jié)果。
卷積不僅限于對(duì)原始輸入的卷積。藍(lán)色方塊是在原始輸入上進(jìn)行卷積操作,使用了6個(gè)filter得到了6個(gè)提取特征圖。綠色方塊還能對(duì)藍(lán)色方塊進(jìn)行卷積操作,使用了10個(gè)filter得到了10個(gè)特征圖。每一個(gè)filter的深度必須與上一層輸入的深度相等。
直觀理解卷積
以上圖為例:
第一次卷積可以提取出低層次的特征。
第二次卷積可以提取出中層次的特征。
第三次卷積可以提取出高層次的特征。
特征是不斷進(jìn)行提取和壓縮的,最終能得到比較高層次特征,簡(jiǎn)言之就是對(duì)原式特征一步又一步的濃縮,最終得到的特征更可靠。利用最后一層特征可以做各種任務(wù):比如分類、回歸等。
卷積計(jì)算流程
左區(qū)域的三個(gè)大矩陣是原式圖像的輸入,RGB三個(gè)通道用三個(gè)矩陣表示,大小為7*7*3。
Filter W0表示1個(gè)filter助手,尺寸為3*3,深度為3(三個(gè)矩陣);Filter W1也表示1個(gè)filter助手。因?yàn)榫矸e中我們用了2個(gè)filter,因此該卷積層結(jié)果的輸出深度為2(綠色矩陣有2個(gè))。
Bias b0是Filter W0的偏置項(xiàng),Bias b1是Filter W1的偏置項(xiàng)。
OutPut是卷積后的輸出,尺寸為3*3,深度為2。
計(jì)算過程:
輸入是固定的,filter是指定的,因此計(jì)算就是如何得到綠色矩陣。
第一步,在輸入矩陣上有一個(gè)和filter相同尺寸的滑窗,然后輸入矩陣的在滑窗里的部分與filter矩陣對(duì)應(yīng)位置相乘:
即與
對(duì)應(yīng)位置相乘后求和,結(jié)果為0
即與
對(duì)應(yīng)位置相乘后求和,結(jié)果為2
即與
對(duì)應(yīng)位置相乘后求和,結(jié)果為0
第二步,將3個(gè)矩陣產(chǎn)生的結(jié)果求和,并加上偏置項(xiàng),即0+2+0+1=3,因此就得到了輸出矩陣的左上角的3:
第三步,讓每一個(gè)filter都執(zhí)行這樣的操作,變可得到第一個(gè)元素:
第四步,滑動(dòng)窗口2個(gè)步長(zhǎng),重復(fù)之前步驟進(jìn)行計(jì)算
第五步,最終可以得到,在2個(gè)filter下,卷積后生成的深度為2的輸出結(jié)果:
思考:
①為什么每次滑動(dòng)是2個(gè)格子?
滑動(dòng)的步長(zhǎng)叫stride記為S。S越小,提取的特征越多,但是S一般不取1,主要考慮時(shí)間效率的問題。S也不能太大,否則會(huì)漏掉圖像上的信息。
②由于filter的邊長(zhǎng)大于S,會(huì)造成每次移動(dòng)滑窗后有交集部分,交集部分意味著多次提取特征,尤其表現(xiàn)在圖像的中間區(qū)域提取次數(shù)較多,邊緣部分提取次數(shù)較少,怎么辦?
一般方法是在圖像外圍加一圈0,細(xì)心的同學(xué)可能已經(jīng)注意到了,在演示案例中已經(jīng)加上這一圈0了,即+pad 1。 +pad n表示加n圈0.
③一次卷積后的輸出特征圖的尺寸是多少呢?
請(qǐng)計(jì)算上圖中Output=?
注意:在一層卷積操作里可以有多個(gè)filter,他們是尺寸必須相同。
卷積參數(shù)共享原則
在卷積神經(jīng)網(wǎng)絡(luò)中,有一個(gè)非常重要的特性:權(quán)值共享。
所謂的權(quán)值共享就是說,給一張輸入圖片,用一個(gè)filter去掃這張圖,filter里面的數(shù)就叫權(quán)重,這張圖每個(gè)位置是被同樣的filter掃的,所以權(quán)重是一樣的,也就是共享。
池化層
上圖顯示,池化就是對(duì)特征圖進(jìn)行特征壓縮,池化也叫做下采樣。選擇原來某個(gè)區(qū)域的max或mean代替那個(gè)區(qū)域,整體就濃縮了。下面演示一下pooling操作,需要制定一個(gè)filter的尺寸、stride、pooling方式(max或mean):
卷積神經(jīng)網(wǎng)絡(luò)的組成
卷積——激活——卷積——激活——池化——......——池化——全連接——分類或回歸
前向傳播與反向傳播
之前已經(jīng)講解了卷積層前向傳播過程,這里通過一張圖再回顧一下:
下面講解卷積層的反向傳播過程:
反向傳播的目的:更新參數(shù)w。因此要先算出dJ/dw。假設(shè)上一層會(huì)傳過來一個(gè)梯度dJ/dout,根據(jù)鏈?zhǔn)角髮?dǎo)法則,因此dJ/dw = dJ/dout * dout/dw =dJ/dout * x 。在計(jì)算機(jī)中方便為變量命名的緣故,將dJ/dout記為dout,dJ/dw記為dw,即圖中的情況。后面也用這個(gè)記號(hào)來講。
首先要清楚:dw 和 w 的尺寸是一樣的。一個(gè)點(diǎn)乘以一個(gè)區(qū)域還能得到一個(gè)區(qū)域。那么反向傳播過程就相當(dāng)于:用dout中的一個(gè)元素乘以輸入層劃窗里的矩陣便得到一個(gè)dw矩陣;然后滑動(dòng)滑窗,繼續(xù)求下一個(gè)dw,依次下去,最后將得到的多個(gè)dw相加,執(zhí)行 w = w - dw 就完成了反向傳播的計(jì)算。
上面的反向傳播可以更新一個(gè)filter中的參數(shù),還要求其他的filter。
下面用圖示來看一下2種不同的pooling過程——池化層的前向傳播:
在池化層進(jìn)行反向傳播時(shí),max-pooling和mean-pooling的方式也采用不同的方式。
對(duì)于max-pooling,在前向計(jì)算時(shí),是選取的每個(gè)2*2區(qū)域中的最大值,這里需要記錄下最大值在每個(gè)小區(qū)域中的位置。在反向傳播時(shí),只有那個(gè)最大值對(duì)下一層有貢獻(xiàn),所以將殘差傳遞到該最大值的位置,區(qū)域內(nèi)其他2*2-1=3個(gè)位置置零。具體過程如下圖,其中4*4矩陣中非零的位置即為前邊計(jì)算出來的每個(gè)小區(qū)域的最大值的位置
對(duì)于mean-pooling,我們需要把殘差平均分成2*2=4份,傳遞到前邊小區(qū)域的4個(gè)單元即可。具體過程如圖:
卷積網(wǎng)絡(luò)架構(gòu)實(shí)例
VGGNet深度更多,有很多卷積層和池化層。一個(gè)版本有16層,另一個(gè)版本有19層(較常用)。
VGGNet的特點(diǎn):
filter只有3*3的,意味著計(jì)算的特征較多,粒度更細(xì)。同時(shí)pooling的參數(shù)也有固定。
注意:傳統(tǒng)的卷積神經(jīng)網(wǎng)絡(luò)層數(shù)越多并以意味著效果更好。而在2016年推出了深度殘差網(wǎng)絡(luò)達(dá)到了152層。后續(xù)講介紹。
那么訓(xùn)練一個(gè)VGGNet有多少內(nèi)存開銷呢?
從圖可得知,訓(xùn)練過程中一張224*224*3的圖像會(huì)有138M個(gè)參數(shù)會(huì)占93MB的內(nèi)存。因此每個(gè)batch中圖像的數(shù)目應(yīng)該受內(nèi)存的約束,即 93*圖像數(shù)目<內(nèi)存總?cè)萘俊?/p>