卷積神經網絡(CNN)因為在圖像識別任務中大放異彩,而廣為人知,近幾年卷積神經網絡在文本處理中也有了比較好的應用。我用TextCnn來做文本分類的任務,相比TextRnn,訓練速度要快非常多,准確性也比較高。TextRnn訓練慢得像蝸牛(可能是我太沒有耐心),以至於我直接中斷了訓練,到現在我已經忘記自己到底有沒有成功訓練一只TextRnn了。
卷積神經網絡可以說是非常優美了,卷積操作(局部連接和權值共享)和池化操作,極大地減少了模型的參數,大大加快了模型訓練的速度,才使得神經網絡得以如此大規模的應用。
所以這篇文章好好整理一下有關卷積神經網絡的基礎知識,暫不涉及TextCnn的內容。
一、卷積神經網絡的概念
卷積神經網絡(Convolutional Neural Network,CNN)是一種具有局部連接、權值共享以及池化特性的深層前饋神經網絡,一般由卷積層、池化層和全連接層交叉堆疊而成(全連接層為頂層)。這三個特性使得卷積神經網絡具有一定程度上的平移、縮放和旋轉不變性,可以提取到自然圖像中的局部不變特征,並且參數相比全連接前饋神經網絡要少很多,易於訓練。
在理解卷積神經網絡的結構之前,先了解卷積的概念。
1、卷積的基本操作
卷積(Convolution)是分析數學中的一種重要運算,因為圖像是個二維結構(不考慮通道),所以在圖像處理中通常使用二維卷積。濾波器(Filter)也稱為卷積核(Convolutional Kernel),經常作為特征提取的有效方法,而一幅圖像在經過卷積操作之后得到的結果稱為特征映射(Feature Map)。二維卷積核是一個矩陣,如下是一個高斯卷積核,可以對圖像進行平滑去噪。

卷積的具體操作是,給定一個圖像
,和濾波器
,一般有m<M,n<N,於是卷積為
:

與圖形相對照如下,卷積操作就是在一個圖像上滑動一個卷積核,通過卷積操作來得到新的特征。

上圖中,左邊是圖像的長和高兩個維度x(圖像有三個維度,分別為長、高和通道),中間這個矩陣是卷積核w,於是我們看最右邊這個矩陣中高亮的元素-1是如何計算出來的。注意卷積運算不是矩陣乘法,而是形狀相同的兩個矩陣的對應位置元素的乘積之和。也就是:

而如果考慮圖像的通道的話,那么圖像是3維數據,通道數為3,那么就先對每個通道上的輸入數據和濾波器進行卷積運算,然后再把3個通道的卷積結果相加,得到輸出。

2、卷積的步長和零填充
在卷積基本操作的基礎上,還可以引入卷積核的滑動步長(Stride)和零填充(Zero Padding)來增加卷積的多樣性,可以更靈活地進行特征提取。
卷積核的步長是指卷積核在滑動時的時間間隔,下圖為一維卷積中步長為2的例子,一維卷積核取[1, 0, -1]。

零填充則是在輸入向量或者輸入矩陣周圍補零。為什么需要補零呢?原因是步長大於1時,對輸入數據向右卷積的過程中可能會產生最后一個卷積塊不完整的問題。此外,使用零填充更主要是為了調整輸出的大小,實現輸出空間大小不變的情況下將輸出傳入下一層。因為如果每次卷積過后輸出的空間都縮小,那么在某個時刻輸出的大小可能變為1,就無法再進行卷積了。下圖是一維卷積中零填充的示例,一維卷積核取[1, 0, -1]。

假設卷積層的輸入大小為(H, W),輸入層神經元個數為H;卷積核大小為(FH, FW),步長為s,填補為p,輸出大小為(OH, OW),那么該卷積層的輸出的大小可以這樣計算:

