卷積神經(jīng)網(wǎng)絡(luò)基礎(chǔ)知識復習

1.從最簡單的神經(jīng)網(wǎng)絡(luò)基本開始


X=[x1,x2,x3]T,是一個三維的樣本點

現(xiàn)在我們有一個4*3的權(quán)重矩陣W1

W1=[w11,w12,w13

? ? ? w21,w22,w23

? ? ? w31,w32,w33

? ? ? w41,w42,w43

? ? ? ? ]

由于y = WX,而W1是4*3的矩陣,X是3*1的矩陣,所以最后得出來的y是4*1的矩陣[y1,y2,y3,y4]T

可以看到對于權(quán)重矩陣的行數(shù),我們可以對應(yīng)理解為一個小濾波器

例如W1[0],就是W1中的第一個濾波器用來提取特征,這一行中的每一個權(quán)重都和輸入樣本的每一個維度,也就是神經(jīng)元結(jié)點相乘,假設(shè)第一層的濾波器W1有4層,那么就有4個濾波器,一共會產(chǎn)生4個輸出

同理我們再看從y到z的過程,最后輸出一個神經(jīng)元結(jié)點,因此第二層的濾波器只有1個濾波器,W2是一個一行的濾波器,且權(quán)重個數(shù)與y的神經(jīng)元個數(shù)相同W2 = 1*4

z = W2*y? ------> 1*4? ? ^? 4*1,最后得到1*1的單神經(jīng)元輸出。


我們回頭看邏輯回歸可以發(fā)現(xiàn),LR應(yīng)該算一個沒有隱藏層的最簡單的神經(jīng)網(wǎng)絡(luò)


而根據(jù)我們的知識知道這里面的一個一行四列的權(quán)重W是一個線性分類器,所以我們更正之前的說法,W應(yīng)該是多個線性分類器的疊加,如果W有n行則代表有n個線性分類器疊加在一起構(gòu)成n,而單純的線性疊加很難達到很好的效果,這也就是為什么后面會使用激活函數(shù)引入非線性因素(你可以想象成把之前的線性分類器邊界進行彎曲)同時,我之前所說的濾波器更多的時候使用在CNN之中,即Filter用來提取特征。



2.卷積神經(jīng)網(wǎng)絡(luò)

在理解卷積神經(jīng)網(wǎng)絡(luò)之前,我們需要先遷移性地理解一點,那就是,將所在層的通道數(shù)類比于1中的神經(jīng)元結(jié)點的個數(shù),把卷積核類比于1中的線性分類器個數(shù),我們知道有幾個分類器就會有多少輸出,所以在進行卷積神經(jīng)網(wǎng)絡(luò)的過程中,輸出結(jié)果與輸入的維度或者說通道數(shù)無關(guān),只與卷積核的個數(shù)有關(guān)。

假設(shè)我們有一張圖片作為輸入,我們知道它是三通道的,那么可以將這張圖片表示為W*H*3,實際上看源碼也知道圖片用ndarray格式保存的時候也是這種形式,然后假設(shè)我們有5個Kenel,那么我們實際的輸出與kenel的個數(shù)是相等的,即輸出了5張?zhí)卣鲌D,那么具體是什么工作的呢?

以R,G,B三通道為例,共有5個卷積核w1,w2,w3,w4,w5,那么與1中類似,我們先選取卷積核w1,注意這里有一個卷積核深度的概念,該層所有的卷積核深度等該層輸入的通道數(shù),可以理解為上面1中所說的w11,w12,w13.

以三通道來表示

我們的卷積核應(yīng)該定義深度,個數(shù),個數(shù)我們可以隨意設(shè)置,而深度必須保持與當前輸入的通道數(shù)一直

W=[w11,w12,w13

? ? ? w21,w22,w23

? ? ? w31,w32,w33

? ? ? w41,w42,w43

? ? ? ? ]

那么這里有4個卷積核,例如W1 = [w11,w12,w13]我們分別將這三個特征圖與每個通道進行卷積然后相加得到最終輸入即

y1 = w11*R+w12*G+w13*B

然后我們有4個卷積核,因此最終輸出的通道數(shù)為4.


類比:

通道數(shù)----->神經(jīng)元結(jié)點個數(shù),? ? ? ? 你可以把這些通道數(shù)想象成從上往下依次展開的

卷積核深度------->每一個線性分類器的特征W維度 ,? 你可以把每個通道對應(yīng)每個WIJ的過程想象成W*X的過程

卷積核個數(shù)---------->線性分類器個數(shù),? ? ? ? 你可以想象成到底有幾個分類器。


有了以上概念來一波立即推

當前輸入共有m個通道,那么我們應(yīng)該用多深的卷積核?

立即推m個通道對應(yīng)m個神經(jīng)元結(jié)點,就應(yīng)該有m個權(quán)重值,因此卷積核深度為m;


