卷積神經網路(Convolutional,簡稱CNN)是一類特殊的人工神經網路,區別於神經網路其他模型(如,遞迴神經網路、Boltzmann機等),其最主要的特點是卷積運算操作(convolution operator)。因此,在諸多領 域應用特別是影象相關任務上表現優異,諸如,影象分類(image classification)、 影象語義分割(image semantic segmentation)、影象檢索(image retrieval)、 物體檢測(object detection)等計算機視覺問題。此外,隨著CNN研究的深 入,如自然語言處理(natural language processing)中的文字分類,軟體工程 資料探勘(software mining)中的軟體缺陷預測等問題都在嘗試利用卷積神經 網路解決,並取得了相比傳統方法甚至其他深度網路模型更優的預測效果。
一、基礎結構
總體來說,卷積神經網路是一種層次模型(hierarchial model),其輸入是原始資料(raw data),如RGB影象、原始音訊資料等。
卷積神經網路通過卷積(convolution)操作、匯合(pooling)操作和非線性啟用函式(non-linear activation function)對映等一系列操作的層層堆疊,將高層語義資訊逐層由原始資料輸入層中抽取出來,逐層抽象,這一過程便是“前饋運算”(feed-forward)。
其中,不同型別操作在卷積神經網路中一般稱作“層”:卷積操作對應“卷積層”,匯合操作對應“匯合層”等等。
最終,卷積神經網路的最後一層將其目標任務(分類、迴歸等)形式化為目標函式(objective) 。
通過計算預測值與真實值之間的誤差或損失(loss),憑藉反向傳播演算法(back-pripagation)將誤差或損失由最後一層逐層向前反饋(back-forward),更新每層引數,並在更新引數後再次前饋,如此往復,知道網路模型收斂,從而達到模型訓練的目的。
更通俗地講,卷積神經網路猶如搭積木的過程,見公式1.1如下:
將卷積等操作層作為“基本單元”依次“搭”在原始資料(公式1.1中的x1)上,逐層“堆砌”,以損失函式的計算(公式1.1中的 z )作為過程結束,其中每層資料形式是一個三維張量(tensor)。具體地,在計算機視覺應用中,卷積神經網路的資料層通常是RGB顏色空間的影象:H行,W列,3個通道(分別為R,G,B),在此記作x1。x1經過第一層操作可得 x2 .對應第一層操作中的引數記為 ω1 ;x2 作為第二層操作層 ω2 的輸入,可得 x3 .......直到第L-1層,此時網路輸出為 xL。
在上述的過程中,理論上每層操作層可為單獨卷積操作、匯合操作、非線性對映或其他操作變換,當然也可以是不同形式操作變換的組合。
最後,整個網路以損失函式的計算結束。若 y 是輸入 x1 對應的真實標記(ground truth),則損失函式表示如下公式1.2:
其中,函式L()中的引數即WL。事實上,可以發現對於層中的特定操作,其引數xi是可以為空的,如匯合操作、無參的非線性對映以及無參損失函 數的計算等。實際應用中,對於不同任務,損失函式的形式也隨之改變。以迴歸問題為例,常用的 L2 損失函式即可作為卷積網路的目標函式,此時有:
若對於分類問題,網路的目標函式常採用交叉熵(cross entropy)損失函式,有其中
C為分類任務類別數。顯然,無論迴歸問題還是分類問題,在計算Z前,均需要通過合適的操作得到與y同維度的xL,方可正確計算樣本預測的損失/誤差值。
二、前饋運算
無論訓練模型時計算誤差還是模型訓練完畢後獲得樣本預測,卷積神經網路的 前饋(feed-forward)運算都較直觀。同樣以影象分類任務為例,假設網路已訓練完畢,即其中引數ω1,...,ωL−1已收斂到某最優解,此時可用此網路進行影象類別預測。
預測過程實際就是一次網路的前饋運算:將測試集影象作為網路 輸入x1 送進網路,之後經過第一層操作 ω1 可得 x2,依此下去⋯⋯直至輸出xL ∈ RC。上一節提到,xL 是與真實標記同維度的向量。在利用交叉墒損失函 數訓練後得到的網路中,xL 的每一維可表示 x1 分別隸屬 C 個類別的後驗概率。如此,可通過下式得到輸入影象 x1 對應的預測標記如下公式1.3:
三、反饋運算
同其他許多機器學習模型(支援向量機等)一樣,卷積神經網路包括其他所有深度學習模型都依賴最小化損失函式來學習模型引數,即最小化式中的 z。 不過需指出的是,從凸優化理論來看,神經網路模型不僅是非凸(non-convex) 函式而且異常複雜,這便帶來優化求解的困難。該情形下,深度學習模型採用 隨機梯度下降法(Stochastic Gradient Descent簡記為SGD)和誤差反向傳播 (error back propogation)進行模型引數更新。
具體來講,在卷積神經網路求解時,特別是針對大規模應用問題(如, 分類或檢測任務),常採用批處理的隨機梯度下降法(mini-batch SGD)。批處理的隨機梯度下降法在訓練模型階段隨機選取 n 個樣本作為一批(batch)樣本,先通過前饋運算得到預測並計算其誤差,後通過梯度下降法更新引數,梯度從後往前逐層反饋,直至更新到網路的第一層引數,這樣的一個 引數更新過程稱為一個“批處理過程”(mini-batch)。不同批處理之間按照無放 回抽樣遍歷所有訓練集樣本,遍歷一次訓練樣本稱為“一輪”(epoch)。其中,批處理樣本的大小(batch size)不宜設定過小。過小時(如batch size為1,2 等),由於樣本取樣隨機,按照該樣本上的誤差更新模型引數不一定在全域性上最優(此時僅為區域性最優更新),會使得訓練過程產生振盪。而批處理大小的上限 則主要取決於硬體資源的限制,如GPU視訊記憶體大小。一般而言,批處理大小設 為32,64,128或256即可。當然在隨機梯度下降更新引數時,還有不同的引數更新策略。
下面我們來看誤差反向傳播的詳細過程,假設某批處理前饋後得到 n 個樣本上的誤差為 z,且最後一層 L 為 l2 損失函式,則易得公式1.4、1.5:
不難發現,實際上每層操作都對應了兩部分導數:一部分是誤差關於第 i 層引數ωi 的導數
,另一部分是誤差關於該層輸入的導數 。其中,- 關於引數 ωi 的導數用於該層引數更新,η 是每次隨機梯度下降的步長,一般隨訓練輪數(epoch)的增多減小,見公式1.6
- 關於輸入 xi 的導數則用於誤差向前層的反向傳播。可將其視作最終 ∂x 誤差從最後一層傳遞至第 i 層的誤差訊號。
下面以第 i 層引數更新為例。當誤差更新訊號(導數)反向傳播至第 i 層時, 第 i+1 層的誤差導數為
,第 i 層引數更新時需計算 和它的對應值。根據鏈式法則,可得公式1.7、1.8:此處使用向量標記“vec”是由於實際工程實現時張量運算均轉化為向量運算。前面提到,由於第 i + 1 層時已計算得到
在第 i 層用於更新該層引數時僅需對其做向量化和轉置操作即可得到 即公式1.7和1.8中等號右端的左項。另一方面,在第 i 層,由於 xi 經 ωi 直接作用得 x i+1,故反向求導時亦可直接得到其偏導數 ∂和 如此,可求得公式1.7和1.8中等號左端項 和 。後根據式 1.6更新該層引數,並將 作為該層誤差傳至前層,即第 i − 1 層,如此下去, 直至更新到第1層,從而完成一個批處理(mini-batch)的引數更新。
當然,上述方法是通過手動書寫導數並用鏈式法則計算最終誤差對每層不 同引數的梯度,之後仍需通過程式碼將其實現。可見這一過程不僅繁瑣,且容易 出錯,特別是對一些複雜操作,其導數很難求得甚至無法顯式寫出。針對這種 情況,一些深度學習庫,如Theano和Tensorflow都採用了符號微分的方法進行自動求導來訓練模型。符號微分可以在編譯時就計算導數的數學表示,並進一步利用符號計算方式進行優化。在實際應用時,使用者只需把精力放在模型構建和前向程式碼書寫上,不用擔心複雜的梯度求導過程。不過,在此需指出的是,讀者有必要對上述反向梯度傳播過程瞭解,也要有能力求得正確的導數形式。