特別的,當步長為1,兩端不補零時(p=0),卷積層的輸出大小為(H-FH+1, W-FW+1),其中(H-FH+1)是卷積層神經元的個數。
二、卷積神經網絡的結構和特性
卷積神經網絡一般由卷積層、池化層和全連接層構成。
(一)卷積層
1、用卷積代替全連接
在全連接前饋神經網絡中,如果第l層有n(l)個神經元,第l-1層有n(l-1)個神經元,則權重矩陣有n(l)×n(l-1)個參數,參數的數量太大。
如果用卷積來替代全連接,第l層的凈輸入z(l)為第l-1層活性值a(l-1)和卷積核w(l)的卷積,那么經過卷積操作可以得到:
![]()
卷積操作有兩個重要的性質。
一是局部連接。在卷積層(假設為第l層)中每個神經元都只與下一層(第l-1層)中的某個滑動窗口中的神經元相連接,構成一個局部連接網絡。卷積層和下一層之間的連接數大大減少,由原來的n(l)×n(l-1)個連接變成n(l)×m個連接,m為卷積核的大小。
二是權值共享。作為參數的卷積核w(l)對於第l層中所有的神經元都是相同的。於是卷積層的參數只有一個m維的權重w(l)和1維的偏置b(l),共m+1參數。
另外第l層的神經元個數是由第l-1層的神經元個數和卷積核的大小所決定的,滿足:
![]()
卷積神經網絡的局部連接和權值共享特性如下圖所示:

2、卷積層的作用
卷積層的作用是提取一個局部區域的特征,不同的卷積核相當於不同的特征提取器。由於圖像是三維數據,除了長、高以外,還有通道,於是通常把神經元組織成三維結構的神經層,大小為通道數C×高度H×長度W,即(C, H, W),由C個H×W的特征映射構成。
特征映射是一幅圖像經過卷積后提取到的特征,每個特征映射可以作為抽取到的一類圖像特征。如果是灰色圖像,那么只有一個特征映射,也就是通道數C為1;如果是彩色圖像,分別有RGB三個顏色通道,那么有三個特征映射,C=3。
卷積核也一樣,大小為通道數C×高度FH×長度FW,即(C, FH, FW)。其中卷積核的通道數必須和輸入層的通道數一致,都是C。
如果卷積核只有一個,那么卷積層的輸出就是一張特征圖,也就是說卷積層輸出的通道是1。

如果希望卷積層的輸出也是多通道的,那么就需要就需要用到多個卷積核(權重),比如用FN個卷積核,那么卷積層的輸出數據的大小為(FN, OH, OW)。

從上面這個圖可以總結出一個規律:輸入層的通道數和卷積核的通道數C相等,而卷積核的個數FN與卷積層的通道數FN相等。
卷積運算中一樣存在偏置,偏置中元素的個數和卷積核的個數一致,即卷積層的每個通道有一個偏置值,這些偏置是相等的。如果加上偏置,那么卷積層真正的輸出如下圖:

(二)池化層
池化層(Pooling Layer)也叫子采樣層(Subsampling Layer),它的作用是進行特征選擇,降低特征數量,並從而減少參數數量。
1、最大池化案例
直接來看一個最大池化的例子,一圖勝千言。先來看單通道最大池化的過程,取上一層中一個通道的輸出數據,是4×4的矩陣,然后將其划分為4個2×2的小矩陣,找出每個小矩陣中的最大值,重新構成一個2×2的矩陣,這就是最大池化后池化層某個通道的輸出結果。這里池化層也可以看做是一個特殊的卷積層,卷積核大小為 2 × 2,步長為 2 ,卷積核為 max函數。

再來看多通道最大池化的過程,也就是在每個通道上都進行上一步,得到的最大池化輸出也是3個通道的,也就是說在最大池化過程中,通道數不變。

