通俗理解卷積神經網絡

1 前言

2012年我在北京組織過8期machine learning讀書會,那時“機器學習”非常火,很多人都對其抱有巨大的熱情。當我2013年再次來到北京時,有一個詞似乎比“機器學習”更火,那就是“深度學習”。

本文內寫過一些機器學習相關的文章,但上一篇技術文章“LDA主題模型”還是寫於2014年11月份,畢竟自2015年開始創業做在線教育後,太多的雜事、瑣碎事,讓我一直想再寫點技術性文章但每每恨時間抽不開。然由於公司在不斷開機器學習、深度學習等相關的在線課程,耳濡目染中,總會順帶學習學習。

我雖不參與講任何課程(公司的所有在線課程都是由目前講師團隊的16位講師講),但依然可以用最最小白的方式 把一些初看複雜的東西抽絲剝繭的通俗寫出來。

在dl中,有一個很重要的概念,就是卷積神經網絡CNN,基本是入門dl必須搞懂的東西。本文基本根據斯坦福的機器學習公開課、cs231n、與七月在線寒老師講的5月dl班第4次課CNN與常用框架視頻所寫,是一篇課程筆記,本只是想把重點放在其卷積計算具體是怎麼計算怎麼操作的(對於已經搞懂的人來說很簡單,但對於未接觸過或剛接觸過的同學來說,乍一看,哎,咋計算的?),但,後面不斷補充,故寫成了關於卷積神經網絡的通俗導論性的文章。有何問題,歡迎不吝指正。

2 人工神經網絡

2.1 神經元

神經網絡由大量的節點(或稱“神經元”、“單元”)和相互連接而成。每個節點代表一種特定的輸出函數,稱爲激活函數(activation function)。每兩個節點之間的連接代表加權值,稱之爲權重(weight)。不同的權重和激活函數,則會導致神經網絡不同的輸出。

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

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

\

類似wx + b的形式,其中

a1~an爲輸入向量,當然,也常用x1~xn表示輸入w1~wn爲權重b爲偏置biasf 爲激活函數t 爲輸出

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

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

x1:是否有喜歡的演唱嘉賓。x1 = 1 你喜歡這些嘉賓,x1 = 0 你不喜歡這些嘉賓。嘉賓因素的權重w1 = 5x2:天氣好壞。x2 = 1 天氣好,x2 = 0 天氣不好。天氣權重w2 = 2。x3:是否有人陪你同去。x3 = 1 有人陪你同去,x2 = 0 沒人陪你同去。是否有陪同的權重w3 = 3。
這樣,咱們的決策模型函數便建立起來了:f(x) = g( w1*x1 + w2*x2 + w3*x3 + b ),g表示激活函數。不同的輸入會得到不一樣的決策結果。

2.2 激活函數

常用的激活函數有sigmoid、tanh、relu等等,前兩者sigmoid/tanh比較常見於全鏈接層,後者relu常見於卷積層。這裏先簡要介紹下最基礎的sigmoid函數。

sigmoid的函數表達式如下

\

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

因此,sigmoid函數的圖形表示如下:

\

也就是說,sigmoid函數的功能是相當於把一個實數壓縮至0到1之間。輸入非常大的正數時,輸出結果會接近1,而輸入非常大的負數時,則會得到接近0的結果。壓縮至0到1有何用處呢?用處是這樣一來變可以把激活函數看作一種“分類的概率”,比如激活函數的輸出爲0.9的話便可以解釋爲90%的概率爲正樣本。

2.3 神經網絡

將下圖的這種單個神經元

\

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

\

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

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

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

同時,每一層都可能由單個或多個神經元組成,每一層的輸出將會作爲下一層的輸入數據。比如下圖中間隱藏層來說,隱藏層的3個神經元a1、a2、a3皆各自接受來自多個不同權重的輸入,接着,a1、a2、a3又在自身各自不同權重的影響下 成爲的輸出層的輸入,最終由輸出層輸出最終結果。

\

上圖(注:圖引自斯坦福機器學習公開課)中

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

\

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

\

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

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

\

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

所以

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

中間是

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

最右邊是

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

4 CNN之卷積計算層

4.1 什麼是卷積

首先,我們來了解下什麼是卷積操作。
對圖像(不同的數據窗口數據)和濾波矩陣(一組固定的權重:因爲每個神經元的權重固定,所以又可以看做一個恆定的濾波器filter)做內積(逐個元素相乘再求和)的操作就是所謂的『卷積』操作,也是卷積神經網絡的名字來源。
比如下圖中,圖中左邊部分是原始輸入數據,圖中中間部分是濾波器filter,圖中右邊是輸出的新的二維數據。
 
\
分解下上圖
\ 對應位置上是數字先乘後相加 \ = \
中間濾波器filter與數據窗口做內積,其具體計算過程則是:4*0 + 0*0 + 0*0 + 0*0 + 0*1 + 0*1 + 0*0 + 0*1 + -4*2 = -8
 

4.2 圖像上的卷積

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

如下圖所示

\

4.3 cs231d的動態卷積圖

如果初看此圖,可能不一定能立馬理解啥意思,但結合上文的內容後,理解這個動圖已經不是很困難的事情。
下述動圖中,左邊是輸入,中間部分是兩個不同的濾波器Filter w0、Filter w1,最右邊則是兩個不同的輸出。
\

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

值得一提的是:

左邊數據在變化,即每次濾波器都是針對某一部分數據窗口進行卷積,這就是所謂的CNN中的局部連接機制。
與此同時,數據窗口滑動,但中間濾波器Filter w0的權重(即每個神經元連接數據窗口的的權重)是固定不變的,這個權重不變即所謂的CNN中的參數共享機制。

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

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

\

接着,我們細究下上圖的具體計算過程。即上圖中的輸出結果-1具體是怎麼計算得到的呢?其實,類似wx + b,w對應濾波器Filter w0,x對應不同的數據窗口,b對應Bias b0,相當於濾波器Filter w0與一個個數據窗口相乘再求和後,最後加上Bias b0得到輸出結果-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固定不變,數據窗口向右移動2步,繼續做內積計算,得到4的輸出結果

\

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

5 CNN之激勵層與池化層

5.1 ReLU激勵層

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

\

ReLU的優點是收斂快,求梯度簡單,但同時也比較脆弱。類似於C效率高,但裏面的指針容易出錯。對於有經驗、且謹慎的人來說,還是值得首先嚐試。

5.2 池化pool層

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

\

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

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