如果我用了n個卷積核,那么輸出多少個通道的特征圖?

立即推,n個卷積核對應(yīng)了n次卷積相加的過程,因此共有n個通道的輸出。

因此當我們定義模型的時候,我們只需要關(guān)心卷積核的個數(shù)是多少即可,因為卷積核的深度由當前的通道數(shù)決定,假設(shè)最后一層卷積層用到了M個卷積核,立即推,最后一層的深度為M,這也是深度學習的深度體現(xiàn)。


感知機與神經(jīng)網(wǎng)絡(luò)類比

現(xiàn)在讓來看一下卷積神經(jīng)網(wǎng)絡(luò)中一些常用的概念,和基本組成部件。

假設(shè)我們的輸入為(Width=W,Height=W,Depth=N)代表了N張長寬均為W的特征圖,我們的卷積層為(Kenel_size=F*F,Depth=N,Num=M),代表了M個深度為N的尺寸為F*F的卷積核,假定我們進行卷積操作的步長Stride = S,Padding為P,那么首先由N張?zhí)卣鲌D與一個卷積核的N層進行卷積操作得到新的邊長為W* =(W-F+2P)/S + 1(請牢記這個公式)的N張新特征圖,我們把這N張?zhí)卣鲌D按對應(yīng)位置相加得到一張完整的新特征圖,即完成了一個卷積核特征提取的操作,我們有M個卷積核,所以我們最終得到的輸出為

(Width=(W-F+2P)/S + 1,Height=(W-F+2P)/S + 1,Depth=M)


單個卷積核工作方式

之后再進行池化操作,一般采取最大池化,計算方式一樣,假設(shè)步長為1


最大池化

Padding

如果我們想使得輸出的特征圖尺寸與原特征圖尺寸一致,我們就可以使用padding,padding=1代表我們在原圖的周圍加上一圈0。

Tensorflow中有主要有兩種padding方式,“Same”和“Valid”,代表當濾波器或池化到邊界的時候是否自動補0,Same方式結(jié)果向上取整,例如我們的輸入邊長為5,步長為2,? ?5/2=2.5,向上取整得到3,則最終輸出一張3*3的特征圖。


池化層

池化層的作用就是減小特征圖的面積,使用最大池化,提取到的是特征圖中每一小塊區(qū)域中取值最大到的那個數(shù),一定程度上代表了提取出特征圖中的關(guān)鍵信息。例如我們只關(guān)心圖像的輪廓和紋理變化。

降低輸出規(guī)模,增加可解釋性;

光滑信息,避免丟失更多信息。


光滑原因解釋

對于沒有經(jīng)過最大池化的圖片,從三維角度來看,取值高高低低,而提取出的都是每塊區(qū)域中最大的值,相當于使得數(shù)據(jù)區(qū)域光滑。

而現(xiàn)在1個點就能代表以前的4個點,一定程度上代表增大了我們的感知野。

最大池化過程

此外還有平均池化,即取區(qū)域中的平均值,有點像均值濾波。


激活函數(shù)

sigmoid = \frac{1}{1+e^-x  }


sigmoid曲線


Relu = max(0,x)


Relu函數(shù)曲線


Tanh = \frac{e^x-e^-x  }{e^x+e^-x}


雙曲正切激活函數(shù)

softplus = \ln (1+e^-x)

LeakyRelu = 1(x<0)\frac{x}{a} +1(x\geq 0)x


Relu及其變種



FC層(全連接層)

在完成所有卷積層之后,將所有輸出特征圖扁平化展開成一個列向量


例如3張2*2的特征圖可以按順序展開成1個12個神經(jīng)元結(jié)點的輸出,然后我們用12個帶有12個參數(shù)的線性分類器,得到一個新的12個神經(jīng)元結(jié)點的FC層,最后根據(jù)我們的需要連接上一個softmax函數(shù)或者sigmoid函數(shù)即可。


正則化

L1 =?\alpha \sum_{\omega }\vert \omega  \vert

L2 =?\lambda \sum_{\omega }\omega ^2

與傳統(tǒng)機器學習方法一致,都是為了抑制模型復雜度。



損失函數(shù)

一般使用交叉熵損失函數(shù)

對于sigmoid函數(shù)直接帶入以下交叉熵損失函數(shù)中

CrossEntropy = -[y\ln \hat{y}  +(1-y)\ln (1-\hat{y} ) ]

y代表標簽值,y^代表預測值

對于softmax,由于是多分類,假設(shè)有1,2,3,4,5共5個分類,我們的輸出為output=[0.1,????0.2,????0.4? ? 0.1? ? 0.2]

由于我們采用的one-hot編碼,所以當我們看某一類時,其它的類別都為0