2、池化的理論說明
接下來我們再從理論的高度來闡述一下池化。
卷積層盡管可以顯著減少網絡中的連接數量,但是如果經過零填充操作,則神經元的個數並沒有顯著減少,如果后面接一個分類器,則輸入的特征維度仍然很高,容易造成過擬合。因此可以在卷積層后面加一個池化層,從而降低特征維度並保留有效信息,避免過擬合。此外,池化層還可以保持圖像的旋轉、平移和伸縮的不變性,並且提高計算速度。
池化是這樣做的,首先把上一層的輸出數據(一個矩陣)划分為多個區域
,一般會把池化窗口的大小設定為和步長一樣大,那么區域就是不重疊的。
然后池化就是指對每個區域進行下采樣(Down Sampling),得到一個值作為該區域的概括。通過下采樣,可以縮小圖像,比如對於一副尺寸為M×N的圖像,對其進行s倍下采樣,即得到(M/s)×(N/s)尺寸的分辨率圖像。
而常見的池化有兩種,一種是最大池化(Max Pooling),即從目標區域中取出最大值;另一種是平均池化(Average Pooling),即計算目標區域中的最大值。在圖像處理中,主要用到最大池化。
3、池化層的特性
池化層有三個特性:
(1)沒有需要學習的參數
池化層和卷積層不同,沒有需要學習的參數,而只是從目標區域中取出最大值或平均值。
(2)通道數不發生變化
經過池化運算,輸入數據和輸出數據的通道數不會發生變化,計算是按照通道獨立進行的。
(3)對微小的變化具有魯棒性
在最大池化中,輸入數據發生微小偏差時,池化仍然會返回相同的結果,因此對輸入數據的微小偏差具有魯棒性。
(三)卷積神經網絡的典型結構
經過多輪卷積層、池化層的交叉堆疊后之后,就要接全連接層輸出結果了。目前常用的卷積神經網絡結構圖如下。一個卷積塊由連續M(M取2~5)個卷積層和b(b取0或1)個池化層構成。這種結構的卷積神經網絡在堆疊了N(N取1~100都有可能)個連續的卷積塊之后,連接K個全連接層(K一般取0~2)。

而最具代表性的兩個卷積神經網絡結構是LeNet和AlexNet,這兩個神經網絡的結構圖就不貼上來了,主要說明一下兩個網絡大致的特點。
LeNet使用連續的卷積層和子采樣層(Sub Sampling),最后接全連接層輸出結果。和現在的CNN相比,它的特點在於:一是使用Sigmoid激活函數,而現在的CNN主要使用ReLU函數;二是使用子采樣縮小中間數據的大小,用到的是平均池化,而現在的CNN使用最大池化是主流。
AlexNet的網絡結構和LeNet基本沒有什么不同,也是疊加多個卷積層和池化層(不過這里是最大池化),最后經全連接層輸出結果。但AlexNet和LeNet有以下幾點差異:一是激活函數使用ReLU函數;二是使用了dropout避免過擬合;三是使用了數據增強技術;四是使用了最大池化。
三、卷積神經網絡的參數學習
在卷積神經網絡中,主要有兩種不同功能的神經層:卷積層和池化層。由於池化層中沒有參數,所以卷積神經網絡的參數為卷積核中的權重以及偏置。
卷積神經網絡是前饋神經網絡的一種,與全連接的前饋神經網絡類似,卷積神經網絡也可以通過誤差反向傳播來進行參數學習,也就是要計算每一個卷積層的誤差項δ,進行反向傳播,並進一步計算每一個卷積層參數的梯度,用來更新權重和偏置。
計算公式過於復雜,我就不推導了,到此為止。
四、碎碎念
用邱錫鵬老師的書整理多篇筆記了,我必須安利一波啊!如果有人認真看了我的筆記(真的只是讀書筆記),又看了邱老師的書,就會發現我基本就是在摘錄邱老師的書(初學者只能這樣做筆記啦)。這也不能怪我,因為邱老師的書實在太干了:干貨太多了,我都沒法自己總結了!
看邱老師的書,有種看李航老師的《統計學習方法》的感覺,內容精悍而不失豐富性,數學公式優美,推導清晰。如果你在看吳恩達老師的深度學習課程,覺得講得太瑣碎、例子太多時,那么邱老師的書是你梳理知識和整理筆記的不二之選。
但是看得出邱老師過於痴迷於數學表達了,其實卷積神經網絡還是多以圖形的方式來闡述比較好,所以搭配其他資料進行學習也是必要的。
參考資料:
1、邱錫鵬:《神經網絡與深度學習》
2、齋藤康毅 :《深度學習入門 : 基於Python的理論與實現 》
