卷積神經網絡原理介紹

1 人工神經網絡

1.1 神經元

    神經網絡由大量的神經元相互連接而成。每個神經元接受線性組合的輸入後,最開始只是簡單的線性加權,後來給每個神經元加上了非線性的激活函數,從而進行非線性變換後輸出。每兩個神經元之間的連接代表加權值,稱之爲權重(weight)。不同的權重和激活函數,則會導致神經網絡不同的輸出。

    舉個手寫識別的例子,給定一個未知數字,讓神經網絡識別是什麼數字。此時的神經網絡的輸入由一組被輸入圖像的像素所激活的輸入神經元所定義。在通過非線性激活函數進行非線性變換後,神經元被激活然後被傳遞到其他神經元。重複這一過程,直到最後一個輸出神經元被激活。從而識別當前數字是什麼字。

    神經網絡的每個神經元如下

    基本wx + b的形式,其中

  • 表示輸入向量
  • 爲權重,幾個輸入則意味着有幾個權重,即每個輸入都被賦予一個權重
  • b爲偏置bias
  • g(z) 爲激活函數
  • a 爲輸出

    如果只是上面這樣一說,估計以前沒接觸過的十有八九又必定迷糊了。事實上,上述簡單模型可以追溯到20世紀50/60年代的感知器,可以把感知器理解爲一個根據不同因素、以及各個因素的重要性程度而做決策的模型。

    舉個例子,這週末北京有一草莓音樂節,那去不去呢?決定你是否去有二個因素,這二個因素可以對應二個輸入,分別用x1、x2表示。此外,這二個因素對做決策的影響程度不一樣,各自的影響程度用權重w1、w2表示。一般來說,音樂節的演唱嘉賓會非常影響你去不去,唱得好的前提下 即便沒人陪同都可忍受,但如果唱得不好還不如你上臺唱呢。所以,我們可以如下表示:

  • :是否有喜歡的演唱嘉賓。 = 1 你喜歡這些嘉賓, = 0 你不喜歡這些嘉賓。嘉賓因素的權重 = 7
  • :是否有人陪你同去。 = 1 有人陪你同去, = 0 沒人陪你同去。是否有人陪同的權重 = 3。
    這樣,咱們的決策模型便建立起來了:g(z) = g( * + * + b ),g表示激活函數,這裏的b可以理解成 爲更好達到目標而做調整的偏置項。
    一開始爲了簡單,人們把激活函數定義成一個線性函數,即對於結果做一個線性變化,比如一個簡單的線性激活函數是g(z) = z,輸出都是輸入的線性變換。後來實際應用中發現,線性激活函數太過侷限,於是人們引入了非線性激活函數。