例如我們要算第3類時的損失函數(shù)

Loss = -[0*In0.1+0*In0.2+1*In0.4+0*In0.1+0*In0.2]

? ? ? ? ?= -In0.4

Loss = -\frac{1}{n} \sum_{i}^n \ln y_{i}


反向傳播

這里先補充一個概念就是張量,我們可以把張量理解為數(shù)字容器;

0維張量:一個數(shù)

1維張量:一個數(shù)組

2維張量:一個矩陣

3維張量:以特征圖來說就是三維張量? ? ? 高*寬*通道數(shù)

4維張量:以卷積核來說就是四維張量? ? ? ?高*寬*通道數(shù)*卷積核個數(shù)

再說反向傳播

先從最簡單的神經(jīng)元結(jié)點之間的反向傳播開始

反向傳播就是遵從我們的鏈式求導法則

假設(shè)我們要求最后的損失值相對于圖中W的偏導數(shù)\vartheta ,也就是W的變化會給損失值帶來怎樣的變化,假設(shè)這個偏導數(shù)為負數(shù),則代表W增大時損失函數(shù)減小,而W減小時損失函數(shù)增大,我們更新W的時候就用這個梯度去更新 W = W -?\alpha *\vartheta ,讓我們來驗證一下這個公式,偏導數(shù)為正的時候,W增大會使得損失函數(shù)增大,因此我們要減小W,對應(yīng)于公式正好W是減小的,同理如果偏導數(shù)為負,則W增大會使得損失函數(shù)減小,因此我們就增大這個值。

具體來求一求L對W的偏導,由以下鏈式求導法則

\frac{\vartheta L}{\vartheta W}  = \frac{\vartheta L}{\vartheta a^L }  *\frac{\vartheta a^L}{\vartheta z} *\frac{\vartheta z}{\vartheta W}

然后我們一層一層來算

第一層假設(shè)我們最后用的是二分之一平方損失函數(shù),那么第一層求導數(shù)值為(a^L -  y),其中y為標簽值。

第二層,是一個激活函數(shù)的求導,假設(shè)我們使用的是Relu激活函數(shù),如果Z的值大于0,那么導數(shù)就為1,否則就為0,假設(shè)我們現(xiàn)在Z值大于0,那么這一層的導數(shù)值就為1

第三層,由于Z = W*a(L-1) + b,因此Z對W求導就是a(L-1)

最后我們把他們乘起來得到L對W的偏導值為(aL-y)*a(L-1)

然后計算W = W -?\alpha *(aL-y)*a(L-1)即可

注意當我們用的批量的時候(aL-y)應(yīng)該改為\frac{1}{m} \sum_{i=1}^m(a_{i}^L-x_{i} )

然后很重要一點,假設(shè)我們再要求L-2層的權(quán)重的時候,

我們要先求最后的結(jié)果對a(l-1)層的偏導結(jié)果,我們把上面的第三步改一下就是

\frac{\vartheta L}{\vartheta a^(l-1) } =  (a^L-y)*W^(l-1)

而a(L-1)又是由W(l-2)*a(l-2)+b(l-2)和一層激活層得到

因此\frac{\vartheta L}{\vartheta W^(L-2) } =(a^L-y)*W^(l-1) *a^(l-2)

可以看出來對于每個數(shù)值上的點都有對應(yīng)的偏導數(shù),且對權(quán)值調(diào)整起著非常重要的作用

例如我記錄\frac{\vartheta L}{\vartheta a^(l-1) },那么我再用a(l-1)對W(l-2)進行求偏導,然后根據(jù)鏈式法則相乘即可

所以對于每個數(shù)值點,我們有:損失函數(shù)對該數(shù)值點處的偏導數(shù),再求改點對前面的權(quán)重或偏置的導數(shù),相乘即可。

理解了這一點,就很好理解卷積神經(jīng)網(wǎng)絡(luò)中反向傳播中的一些操作。

池化層的反向傳播

從池化層開始,假設(shè)我們是最大池化

以圖為例,我們計算并記錄下了6這個點的導數(shù),由于是最大池化,那么傳播到它的之前的激活層的時候1處的導數(shù)為0,1處的導數(shù)為0,5處的導數(shù)為0,6處的導數(shù)為1,你可以這樣理解,由于我們采取到了池化這個降采樣操作,所以1,1,5這些點都廢了,沒啥用,甭調(diào)節(jié)它了;

對于平均池化來說,第一塊兒的值為(1+1+5+6)/4,所以每一塊兒的權(quán)重都是0.25,所以每一塊兒的權(quán)重都是6這個位置計算所得的權(quán)重乘以0.25.

卷積層的反向傳播

數(shù)值部分的傳播

這里引用知乎大神南柯一夢寧沉淪的圖(上面的部分圖也取自他的圖)


