卷積神經(jīng)網(wǎng)絡(luò)(CNN)基本原理詳解(無數(shù)學(xué)公式版本)

首先要明確,卷積神經(jīng)網(wǎng)絡(luò)【CNN】(以下用CNN代稱)設(shè)計(jì)的初衷是為了讓計(jì)算機(jī)處理和識(shí)別圖像,目前應(yīng)用于幾乎所有的涉及機(jī)器視覺的領(lǐng)域,它基于提取特征,特征匹配的原理,來識(shí)別圖像或者其他任何能夠轉(zhuǎn)化成計(jì)算機(jī)可認(rèn)讀數(shù)據(jù)的事務(wù)。
首先,CNN的基本運(yùn)行過程如下圖所示,這里我們以【識(shí)別X和O】為例

我們輸入一個(gè)圖片【二維】交給CNN,由CNN自己運(yùn)算和識(shí)別圖片內(nèi)容,最后給出一個(gè)結(jié)果,此時(shí)對于我們來說,CNN的運(yùn)算過程是黑盒(即我們并不清楚CNN到底運(yùn)算出了怎樣的結(jié)果,又是基于什么標(biāo)準(zhǔn)判斷出來的)我們只能判斷CNN給出的結(jié)果正確與否。

對于圖像識(shí)別,我們要求它的精準(zhǔn)度高,
魯棒性強(qiáng)(物體在受到干擾時(shí)仍保持自身性質(zhì)不變的特性)

例如上圖,不論圖片是平移,縮放,旋轉(zhuǎn),加粗,都不應(yīng)該影響CNN最后得出的結(jié)果,但是這對于人類來講很容易,可是計(jì)算機(jī)只能識(shí)別數(shù)字,對于計(jì)算機(jī)而言,變化之后的兩個(gè)圖像是兩個(gè)不相同的矩陣,計(jì)算機(jī)該如何識(shí)別?

我們參考人腦識(shí)別物體的原理,即基于物體特征的識(shí)別,CNN的原理便是如此,這里為了講解方便我們以識(shí)別X為例,圖片是黑白圖片(即單通道,彩色圖片是RGB三通道)

我們不難發(fā)現(xiàn),X具有三個(gè)明顯的特征,
一、自左上向右下的斜線(圖中綠色框標(biāo)出的)
二、自左下向右上的斜線(圖中紫色框標(biāo)出的)
三、中間的 “ × ” 形(圖中橙色框標(biāo)出)
那么我們很容易想到,讓CNN學(xué)習(xí)這三個(gè)特征,只要圖片內(nèi)容符合這三個(gè)特征,就把這張圖片識(shí)別為【X】。
我們把這些特征提取出來,以矩陣的形式表示,我們就把這些 “ 特征 ” 叫做【卷積核】,一般我們選擇的卷積核大小為3x3。
(ps:在實(shí)際應(yīng)用中,卷積核是由CNN自學(xué)習(xí)得來,或者由科學(xué)家預(yù)訓(xùn)練得到,這里為了講解方便,我們指定了以上三個(gè)卷積核)

接下來就是計(jì)算的第一步:卷積。


這一步操作,用卷積核與圖片對應(yīng)的區(qū)域相乘,如果卷積核與圖片對應(yīng)的區(qū)域完全相符,我們很容易計(jì)算,這時(shí)得到的矩陣是全1矩陣

我們將矩陣中各項(xiàng)的值求和,或者求和之后求平均,這里我們采用求和之后求平均的方法,顯然結(jié)果為1

3x3的卷積核從圖像的左上角開始進(jìn)行計(jì)算,一個(gè)像素塊一個(gè)像素塊移動(dòng)(移動(dòng)的距離稱為【步數(shù)】可自行設(shè)置,一般采用1或2)邊緣不夠3x3的采用補(bǔ)0或其他方法,將整個(gè)圖片掃描完成之后,生成一個(gè)特征圖(feature map)稱為【特征圖樣】

可以看到,右邊的特征圖樣基本保留了圖像中與卷積核相對應(yīng)的特征,這里是向右下斜線的卷積核,得出的特征圖樣也基本保留了向右下的特征。
ps:如果圖像并不具有卷積核所對應(yīng)的特征,得出的特征圖樣是無規(guī)律的

在第一步卷積之后,就是運(yùn)行觸發(fā)函數(shù)了,目前普遍采用的是ReLU函數(shù)(Rectified Linear Units 線性重整單元)其作用是將特征矩陣中小于0的值(即負(fù)值)置0。方便之后矩陣相關(guān)的運(yùn)算。

前面我們說了,圖像識(shí)別要求高精度,但同時(shí)也要求低時(shí)延,這里就有一個(gè)問題,我們只輸入了一個(gè)【x】的圖像,在第一步卷積完成之后,生成了三個(gè)圖像,在之后要對這三個(gè)圖像進(jìn)行運(yùn)算,計(jì)算量變成了三倍!
而在實(shí)際的應(yīng)用中,卷積核的數(shù)量很多,圖像也并非是黑白的,計(jì)算負(fù)擔(dān)會(huì)非常大,甚至是在第一步卷積之后就接近百倍甚至百萬倍的計(jì)算量。

