最近仔細學習了一下卷積神經網絡(CNN,Convolutional Neural Network),發現各處資料都不是很全面,經過艱苦努力終於弄清楚了。為了以后備查,以及傳播知識,決定記錄下來。本文將極力避免廢話,重點聚焦在推導過程上,為打算從零開始的孩紙說清楚“為什么”。
另外,因本人才疏學淺(是真的才疏學淺,不是謙虛),肯定會有很多謬誤,歡迎大家指出!
卷積神經網絡(CNN)概述
- 由來:神經元網絡的直接升級版
- 相關:Yann LeCun和他的LeNet
- 影響:在圖像、語音領域不斷突破,復興了神經元網絡並進入“深度學習”時代
卷積神經網絡沿用了普通的神經元網絡即多層感知器的結構,是一個前饋網絡。以應用於圖像領域的CNN為例,大體結構如圖1。
很明顯,這個典型的結構分為四個大層次
- 輸入圖像I。為了減小復雜度,一般使用灰度圖像。當然,也可以使用RGB彩色圖像,此時輸入圖像有三張,分別為RGB分量。輸入圖像一般需要歸一化,如果使用sigmoid激活函數,則歸一化到[0, 1],如果使用tanh激活函數,則歸一化到[-1, 1]。
- 多個卷積(C)-下采樣(S)層。將上一層的輸出與本層權重W做卷積得到各個C層,然后下采樣得到各個S層。怎么做以及為什么,下面會具體分析。這些層的輸出稱為Feature Map。
- 光柵化(X)。是為了與傳統的多層感知器全連接。即將上一層的所有Feature Map的每個像素依次展開,排成一列。
- 傳統的多層感知器(N&O)。最后的分類器一般使用Softmax,如果是二分類,當然也可以使用LR。
接下來,就開始深入探索這個結構吧!
從多層感知器(MLP)說起
卷積神經網絡來源於普通的神經元網絡。要了解個中淵源,就要先了解神經元網絡的機制以及缺點。典型的神經元網絡就是多層感知器。
摘要:本節主要內容為多層感知器(MLP,Multi-Layer Perceptron)的原理、權重更新公式的推導。熟悉這一部分的童鞋可以直接跳過了~但是,一定一定要注意,本節難度比較大,所以不熟悉的童鞋一定一定要認真看看!如果對推導過程沒興趣,可直接在本節最后看結論。
感知器
感知器(Perceptron)是建立模型
其中激活函數 act 可以使用{sign, sigmoid, tanh}之一。
- 激活函數使用符號函數 sign ,可求解損失函數最小化問題,通過梯度下降確定參數
- 激活函數使用 sigmoid (或者 tanh ),則分類器事實上成為Logistic Regression(個人理解,請指正),可通過梯度上升極大化似然函數,或者梯度下降極小化損失函數,來確定參數
- 如果需要多分類,則事實上成為Softmax Regression
- 如要需要分離超平面恰好位於正例和負例的正中央,則成為支持向量機(SVM)。
感知器比較簡單,資料也比較多,就不再詳述。
多層感知器
感知器存在的問題是,對線性可分數據工作良好,如果設定迭代次數上限,則也能一定程度上處理近似線性可分數據。但是對於非線性可分的數據,比如最簡單的異或問題,感知器就無能為力了。這時候就需要引入多層感知器這個大殺器。
多層感知器的思路是,盡管原始數據是非線性可分的,但是可以通過某種方法將其映射到一個線性可分的高維空間中,從而使用線性分類器完成分類。圖1中,從X到O這幾層,正展示了多層感知器的一個典型結構,即輸入層-隱層-輸出層。
輸入層-隱層
是一個全連接的網絡,即每個輸入節點都連接到所有的隱層節點上。更詳細地說,可以把輸入層視為一個向量 xx ,而隱層節點 jj 有一個權值向量 θjθj 以及偏置 bjbj ,激活函數使用 sigmoid 或 tanh ,那么這個隱層節點的輸出應該是
也就是每個隱層節點都相當於一個感知器。每個隱層節點產生一個輸出,那么隱層所有節點的輸出就成為一個向量,即
若輸入層有 mm 個節點,隱層有 nn 個節點,那么 Θ=[θT]Θ=[θT] 為 n×mn×m 的矩陣,xx 為長為 mm 的向量,bb 為長為 nn 的向量,激活函數作用在向量的每個分量上, f(x)f(x) 返回一個向量。
隱層-輸出層
可以視為級聯在隱層上的一個感知器。若為二分類,則常用Logistic Regression;若為多分類,則常用Softmax Regression。
Back Propagation
搞清楚了模型的結構,接下來就需要通過某種方法來估計參數了。對於一般的問題,可以通過求解損失函數極小化問題來進行參數估計。但是對於多層感知器中的隱層,因為無法直接得到其輸出值,當然不能夠直接使用到其損失了。這時,就需要將損失從頂層反向傳播(Back Propagate)到隱層,來完成參數估計的目標。
首先,約定標量為普通小寫字母,向量為加粗小寫字母,矩陣為加粗大寫字母;再約定以下記號:
- 輸入樣本為 xx,其標簽為 tt
- 對某個層 QQ ,其輸出為 oQoQ ,其第 jj 個節點的輸出為 o(j)QoQ(j) ,其每個節點的輸入均為上一層 PP 的輸出 oPoP ;層 QQ 的權重為矩陣 ΘQΘQ ,連接層 PP 的第 ii 個節點與層 QQ 的第 jj 個節點的權重為 θ(ji)QθQ(ji)
- 對輸出層 YY ,設其輸出為 oYoY, 其第 yy 個節點的輸出為 o(y)YoY(y)
現在可以定義損失函數
其中, ϕϕ 為激活函數。我們依舊通過極小化損失函數的方法,嘗試進行推導。則
上邊兩個式子的等號右邊部有三個導數比較容易確定
然后再看剩下的比較復雜的一個偏導數。考慮層 QQ 的下一層 RR ,其節點 kk 的輸入為層 QQ 中每個節點的輸出,也就是為 o(j)QoQ(j) 的函數,考慮逆函數,可視 o(j)QoQ(j) 為 o(k)RoR(k) 的函數,也為 n(k)RnR(k) 的函數。則對每個隱層