1.2 激活函數

    常用的非線性激活函數有sigmoid、tanhrelu等等,前兩者sigmoid/tanh比較常見於全連接層,後者relu常見於卷積層。這裏先簡要介紹下最基礎的sigmoid函數(btw,在本博客中SVM那篇文章開頭有提過)。

    sigmoid的函數表達式如下

    其中z是一個線性組合,比如z可以等於:b + * + *通過代入很大的正數或很小的負數到g(z)函數中可知,其結果趨近於0或1

    因此,sigmoid函數g(z)的圖形表示如下( 橫軸表示定義域z,縱軸表示值域g(z) ):

    也就是說,sigmoid函數的功能是相當於把一個實數壓縮至0到1之間。當z是非常大的正數時,g(z)會趨近於1,而z是非常大的負數時,則g(z)會趨近於0

    壓縮至0到1有何用處呢?用處是這樣一來便可以把激活函數看作一種“分類的概率”,比如激活函數的輸出爲0.9的話便可以解釋爲90%的概率爲正樣本。

    舉個例子,如下圖(圖引自Stanford機器學習公開課

邏輯與

    z = b + * + *,其中b爲偏置項 假定取-30,都取爲20

  • 如果 = 0  = 0,則z = -30,g(z) = 1/( 1 + e^-z )趨近於0。此外,從上圖sigmoid函數的圖形上也可以看出,當z=-30的時候,g(z)的值趨近於0
  • 如果 = 0 = 1,或 =1 = 0,則z = b + * + * = -30 + 20 = -10,同樣,g(z)的值趨近於0
  • 如果 = 1 = 1,則z = b + * + * = -30 + 20*1 + 20*1 = 10,此時,g(z)趨近於1。

    換言之,只有都取1的時候,g(z)→1,判定爲正樣本;取0的時候,g(z)→0,判定爲負樣本如此達到分類的目的。

1.3 神經網絡

    將下圖的這種單個神經元

    組織在一起,便形成了神經網絡。下圖便是一個三層神經網絡結構


    上圖中最左邊的原始輸入信息稱之爲輸入層,最右邊的神經元稱之爲輸出層(上圖中輸出層只有一個神經元),中間的叫隱藏層。

    啥叫輸入層、輸出層、隱藏層呢?

  • 輸入層(Input layer),衆多神經元(Neuron)接受大量非線形輸入訊息。輸入的訊息稱爲輸入向量。
  • 輸出層(Output layer),訊息在神經元鏈接中傳輸、分析、權衡,形成輸出結果。輸出的訊息稱爲輸出向量。
  • 隱藏層(Hidden layer),簡稱“隱層”,是輸入層和輸出層之間衆多神經元和鏈接組成的各個層面。如果有多個隱藏層,則意味着多個激活函數。

    同時,每一層都可能由單個或多個神經元組成,每一層的輸出將會作爲下一層的輸入數據。比如下圖中間隱藏層來說,隱藏層的3個神經元a1、a2、a3皆各自接受來自多個不同權重的輸入(因爲有x1、x2、x3這三個輸入,所以a1 a2 a3都會接受x1 x2 x3各自分別賦予的權重,即幾個輸入則幾個權重),接着,a1、a2、a3又在自身各自不同權重的影響下 成爲的輸出層的輸入,最終由輸出層輸出最終結果。

    上圖(圖引自Stanford機器學習公開課)中

  • 表示第j層第i個單元的激活函數/神經元
  • 表示從第j層映射到第j+1層的控制函數的權重矩陣 
    此外,輸入層和隱藏層都存在一個偏置(bias unit),所以上圖中也增加了偏置項:x0、a0。針對上圖,有如下公式

    此外,上文中講的都是一層隱藏層,但實際中也有多層隱藏層的,即輸入層和輸出層中間夾着數層隱藏層,層和層之間是全連接的結構,同一層的神經元之間沒有連接。




2 卷積神經網絡之層級結構

   cs231n課程裏給出了卷積神經網絡各個層級結構,如下圖


    上圖中CNN要做的事情是:給定一張圖片,是車還是馬未知,是什麼車也未知,現在需要模型判斷這張圖片裏具體是一個什麼東西,總之輸出一個結果:如果是車 那是什麼車

    所以

  • 最左邊是數據輸入層,對數據做一些處理,比如去均值(把輸入數據各個維度都中心化爲0,避免數據過多偏差,影響訓練效果)、歸一化(把所有的數據都歸一到同樣的範圍)、PCA/白化等等。CNN只對訓練集做“去均值”這一步。

    中間是

  • CONV:卷積計算層,線性乘積 求和。
  • RELU:激勵層,上文2.2節中有提到:ReLU是激活函數的一種。
  • POOL:池化層,簡言之,即取區域平均或最大。

    最右邊是

  • FC:全連接層
    這幾個部分中,卷積計算層是CNN的核心,下文將重點闡述。



3 CNN之卷積計算層

3.1 CNN怎麼進行識別

    當我們給定一個"X"的圖案,計算機怎麼識別這個圖案就是“X”呢?一個可能的辦法就是計算機存儲一張標準的“X”圖案,然後把需要識別的未知圖案跟標準"X"圖案進行比對,如果二者一致,則判定未知圖案即是一個"X"圖案。
    而且即便未知圖案可能有一些平移或稍稍變形,依然能辨別出它是一個X圖案。如此,CNN是把未知圖案和標準X圖案一個局部一個局部的對比,如下圖所示 [圖來自參考文案25]

    而未知圖案的局部和標準X圖案的局部一個一個比對時的計算過程,便是卷積操作。卷積計算結果爲1表示匹配,否則不匹配。
    接下來,我們來了解下什麼是卷積操作。

3.2 什麼是卷積

    對圖像(不同的數據窗口數據)和濾波矩陣(一組固定的權重:因爲每個神經元的多個權重固定,所以又可以看做一個恆定的濾波器filter)做內積(逐個元素相乘再求和)的操作就是所謂的『卷積』操作,也是卷積神經網絡的名字來源。
    非嚴格意義上來講,下圖中紅框框起來的部分便可以理解爲一個濾波器,即帶着一組固定權重的神經元。多個濾波器疊加便成了卷積層。
    OK,舉個具體的例子。比如下圖中,圖中左邊部分是原始輸入數據,圖中中間部分是濾波器filter,圖中右邊是輸出的新的二維數據。

    分解下上圖
對應位置上是數字先相乘後相加 =
    中間濾波器filter與數據窗口做內積,其具體計算過程則是:4*0 + 0*0 + 0*0 + 0*0 + 0*1 + 0*1 + 0*0 + 0*1 + -4*2 = -8

3.3 圖像上的卷積

    在下圖對應的計算過程中,輸入是一定區域大小(width*height)的數據,和濾波器filter(帶着一組固定權重的神經元)做內積後等到新的二維數據。
    具體來說,左邊是圖像輸入,中間部分就是濾波器filter(帶着一組固定權重的神經元),不同的濾波器filter會得到不同的輸出數據,比如顏色深淺、輪廓。相當於如果想提取圖像的不同特徵,則用不同的濾波器filter,提取想要的關於圖像的特定信息:顏色深淺或輪廓。

    如下圖所示

  

3.4 GIF動態卷積圖

    在CNN中,濾波器filter(帶着一組固定權重的神經元)對局部輸入數據進行卷積計算。每計算完一個數據窗口內的局部數據後,數據窗口不斷平移滑動,直到計算完所有數據。這個過程中,有這麼幾個參數: 
  a. 深度depth:神經元個數,決定輸出的depth厚度。同時代表濾波器個數。
  b. 步長stride:決定滑動多少步可以到邊緣。
  c. 填充值zero-padding:在外圍邊緣補充若干圈0,方便從初始位置以步長爲單位可以剛好滑倒末尾位置,通俗地講就是爲了總長能被步長整除。 
  這裏寫圖片描述 
    cs231n課程中有一張卷積動圖,貌似是用d3js 和一個util 畫的,我根據cs231n的卷積動圖依次截取了18張圖,然後用一gif 製圖工具製作了一gif 動態卷積圖。如下gif 圖所示
    可以看到:
  • 兩個神經元,即depth=2,意味着有兩個濾波器。
  • 數據窗口每次移動兩個步長取3*3的局部數據,即stride=2。
  • zero-padding=1。
    然後分別以兩個濾波器filter爲軸滑動數組進行卷積計算,得到兩組不同的結果。
    如果初看上圖,可能不一定能立馬理解啥意思,但結合上文的內容後,理解這個動圖已經不是很困難的事情:
  • 左邊是輸入(7*7*3中,7*7代表圖像的像素/長寬,3代表R、G、B 三個顏色通道)
  • 中間部分是兩個不同的濾波器Filter w0、Filter w1
  • 最右邊則是兩個不同的輸出

    隨着左邊數據窗口的平移滑動,濾波器Filter w0 / Filter w1對不同的局部數據進行卷積計算。

    值得一提的是:

  1. 左邊數據在變化,每次濾波器都是針對某一局部的數據窗口進行卷積,這就是所謂的CNN中的局部感知機制。
    • 打個比方,濾波器就像一雙眼睛,人類視角有限,一眼望去,只能看到這世界的局部。如果一眼就看到全世界,你會累死,而且一下子接受全世界所有信息,你大腦接收不過來。當然,即便是看局部,針對局部裏的信息人類雙眼也是有偏重、偏好的。比如看美女,對臉、胸、腿是重點關注,所以這3個輸入的權重相對較大。
  2. 與此同時,數據窗口滑動,導致輸入在變化,但中間濾波器Filter w0的權重(即每個神經元連接數據窗口的權重)是固定不變的,這個權重不變即所謂的CNN中的參數(權重)共享機制。
    • 再打個比方,某人環遊全世界,所看到的信息在變,但採集信息的雙眼不變。btw,不同人的雙眼 看同一個局部信息 所感受到的不同,即一千個讀者有一千個哈姆雷特,所以不同的濾波器 就像不同的雙眼,不同的人有着不同的反饋結果。

    我第一次看到上面這個動態圖的時候,只覺得很炫,另外就是據說計算過程是“相乘後相加”,但到底具體是個怎麼相乘後相加的計算過程 則無法一眼看出,網上也沒有一目瞭然的計算過程。本文來細究下。

    首先,我們來分解下上述動圖,如下圖

    接着,我們細究下上圖的具體計算過程。即上圖中的輸出結果1具體是怎麼計算得到的呢?其實,類似wx + b,w對應濾波器Filter w0,x對應不同的數據窗口,b對應Bias b0,相當於濾波器Filter w0與一個個數據窗口相乘再求和後,最後加上Bias b0得到輸出結果1,如下過程所示:

1* 0 + 1*0 + -1*

+

-1*0 + 0*0 + 1*1

+

-1*0 + -1*0 + 0*1


+

-1*0 + 0*0 + -1*0

+

0*0 + 0*1 + -1*1

+

1*0 + -1*0 + 0*2


+

0*0 + 1*0 + 0*0

+

1*0 + 0*2 + 1*0

+

0*0 + -1*0 + 1*0


+

 

1

=

1

    然後濾波器Filter w0固定不變,數據窗口向右移動2步,繼續做內積計算,得到0的輸出結果

    最後,換做另外一個不同的濾波器Filter w1、不同的偏置Bias b1,再跟圖中最左邊的數據窗口做卷積,可得到另外一個不同的輸出。



4 CNN之激勵層與池化層

4.1 ReLU激勵

    2.2節介紹了激活函數sigmoid,但實際梯度下降中,sigmoid容易飽和、造成終止梯度傳遞,且沒有0中心化。咋辦呢,可以嘗試另外一個激活函數:ReLU,其圖形表示如下

    ReLU的優點是收斂快,求梯度簡單。

4.2 池化pool層

    前頭說了,池化,簡言之,即取區域平均或最大,如下圖所示(圖引自cs231n)


    上圖所展示的是取區域最大,即上圖左邊部分中 左上角2x2的矩陣中6最大,右上角2x2的矩陣中8最大,左下角2x2的矩陣中3最大,右下角2x2的矩陣中4最大,所以得到上圖右邊部分的結果:6 8 3 4。


發佈了45 篇原創文章 · 獲贊 53 · 訪問量 22萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章