而為了解決這一問題,便有了【池化】又叫 “ 下采樣 ”(pooling)這一步。
先看下圖,我們把圖中偶數(shù)列和偶數(shù)行的像素去掉,并不影響人類識(shí)別這是一只鳥,因?yàn)閳D片的特征還在,只是變得模糊而已

基于這樣的原理,我們對卷積過后的特征圖樣進(jìn)行池化。這里的池化并不會(huì)影響最終的結(jié)果,因?yàn)镃NN的判斷是基于特征的,只要將特征保留下來即可,池化反而可以有效的減少計(jì)算量。
通常我們有兩種池化方法,分為最大池化和平均池化,基本原理是用一個(gè)值來代表一片區(qū)域特征,最大池化和平均池化顧名思義,不再贅述。

池化之后我們得到的特征圖樣就被縮小了,但仍然保留了明顯的特征,(這里采用最大池化)

前面提到的三步,卷積運(yùn)算,ReLU函數(shù),池化,是可以疊加的,一般的,每一次卷積運(yùn)算之后都要進(jìn)行ReLU和池化,在多次運(yùn)算之后,我們會(huì)得到這樣的簡潔但特征明顯的特征圖樣

之后進(jìn)行最后一步,【全相連】,在這一步中,我們將得到的所有特征圖樣變換為一維向量,并且每一個(gè)向量都有其各自的權(quán)重,注意,這里的權(quán)重是CNN通過自學(xué)習(xí)和科學(xué)家的調(diào)參所得。


將每一個(gè)向量的值與其權(quán)重相乘并求和,注意:(計(jì)算得出的向量值是如圖所示的,一張圖片計(jì)算出來一個(gè)值,而權(quán)重是不同的,CNN會(huì)將X的權(quán)重表帶入到如圖的向量值中計(jì)算,再將O的權(quán)重表帶入到如圖的向量值中計(jì)算,并判斷誰的概率更大,即為最終結(jié)果)

如上圖所示是X的權(quán)重表,可見在向量值為1的位置X的權(quán)重表權(quán)重較大,故計(jì)算出X的概率更大,判斷圖像為X

至此,CNN的運(yùn)算過程就結(jié)束了,在實(shí)際應(yīng)用中,采用多層卷積和多層全相聯(lián)模型,一個(gè)完整的CNN過程如下


這里就有很多的問題出現(xiàn)了,你怎么知道卷積核如何選擇?選多少卷積核?選多大的卷積核?就拿人臉來說,你怎么知道選哪些特征就能讓機(jī)器成功識(shí)別呢,最后全相聯(lián)時(shí)候的權(quán)重又是哪里來的呢?
這時(shí)候就要介紹【反向傳播算法】(Backpropagation)用來優(yōu)化卷積神經(jīng)網(wǎng)絡(luò)的結(jié)果。

上圖,是一個(gè)誤差率的計(jì)算,假設(shè)輸入的圖片本身就是X,CNN判斷它有0.92概率是X,那么就有0.08的誤差;輸入的圖片不是O,CNN計(jì)算有0.51的可能是O,誤差就是0.51,將他們加和得到一個(gè)總的誤差值0.59。
注意:這里只是計(jì)算誤差值,并非說明損失函數(shù)就是如此計(jì)算的
為什么采用反向而不是正向呢?我們都知道,CNN的運(yùn)算過程是及其復(fù)雜的,它在運(yùn)算中提取出的特征是我們所不可見的,而且人類是無法理解的,第一步中的一個(gè)特征圖樣很可能影響到了下一步中幾百萬個(gè)特征圖樣的結(jié)果,正向調(diào)整難度很大,調(diào)整之后影響可能很小,也可能非常大,所以我們采用反向傳播來優(yōu)化機(jī)器計(jì)算結(jié)果。
例如,你給CNN一張狗的圖片,但是它計(jì)算出來的結(jié)果是貓,這時(shí)候就要人為的去修改最后一步全相聯(lián)中的參數(shù),讓機(jī)器的誤差盡可能小,并通過對權(quán)重的調(diào)整,繼而反饋到前面的計(jì)算結(jié)果的權(quán)重,這個(gè)反饋的過程是由卷積神經(jīng)網(wǎng)絡(luò)的自學(xué)習(xí)功能完成的,通過不斷地訓(xùn)練,CNN自己就會(huì)知道采用哪些卷積核,哪些參數(shù)可以得到最優(yōu)結(jié)果,這也是卷積神經(jīng)網(wǎng)絡(luò)厲害的地方,機(jī)器具有學(xué)習(xí)功能。

本篇文章只作為學(xué)習(xí)筆記,若有錯(cuò)誤的地方還請各位指正。