我們在理解前向反向傳播過程中始終抓住一個核心點,就是前向傳播的時候,哪些點對哪些點造成了什么影響,然后我們反向把這些影響給傳播回去,傳播就是求導,導數(shù)相乘的過程。例如上圖,我們求得了C出的導數(shù),然后我們相求A出的導數(shù),怎么求?看C是怎么通過A得到的嘛,顯然是C = A*B +C*D + E*F + G*H,顯然我們這里只關(guān)心A,通過C對A求導,得到B,因此A處的導數(shù)值等于C處的導數(shù)值乘以B。


現(xiàn)在我們把A移動到如圖所示的位置,還是抓住核心問題,這個點對后面哪些點產(chǎn)生了哪些影響,我們不斷滑動卷積核,發(fā)現(xiàn)A參與了A*C得到D,然后還參與了A*B得到E,那么A處的導數(shù)值就應(yīng)該等于D處的導數(shù)值乘以C加上E處的導數(shù)值乘以B。

卷積核的反向傳播

與上面類似,我們始終關(guān)注一個核心點,我們要求的位置通過何種方式對哪些位置產(chǎn)生了影響,以下圖來表示


在結(jié)果特征圖里,我簡單粗暴用de1--de4來代表4個位置的反向傳播誤差,然后我們想對卷積核中的1,2,3,4幾個參數(shù)進行反向傳播,我們就看1,1參與了與A相乘然后輸出de1位置,1與B相乘然后輸出de2位置,所以1處的誤差為de1*A+de2*B,1處的權(quán)重應(yīng)該更新為W-\alpha *(de1*A+de2*B)

但是注意一點的是,我們現(xiàn)在計算的是某一個通道乘以其中一個卷積核的某一個通道,而有幾個卷積核,就能得到幾張?zhí)卣鲌D,如下表示


假設(shè)我們輸入了兩張?zhí)卣鲌D,然后用兩個深度為2的卷積核會得到兩個特征圖輸出,那么我們在計算A點的誤差時,應(yīng)該等于deC*B+deD*E,即疊加!


綜上!所有的反向傳播,統(tǒng)統(tǒng)從一個角度考慮,就不需要記憶了,很簡單,要求的位置對哪些點產(chǎn)生了哪些影響,然后通過求導和鏈式法則,然后相加就能得到這一點的導數(shù)。


dropout

就是讓某些結(jié)點工作,某些結(jié)點不工作,可以類比于隨機森林,每次都選擇若干個特征進行構(gòu)造決策樹,每一層的dropout都可以設(shè)置一定的比例,例如dropout = 0.6,則代表有百分之六十的神經(jīng)元工作,每一次的前向傳播和誤差反饋調(diào)節(jié)都可以看成是一棵決策樹,每次dropout選擇不工作的神經(jīng)元都是隨機選擇的,那么每一次權(quán)重更新過程都可以類比為構(gòu)造一棵決策樹。


dropout演示

以該圖為例,如果沒有dropout,那么調(diào)節(jié)的權(quán)重個數(shù)為5*5+5*5+5*1 = 55個;

用圖中dropout方式連接,則只有激活的神經(jīng)元對應(yīng)的權(quán)重參與調(diào)節(jié),共3*2+2*3+3*1=15個;

如此看來使用dropout可以大大減輕我們的計算量,而且更重要的原因是dropout的方式很像隨機森林的投票模式,這樣能夠大大增強網(wǎng)絡(luò)的泛化能力,對抗過擬合情況的出現(xiàn)。



Batch Normalization(BN)

如果數(shù)據(jù)集體不呈正態(tài)分布,那么使用一些激活函數(shù),例如sigmoid的時候,大量的數(shù)據(jù)可能集中在很小的調(diào)節(jié)范圍內(nèi),極其容易產(chǎn)生梯度消失。


較大輸入進入激活函數(shù)時的輸出

可以看到,如果數(shù)據(jù)都集中落在較大(或者較小)的區(qū)域,那么梯度就會很小很小趨近于0,到之后后面的網(wǎng)絡(luò)基本上無法調(diào)節(jié),最后定格在這里了,我們的模型很可能不會收斂。


BN層連接在激活層之前。


CNN整體架構(gòu)


整體架構(gòu)

梯度彌散與梯度爆炸

梯度彌散就是在梯度反向傳播中遵從鏈式法則,所有梯度相乘后可能出現(xiàn)一個很小的值,而梯度又代表了權(quán)重的更新快慢和方向,所以如果梯度消失,很有可能收斂地非常慢甚至不收斂;

對應(yīng)梯度彌散的就是梯度爆炸,如果梯度值大于1,則經(jīng)過若干層鏈式傳播之后,很有可能梯度成指數(shù)級增長,這樣造成的效果也很有可能不能收斂。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容