為什么CNN能自動提取圖像特征
1.介紹
在大部分傳統(tǒng)機器學習場景里,我們先經(jīng)過特征工程等方法得到特征表示,然后選用一個機器學習算法進行訓練。在訓練過程中,表示事物的特征是固定的。

后來嘛,后來深度學習就崛起了。深度學習對外推薦自己的一個很重要的點是——深度學習能夠自動提取特征。如果你是從 DNN 開始了解深度學習,你會對 “深度學習能夠自動提取特征” 很迷茫。但是如果你是從 CNN 開始了解深度學習的,你就會很自然地理解 “深度學習能夠自動提取特征”。
2.提取特征
CNN 網(wǎng)絡主要有兩個算子,一個是卷積層,另一個是池化層。大部分人對于池化層并沒有什么理解難度。池化層無非滑動一個滑動窗口,滑動窗口之內(nèi)***值或者取平均值。對于卷積層,我們大部分人都是看下面的圖了解的。卷積層也是滑動一個滑動窗口,滑動窗口之內(nèi)做卷積運算。

理解 CNN 的卷積層和池化層如何運算,并不能自動給我們關于 CNN 原理的洞見。我們依然存在疑惑: 為什么 CNN 的卷積層是這樣的?Lecun 大神設計 CNN 的卷積層是怎么考慮的?
為了理解這個問題,我們先思考一個問題:提取圖片特征最樸素的想法是什么?簡化問題,我們要分類黑白圖片中的字母 A 還是 X。

這兩個有一個鮮明區(qū)別是 A 的頂部模式。

如果能在圖片中抽取 A 的頂部模式,圖片中的字母是 A; 如果不能,圖片中的字母是 X。為了提取圖片是否包含 A 的頂部模式,我們將 A 的頂部模式在圖片中滑動,切分處理的局部圖片和 A 頂部模式做內(nèi)積。下圖顯示是 A 圖片的 1 和 2 部位切分出來的局部圖片和 A 的頂部模式做內(nèi)積。

根據(jù)圖中表示,A 圖片的 1 部位是 A 字母的頂部,內(nèi)積為 4; 2 部位不是 A 頂部,內(nèi)積只有 1。在 A 圖片中滑動 A 頂部模式,得到的結果為

然后我們?nèi)∑渲?**值得到最終結果是 4。這是我們可以說圖片包含 A 頂部模式的的 “傾向性” 或者說 “可能性” 是 4。我們就提取了一個特征。
X 那張圖按照相同的操作,結果為 3。這個結果是從 X 的交叉部位得到的。
這里我們會發(fā)現(xiàn):A 的頂部模式在圖片中滑動其實就是 CNN 里卷積層做的事情, A 的頂部模式就是卷積核;同時,在內(nèi)積結果上取***值就是***池化層的操作。也就是說 CNN 用卷積層和池化層,實踐了最樸素的圖片特征提取方法。當然了,真實世界的 CNN 要復雜得多: 1) 真實世界的圖片和卷積核是多層的。這個好理解,在圖片是多層的情況下,局部模式肯定也是多層,卷積核自然也是多層的。2) 真實世界的 CNN 并不是一個卷積層搭配一個池化層,而是存在連續(xù)多層卷積層。這個也好理解。在這個時候,局部模式是有多個連續(xù)卷積核表示的。
3.自動學習
通過上面的講解,我們知道 CNN 模型是如何利用卷積層和池化層提取圖片的特征,其中的關鍵是卷積核表示圖片中的局部模式。還是拿上面例子來說,我們知道并且選用了 A 的頂部模式這個卷積核。

但是在真實世界中我們是不能做。對于大規(guī)模圖片庫我們并不知道那個局部模式是有效的。即使我們選定局部模式,也會因為太過具體而失去反泛化性。那么我們怎么應對這個問題呢,即如何確定卷積核的值呢?
這里就要講到大名鼎鼎梯度向后傳播算法。一開始我們隨機初始化卷積核的參數(shù),然后通過基于梯度向后傳播算法的優(yōu)化算法,自適應地調整卷積核的值,從而最小化模型預測值和真實值之間的誤差。這樣得到的卷積核的參數(shù)不一定直觀,但是能夠有效地提取特征,使得模型預測值和真實值之間的誤差最小。為了簡化問題,下面我們還是用單層圖片做例子。即使簡化到單層圖片,我們依然覺得計算卷積層和池化層的梯度比較難。為了進一步直觀化,我們將卷積層分解多個容易計算梯度的簡單線性算子,將池化層分解容易計算梯度的多個簡單操作。

通過分解卷積層和池化層,我們易得下面一系列計算梯度公式。
池化層本身沒有參數(shù),只需要把梯度往回傳就行。這里我們要關注下***池化層:***值操作是選擇窗口內(nèi)***值,怎么看都不是連續(xù)函數(shù),就不可能存在導數(shù)(梯度)。假設

即矩陣 x 中第 i 行第 j 列值***,那么

另外一個問題就是怎么求卷積層的梯度。我們用 conv(xx,ww)conv(xx,ww) 表示卷積, conv(xx,ww)i,jconv(xx,ww)i,j表示卷積結果中的第 i 行第 j 列, xconv−i,jxconv−i,j 表示用于生成卷積結果第 i 行第 j 列的圖片局部(即 xconv−i,j⋅ww=conv(xx,ww)i,jxconv−i,j⋅ww=conv(xx,ww)i,j )。卷積核參數(shù)的梯度可以用下面的公式計算

至于梯度怎么傳回去呢?如下圖所示,我們先定義 δ(i,j)δ(i,j) 表示圖片大小的矩陣,生成第 i 行第 j 列的卷積結果的圖片區(qū)域用卷積核參數(shù)填充,其他區(qū)域為 0。

此時我們得到梯度往回傳的公式。

4.總結
通過卷積核刻畫圖片的局部模式,CNN 能夠提取圖片的特征; 通過梯度向后傳播算法,CNN 能夠確定每個卷積核的參數(shù),從而實現(xiàn)自動提取圖片的特征。這樣,我們應該很自然地理解 “深度學習能夠自動提取特征” 了。
為什么 CNN 等深度學習模型自動提取特征這么重要?我們可以從 Pedro Domingos [1] 關于 “機器學習本質是什么” 開始說起。Pedro Domingos [1] 認為:
表示是指我們?nèi)绾伪磉_相關特征,涉及到特征工程、特征算子和特征組合等問題。目標是指我們想模型學習到什么,涉及問題建模和目標函數(shù)。優(yōu)化是怎么計算得到模型,涉及梯度下降、隨機梯度下降或者演化計算等優(yōu)化算法。在大部分傳統(tǒng)機器學習場景里,表示和目標是分離的。在用優(yōu)化算法求解目標的過程中,表示事物的特征是固定的,并不會根據(jù)目標和優(yōu)化的反饋自適應地調整特征。

神經(jīng)網(wǎng)絡或者說深度神經(jīng)網(wǎng)絡,將表示和目標結合起來進行 “聯(lián)合學習”。在深度學習模型訓練過程中,特征相關的參數(shù)(比如 CNN 卷積核的參數(shù))可以根據(jù)目標和優(yōu)化的反饋(梯度)自適應地調整。特征能夠自適應地調整,深度學習才有能力建立深度的和層次化的特征表達體系。
參考文獻
[1] Domingos, Pedro. “A few useful things to know about machine learning.” Communications of the ACM 55.10 (2012): 78-87.
【編輯推薦】