1. 程式人生 > >系統學習深度學習(四) --CNN原理,推導及實現原始碼分析

系統學習深度學習(四) --CNN原理,推導及實現原始碼分析

之前看機器學習中,多層感知器部分,提到可以在設計多層感知器時,對NN的結構設計優化,例如結構化設計和權重共享,當時還沒了解深度學習,現在看到CNN,原來CNN就是這方面的一個代表。CNN由紐約大學的Yann LeCun於1998年提出。CNN本質上是一個多層感知機,其成功的原因關鍵在於它所採用的區域性連線和共享權值的方式,一方面減少了的權值的數量使得網路易於優化,另一方面降低了過擬合的風險。

下面內容可能有點重複囉嗦,主要是因為學習過程中, 總在不同文章看到一些新的,未知的東西,但同時又有很多重複。(最重要的是因為自己懶,,,)

另外:http://cs.stanford.edu/people/karpathy/convnetjs/demo/mnist.html CNN動態演示。

轉自:http://blog.csdn.net/zouxy09/article/details/8781543/

1.Convolutional Neural Networks卷積神經網路

       卷積神經網路是人工神經網路的一種,已成為當前語音分析和影象識別領域的研究熱點。它的權值共享網路結構使之更類似於生物神經網路,降低了網路模型的複雜度,減少了權值的數量。該優點在網路的輸入是多維影象時表現的更為明顯,使影象可以直接作為網路的輸入,避免了傳統識別演算法中複雜的特徵提取和資料重建過程。在二維影象處理上有眾多優勢,如網路能自行抽取影象特徵包括顏色、紋理、形狀及影象的拓撲結構;在處理二維影象問題上,特別是識別位移、縮放及其它形式扭曲不變性的應用上具有良好的魯棒性和運算效率等。卷積網路是為識別二維形狀而特殊設計的一個多層感知器,這種網路結構對平移、比例縮放、傾斜或者共他形式的變形具有高度不變性。

       CNNs是受早期的延時神經網路(TDNN)的影響。延時神經網路通過在時間維度上共享權值降低學習複雜度,適用於語音和時間序列訊號的處理。

       CNNs是第一個真正成功訓練多層網路結構的學習演算法。它利用空間關係減少需要學習的引數數目以提高一般前向BP演算法的訓練效能。CNNs作為一個深度學習架構提出是為了最小化資料的預處理要求。在CNN中,影象的一小部分(區域性感受區域)作為層級結構的最低層的輸入,資訊再依次傳輸到不同的層,每層通過一個數字濾波器去獲得觀測資料的最顯著的特徵。這個方法能夠獲取對平移、縮放和旋轉不變的觀測資料的顯著特徵,因為影象的區域性感受區域允許神經元或者處理單元可以訪問到最基礎的特徵,例如定向邊緣或者角點。

CNN具有一些傳統技術所沒有的優點:良好的容錯能力、並行處理能力和自學習能力,可處理環境資訊複雜,背景知識不清楚,推理規則不明確情況下的問題,允許樣品有較大的缺損、畸變,執行速度快,自適應效能好,具有較高的解析度。它是通過結構重組和減少權值將特徵抽取功能融合進多層感知器,省略識別前複雜的影象特徵抽取過程。

         CNN的泛化能力要顯著優於其它方法,卷積神經網路已被應用於模式分類,物體檢測和物體識別等方面。利用卷積神經網路建立模式分類器,將卷積神經網路作為通用的模式分類器,直接用於灰度影象。

         CNN是一個前潰式神經網路,能從一個二維影象中提取其拓撲結構,採用反向傳播演算法來優化網路結構,求解網路中的未知引數。

CNN是一類特別設計用來處理二維資料的多層神經網路。CNN被認為是第一個真正成功的採用多層層次結構網路的具有魯棒性的深度學習方法。CNN通過挖掘資料中的空間上的相關性,來減少網路中的可訓練引數的數量,達到改進前向傳播網路的反向傳播演算法效率,因為CNN需要非常少的資料預處理工作,所以也被認為是一種深度學習的方法。在CNN中,影象中的小塊區域(也叫做“區域性感知區域”)被當做層次結構中的底層的輸入資料,資訊通過前向傳播經過網路中的各個層,在每一層中都由過濾器構成,以便能夠獲得觀測資料的一些顯著特徵。因為區域性感知區域能夠獲得一些基礎的特徵,比如影象中的邊界和角落等,這種方法能夠提供一定程度對位移、拉伸和旋轉的相對不變性。

         CNN中層次之間的緊密聯絡和空間資訊使得其特別適用於影象的處理和理解,並且能夠自動的從影象抽取出豐富的相關特性。

         CNN通過結合區域性感知區域、共享權重、空間或者時間上的降取樣來充分利用資料本身包含的區域性性等特徵,優化網路結構,並且保證一定程度上的位移和變形的不變性。

CNN受視覺神經機制的啟發而設計,是為識別二維或三維訊號而設計的一個多層感知器,這種網路結構對平移、縮放、傾斜等變形具有高度不變性。

         CNN可以用來識別位移、縮放及其它形式扭曲不變性的二維或三維影象。CNN的特徵提取層引數是通過訓練資料學習得到的,所以其避免了人工特徵提取,而是從訓練資料中進行學習;其次同一特徵圖的神經元共享權值,減少了網路引數,這也是卷積網路相對於全連線網路的一大優勢。共享區域性權值這一特殊結構更接近於真實的生物神經網路使CNN在影象處理、語音識別領域有著獨特的優越性,另一方面權值共享同時降低了網路的複雜性,且多維輸入訊號(語音、影象)可以直接輸入網路的特點避免了特徵提取和分類過程中資料重排的過程。

CNN是一種特殊的深層的神經網路模型,它的特殊性體現在兩個方面,一方面它的神經元的連線是非全連線的,另一方面同一層中某些神經元之間的連線的權重是共享的(即相同的)。它的非全連線和權值共享的網路結構使之更類似於生物神經網路,降低了網路模型的複雜度(對於很難學習的深層結構來說,這是非常重要的),減少了權值的數量。

CNN是一種深度的監督學習下的機器學習模型,具有極強的適應性,善於挖掘資料區域性特徵,提取全域性訓練特徵和分類,它的權值共享結構網路使之更類似於生物神經網路,在模式識別各個領域都取得了很好的成果。

稀疏連線:在BP神經網路中,每一層的神經元節點是一個線性一維排列結構,層與層各神經元節點之間是全連線的。卷積神經網路中,層與層之間的神經元節點不再是全連線形式,利用層間區域性空間相關性將相鄰每一層的神經元節點只與和它相近的上層神經元節點連線,即區域性連線。這樣大大降低了神經網路架構的引數規模。

權重共享:在卷積神經網路中,卷積層的每一個卷積濾波器重複的作用於整個感受野中,對輸入影象進行卷積,卷積結果構成了輸入影象的特徵圖,提取出影象的區域性特徵。每一個卷積濾波器共享相同的引數,包括相同的權重矩陣和偏置項。共享權重的好處是在對影象進行特徵提取時不用考慮區域性特徵的位置。而且權重共享提供了一種有效的方式,使要學習的卷積神經網路模型引數數量大大降低。

最大池取樣:它是一種非線性降取樣方法。在通過卷積獲取影象特徵之後是利用這些特徵進行分類。可以用所有提取到的特徵資料進行分類器的訓練,但這通常會產生極大的計算量。所以在獲取影象的卷積特徵後,要通過最大池取樣方法對卷積特徵進行降維。將卷積特徵劃分為數個n*n的不相交區域,用這些區域的最大(或平均)特徵來表示降維後的卷積特徵。這些降維後的特徵更容易進行分類

最大池取樣在計算機視覺中的價值體現在兩個方面:(1)、它減小了來自上層隱藏層的計算複雜度;(2)、這些池化單元具有平移不變性,即使影象有小的位移,提取到的特徵依然會保持不變。由於增強了對位移的魯棒性,最大池取樣方法是一個高效的降低資料維度的取樣方法。

Softmax迴歸:它是在邏輯迴歸的基礎上擴張而來,它的目的是為了解決多分類問題。在這類問題中,訓練樣本的種類一般在兩個以上。Softmax迴歸是有監督學習演算法,它也可以與深度學習或無監督學習方法結合使用。

CNN是一種帶有卷積結構的深度神經網路,通常至少有兩個非線性可訓練的卷積層,兩個非線性的固定卷積層(又叫Pooling Laye)和一個全連線層,一共至少5個隱含層。

卷積神經網路中,輸入就是一幅幅的影象,權值W就是卷積模板,一般是卷積層和下采樣層交替,最後是全連線的神經網路。

區域性區域感知能夠發現數據的一些區域性特徵,比如圖片上的一個角,一段弧,這些基本特徵是構成動物視覺的基礎。

CNN中每一層的由多個map組成,每個map由多個神經單元組成,同一個map的所有神經單元共用一個卷積核(即權重),卷積核往往代表一個特徵,比如某個卷積核代表一段弧,那麼把這個卷積核在整個圖片上滾一下,卷積值較大的區域就很有可能是一段弧。注意卷積核其實就是權重,我們並不需要單獨去計算一個卷積,而是一個固定大小的權重矩陣去影象上匹配時,這個操作與卷積類似,因此我們稱為卷積神經網路,實際上,BP也可以看作一種特殊的卷積神經網路,只是這個卷積核就是某層的所有權重,即感知區域是整個影象。權重共享策略減少了需要訓練的引數,使得訓練出來的模型的泛華能力更強。

CNN一般採用卷積層與取樣層交替設定,即一層卷積層接一層取樣層,取樣層後接一層卷積...這樣卷積層提取出特徵,再進行組合形成更抽象的特徵,最後形成對圖片物件的描述特徵,CNN後面還可以跟全連線層,全連線層跟BP一樣。

CNN的最大特點就是稀疏連線(區域性感受)和權值共享。稀疏連線和權值共享可以減少所要訓練的引數,減少計算複雜度。

卷積神經網路是一個多層的神經網路,每層由多個二維平面組成,而每個平面由多個獨立神經元組成。

卷積網路在本質上是一種輸入到輸出的對映,它能夠學習大量的輸入與輸出之間的對映關係,而不需要任何輸入和輸出之間的精確的數學表示式,只要用已知的模式對卷積網路加以訓練,網路就具有輸入輸出對之間的對映能力。卷積網路執行的是有導師訓練,所以其樣本集是由形如:(輸入向量,理想輸出向量)的向量對構成的。所有這些向量對,都應該是來源於網路即將模擬的系統的實際“執行”結果。它們可以是從實際執行系統中採集來的。在開始訓練前,所有的權都應該用一些不同的小隨機數進行初始化。“小隨機數”用來保證網路不會因權值過大而進入飽和狀態,從而導致訓練失敗;“不同”用來保證網路可以正常地學習。實際上,如果用相同的數去初始化權矩陣,則網路無能力學習。訓練演算法與傳統的BP演算法差不多。

1)卷積神經網路的歷史

       1962年Hubel和Wiesel通過對貓視覺皮層細胞的研究,提出了感受野(receptive field)的概念,1984年日本學者Fukushima基於感受野概念提出的神經認知機(neocognitron)可以看作是卷積神經網路的第一個實現網路,也是感受野概念在人工神經網路領域的首次應用。神經認知機將一個視覺模式分解成許多子模式(特徵),然後進入分層遞階式相連的特徵平面進行處理,它試圖將視覺系統模型化,使其能夠在即使物體有位移或輕微變形的時候,也能完成識別。

       通常神經認知機包含兩類神經元,即承擔特徵抽取的S-元和抗變形的C-元。S-元中涉及兩個重要引數,即感受野與閾值引數,前者確定輸入連線的數目,後者則控制對特徵子模式的反應程度。許多學者一直致力於提高神經認知機的效能的研究:在傳統的神經認知機中,每個S-元的感光區中由C-元帶來的視覺模糊量呈正態分佈。如果感光區的邊緣所產生的模糊效果要比中央來得大,S-元將會接受這種非正態模糊所導致的更大的變形容忍性。我們希望得到的是,訓練模式與變形刺激模式在感受野的邊緣與其中心所產生的效果之間的差異變得越來越大。為了有效地形成這種非正態模糊,Fukushima提出了帶雙C-元層的改進型神經認知機。

       Van Ooyen和Niehuis為提高神經認知機的區別能力引入了一個新的引數。事實上,該引數作為一種抑制訊號,抑制了神經元對重複激勵特徵的激勵。多數神經網路在權值中記憶訓練資訊。根據Hebb學習規則,某種特徵訓練的次數越多,在以後的識別過程中就越容易被檢測。也有學者將進化計算理論與神經認知機結合,通過減弱對重複性激勵特徵的訓練學習,而使得網路注意那些不同的特徵以助於提高區分能力。上述都是神經認知機的發展過程,而卷積神經網路可看作是神經認知機的推廣形式,神經認知機是卷積神經網路的一種特例。

2)卷積神經網路的網路結構

      卷積神經網路是一個多層的神經網路,每層由多個二維平面組成,而每個平面由多個獨立神經元組成。

       圖:卷積神經網路的概念示範:輸入影象通過和三個可訓練的濾波器和可加偏置進行卷積,濾波過程如圖一,卷積後在C1層產生三個特徵對映圖,然後特徵對映圖中每組的四個畫素再進行求和,加權值,加偏置,通過一個Sigmoid函式得到三個S2層的特徵對映圖。這些對映圖再進過濾波得到C3層。這個層級結構再和S2一樣產生S4。最終,這些畫素值被光柵化,並連線成一個向量輸入到傳統的神經網路,得到輸出。

       一般地,C層為特徵提取層,每個神經元的輸入與前一層的區域性感受野相連,並提取該區域性的特徵,一旦該區域性特徵被提取後,它與其他特徵間的位置關係也隨之確定下來;S層是特徵對映層,網路的每個計算層由多個特徵對映組成,每個特徵對映為一個平面,平面上所有神經元的權值相等。特徵對映結構採用影響函式核小的sigmoid函式作為卷積網路的啟用函式,使得特徵對映具有位移不變性。

       此外,由於一個對映面上的神經元共享權值,因而減少了網路自由引數的個數,降低了網路引數選擇的複雜度。卷積神經網路中的每一個特徵提取層(C-層)都緊跟著一個用來求區域性平均與二次提取的計算層(S-層),這種特有的兩次特徵提取結構使網路在識別時對輸入樣本有較高的畸變容忍能力。

3)關於引數減少與權值共享

      上面聊到,好像CNN一個牛逼的地方就在於通過感受野和權值共享減少了神經網路需要訓練的引數的個數。那究竟是啥的呢?

       下圖左:如果我們有1000x1000畫素的影象,有1百萬個隱層神經元,那麼他們全連線的話(每個隱層神經元都連線影象的每一個畫素點),就有1000x1000x1000000=10^12個連線,也就是10^12個權值引數。然而影象的空間聯絡是區域性的,就像人是通過一個區域性的感受野去感受外界影象一樣,每一個神經元都不需要對全域性影象做感受,每個神經元只感受區域性的影象區域,然後在更高層,將這些感受不同區域性的神經元綜合起來就可以得到全域性的資訊了。這樣,我們就可以減少連線的數目,也就是減少神經網路需要訓練的權值引數的個數了。如下圖右:假如區域性感受野是10x10,隱層每個感受野只需要和這10x10的區域性影象相連線,所以1百萬個隱層神經元就只有一億個連線,即10^8個引數。比原來減少了四個0(數量級),這樣訓練起來就沒那麼費力了,但還是感覺很多的啊,那還有啥辦法沒?

 

       我們知道,隱含層的每一個神經元都連線10x10個影象區域,也就是說每一個神經元存在10x10=100個連線權值引數。那如果我們每個神經元這100個引數是相同的呢?也就是說每個神經元用的是同一個卷積核去卷積影象。這樣我們就只有多少個引數??只有100個引數啊!!!親!不管你隱層的神經元個數有多少,兩層間的連線我只有100個引數啊!親!這就是權值共享啊!親!這就是卷積神經網路的主打賣點啊!親!(有點煩了,呵呵)也許你會問,這樣做靠譜嗎?為什麼可行呢?這個……共同學習。

       好了,你就會想,這樣提取特徵也忒不靠譜吧,這樣你只提取了一種特徵啊?對了,真聰明,我們需要提取多種特徵對不?假如一種濾波器,也就是一種卷積核就是提出影象的一種特徵,例如某個方向的邊緣。那麼我們需要提取不同的特徵,怎麼辦,加多幾種濾波器不就行了嗎?對了。所以假設我們加到100種濾波器,每種濾波器的引數不一樣,表示它提出輸入影象的不同特徵,例如不同的邊緣。這樣每種濾波器去卷積影象就得到對影象的不同特徵的放映,我們稱之為Feature Map。所以100種卷積核就有100個Feature Map。這100個Feature Map就組成了一層神經元。到這個時候明瞭了吧。我們這一層有多少個引數了?100種卷積核x每種卷積核共享100個引數=100x100=10K,也就是1萬個引數。才1萬個引數啊!親!(又來了,受不了了!)見下圖右:不同的顏色表達不同的濾波器。

 

       嘿喲,遺漏一個問題了。剛才說隱層的引數個數和隱層的神經元個數無關,只和濾波器的大小和濾波器種類的多少有關。那麼隱層的神經元個數怎麼確定呢?它和原影象,也就是輸入的大小(神經元個數)、濾波器的大小和濾波器在影象中的滑動步長都有關!例如,我的影象是1000x1000畫素,而濾波器大小是10x10,假設濾波器沒有重疊,也就是步長為10,這樣隱層的神經元個數就是(1000x1000 )/ (10x10)=100x100個神經元了,假設步長是8,也就是卷積核會重疊兩個畫素,那麼……我就不算了,思想懂了就好。注意了,這只是一種濾波器,也就是一個Feature Map的神經元個數哦,如果100個Feature Map就是100倍了。由此可見,影象越大,神經元個數和需要訓練的權值引數個數的貧富差距就越大。

 

      需要注意的一點是,上面的討論都沒有考慮每個神經元的偏置部分。所以權值個數需要加1 。這個也是同一種濾波器共享的。

      總之,卷積網路的核心思想是將:區域性感受野、權值共享(或者權值複製)以及時間或空間亞取樣這三種結構思想結合起來獲得了某種程度的位移、尺度、形變不變性。

4)一個典型的例子說明

       一種典型的用來識別數字的卷積網路是LeNet-5(效果和paper等見這)。當年美國大多數銀行就是用它來識別支票上面的手寫數字的。能夠達到這種商用的地步,它的準確性可想而知。畢竟目前學術界和工業界的結合是最受爭議的。

      那下面咱們也用這個例子來說明下。

        LeNet-5共有7層,不包含輸入,每層都包含可訓練引數(連線權重)。輸入影象為32*32大小。這要比Mnist資料庫(一個公認的手寫資料庫)中最大的字母還大。這樣做的原因是希望潛在的明顯特徵如筆畫斷電或角點能夠出現在最高層特徵監測子感受野的中心。

        我們先要明確一點:每個層有多個Feature Map,每個Feature Map通過一種卷積濾波器提取輸入的一種特徵,然後每個Feature Map有多個神經元。

        C1層是一個卷積層(為什麼是卷積?卷積運算一個重要的特點就是,通過卷積運算,可以使原訊號特徵增強,並且降低噪音),由6個特徵圖Feature Map構成。特徵圖中每個神經元與輸入中5*5的鄰域相連。特徵圖的大小為28*28,這樣能防止輸入的連線掉到邊界之外(是為了BP反饋時的計算,不致梯度損失,個人見解)。C1有156個可訓練引數(每個濾波器5*5=25個unit引數和一個bias引數,一共6個濾波器,共(5*5+1)*6=156個引數),共156*(28*28)=122,304個連線。

       S2層是一個下采樣層(為什麼是下采樣?利用影象區域性相關性的原理,對影象進行子抽樣,可以減少資料處理量同時保留有用資訊),有6個14*14的特徵圖。特徵圖中的每個單元與C1中相對應特徵圖的2*2鄰域相連線。S2層每個單元的4個輸入相加,乘以一個可訓練引數,再加上一個可訓練偏置。結果通過sigmoid函式計算。可訓練係數和偏置控制著sigmoid函式的非線性程度。如果係數比較小,那麼運算近似於線性運算,亞取樣相當於模糊影象。如果係數比較大,根據偏置的大小亞取樣可以被看成是有噪聲的“或”運算或者有噪聲的“與”運算。每個單元的2*2感受野並不重疊,因此S2中每個特徵圖的大小是C1中特徵圖大小的1/4(行和列各1/2)。S2層有12個可訓練引數和5880個連線。

圖:卷積和子取樣過程:卷積過程包括:用一個可訓練的濾波器fx去卷積一個輸入的影象(第一階段是輸入的影象,後面的階段就是卷積特徵map了),然後加一個偏置bx,得到卷積層Cx。子取樣過程包括:每鄰域四個畫素求和變為一個畫素,然後通過標量Wx+1加權,再增加偏置bx+1,然後通過一個sigmoid啟用函式,產生一個大概縮小四倍的特徵對映圖Sx+1。

       所以從一個平面到下一個平面的對映可以看作是作卷積運算,S-層可看作是模糊濾波器,起到二次特徵提取的作用。隱層與隱層之間空間解析度遞減,而每層所含的平面數遞增,這樣可用於檢測更多的特徵資訊。

       C3層也是一個卷積層,它同樣通過5x5的卷積核去卷積層S2,然後得到的特徵map就只有10x10個神經元,但是它有16種不同的卷積核,所以就存在16個特徵map了。這裡需要注意的一點是:C3中的每個特徵map是連線到S2中的所有6個或者幾個特徵map的,表示本層的特徵map是上一層提取到的特徵map的不同組合(這個做法也並不是唯一的)。(看到沒有,這裡是組合,就像之前聊到的人的視覺系統一樣,底層的結構構成上層更抽象的結構,例如邊緣構成形狀或者目標的部分)。

       剛才說C3中每個特徵圖由S2中所有6個或者幾個特徵map組合而成。為什麼不把S2中的每個特徵圖連線到每個C3的特徵圖呢?原因有2點。第一,不完全的連線機制將連線的數量保持在合理的範圍內。第二,也是最重要的,其破壞了網路的對稱性。由於不同的特徵圖有不同的輸入,所以迫使他們抽取不同的特徵(希望是互補的)。

      例如,存在的一個方式是:C3的前6個特徵圖以S2中3個相鄰的特徵圖子集為輸入。接下來6個特徵圖以S2中4個相鄰特徵圖子集為輸入。然後的3個以不相鄰的4個特徵圖子集為輸入。最後一個將S2中所有特徵圖為輸入。這樣C3層有1516個可訓練引數和151600個連線。

       S4層是一個下采樣層,由16個5*5大小的特徵圖構成。特徵圖中的每個單元與C3中相應特徵圖的2*2鄰域相連線,跟C1和S2之間的連線一樣。S4層有32個可訓練引數(每個特徵圖1個因子和一個偏置)和2000個連線。

       C5層是一個卷積層,有120個特徵圖。每個單元與S4層的全部16個單元的5*5鄰域相連。由於S4層特徵圖的大小也為5*5(同濾波器一樣),故C5特徵圖的大小為1*1:這構成了S4和C5之間的全連線。之所以仍將C5標示為卷積層而非全相聯層,是因為如果LeNet-5的輸入變大,而其他的保持不變,那麼此時特徵圖的維數就會比1*1大。C5層有48120個可訓練連線。

        F6層有84個單元(之所以選這個數字的原因來自於輸出層的設計),與C5層全相連。有10164個可訓練引數。如同經典神經網路,F6層計算輸入向量和權重向量之間的點積,再加上一個偏置。然後將其傳遞給sigmoid函式產生單元i的一個狀態。

      最後,輸出層由歐式徑向基函式(Euclidean Radial Basis Function)單元組成,每類一個單元,每個有84個輸入。換句話說,每個輸出RBF單元計算輸入向量和引數向量之間的歐式距離。輸入離引數向量越遠,RBF輸出的越大。一個RBF輸出可以被理解為衡量輸入模式和與RBF相關聯類的一個模型的匹配程度的懲罰項。用概率術語來說,RBF輸出可以被理解為F6層配置空間的高斯分佈的負log-likelihood。給定一個輸入模式,損失函式應能使得F6的配置與RBF引數向量(即模式的期望分類)足夠接近。這些單元的引數是人工選取並保持固定的(至少初始時候如此)。這些引數向量的成分被設為-1或1。雖然這些引數可以以-1和1等概率的方式任選,或者構成一個糾錯碼,但是被設計成一個相應字元類的7*12大小(即84)的格式化圖片。這種表示對識別單獨的數字不是很有用,但是對識別可列印ASCII集中的字串很有用。

      使用這種分佈編碼而非更常用的“1 of N”編碼用於產生輸出的另一個原因是,當類別比較大的時候,非分佈編碼的效果比較差。原因是大多數時間非分佈編碼的輸出必須為0。這使得用sigmoid單元很難實現。另一個原因是分類器不僅用於識別字母,也用於拒絕非字母。使用分佈編碼的RBF更適合該目標。因為與sigmoid不同,他們在輸入空間的較好限制的區域內興奮,而非典型模式更容易落到外邊。

        RBF引數向量起著F6層目標向量的角色。需要指出這些向量的成分是+1或-1,這正好在F6 sigmoid的範圍內,因此可以防止sigmoid函式飽和。實際上,+1和-1是sigmoid函式的最大彎曲的點處。這使得F6單元執行在最大非線性範圍內。必須避免sigmoid函式的飽和,因為這將會導致損失函式較慢的收斂和病態問題。

5)訓練過程

        神經網路用於模式識別的主流是有指導學習網路,無指導學習網路更多的是用於聚類分析。對於有指導的模式識別,由於任一樣本的類別是已知的,樣本在空間的分佈不再是依據其自然分佈傾向來劃分,而是要根據同類樣本在空間的分佈及不同類樣本之間的分離程度找一種適當的空間劃分方法,或者找到一個分類邊界,使得不同類樣本分別位於不同的區域內。這就需要一個長時間且複雜的學習過程,不斷調整用以劃分樣本空間的分類邊界的位置,使盡可能少的樣本被劃分到非同類區域中。

       卷積網路在本質上是一種輸入到輸出的對映,它能夠學習大量的輸入與輸出之間的對映關係,而不需要任何輸入和輸出之間的精確的數學表示式,只要用已知的模式對卷積網路加以訓練,網路就具有輸入輸出對之間的對映能力。卷積網路執行的是有導師訓練,所以其樣本集是由形如:(輸入向量,理想輸出向量)的向量對構成的。所有這些向量對,都應該是來源於網路即將模擬的系統的實際“執行”結果。它們可以是從實際執行系統中採集來的。在開始訓練前,所有的權都應該用一些不同的小隨機數進行初始化。“小隨機數”用來保證網路不會因權值過大而進入飽和狀態,從而導致訓練失敗;“不同”用來保證網路可以正常地學習。實際上,如果用相同的數去初始化權矩陣,則網路無能力學習。

       訓練演算法與傳統的BP演算法差不多。主要包括4步,這4步被分為兩個階段:

第一階段,向前傳播階段:

a)從樣本集中取一個樣本(X,Yp),將X輸入網路;

b)計算相應的實際輸出Op。

      在此階段,資訊從輸入層經過逐級的變換,傳送到輸出層。這個過程也是網路在完成訓練後正常執行時執行的過程。在此過程中,網路執行的是計算(實際上就是輸入與每層的權值矩陣相點乘,得到最後的輸出結果):

          Op=Fn(…(F2(F1(XpW(1))W(2))…)W(n))

第二階段,向後傳播階段

a)算實際輸出Op與相應的理想輸出Yp的差;

b)按極小化誤差的方法反向傳播調整權矩陣。

6)卷積神經網路的優點

        卷積神經網路CNN主要用來識別位移、縮放及其他形式扭曲不變性的二維圖形。由於CNN的特徵檢測層通過訓練資料進行學習,所以在使用CNN時,避免了顯式的特徵抽取,而隱式地從訓練資料中進行學習;再者由於同一特徵對映面上的神經元權值相同,所以網路可以並行學習,這也是卷積網路相對於神經元彼此相連網路的一大優勢。卷積神經網路以其區域性權值共享的特殊結構在語音識別和影象處理方面有著獨特的優越性,其佈局更接近於實際的生物神經網路,權值共享降低了網路的複雜性,特別是多維輸入向量的影象可以直接輸入網路這一特點避免了特徵提取和分類過程中資料重建的複雜度。

        流的分類方式幾乎都是基於統計特徵的,這就意味著在進行分辨前必須提取某些特徵。然而,顯式的特徵提取並不容易,在一些應用問題中也並非總是可靠的。卷積神經網路,它避免了顯式的特徵取樣,隱式地從訓練資料中進行學習。這使得卷積神經網路明顯有別於其他基於神經網路的分類器,通過結構重組和減少權值將特徵提取功能融合進多層感知器。它可以直接處理灰度圖片,能夠直接用於處理基於影象的分類。

       卷積網路較一般神經網路在影象處理方面有如下優點: a)輸入影象和網路的拓撲結構能很好的吻合;b)特徵提取和模式分類同時進行,並同時在訓練中產生;c)權重共享可以減少網路的訓練引數,使神經網路結構變得更簡單,適應性更強。

下面是推導和實現

         這個文件討論的是CNNs的推導和實現。CNN架構的連線比權值要多很多,這實際上就隱含著實現了某種形式的規則化。這種特別的網路假定了我們希望通過資料驅動的方式學習到一些濾波器,作為提取輸入的特徵的一種方法。

         本文中,我們先對訓練全連線網路的經典BP演算法做一個描述,然後推導2D CNN網路的卷積層和子取樣層的BP權值更新方法。在推導過程中,我們更強調實現的效率,所以會給出一些Matlab程式碼。最後,我們轉向討論如何自動地學習組合前一層的特徵maps,特別地,我們還學習特徵maps的稀疏組合。

、全連線的反向傳播演算法

         典型的CNN中,開始幾層都是卷積和下采樣的交替,然後在最後一些層(靠近輸出層的),都是全連線的一維網路。這時候我們已經將所有兩維2D的特徵maps轉化為全連線的一維網路的輸入。這樣,當你準備好將最終的2D特徵maps輸入到1D網路中時,一個非常方便的方法就是把所有輸出的特徵maps連線成一個長的輸入向量。然後我們回到BP演算法的討論。(更詳細的基礎推導可以參考UFLDL中“反向傳導演算法”)。

2.1、Feedforward Pass前向傳播

         在下面的推導中,我們採用平方誤差代價函式。我們討論的是多類問題,共c類,共N個訓練樣本。

         這裡表示第n個樣本對應的標籤的第k維。表示第n個樣本對應的網路輸出的第k個輸出。對於多類問題,輸出一般組織為“one-of-c”的形式,也就是隻有該輸入對應的類的輸出節點輸出為正,其他類的位或者節點為0或者負數,這個取決於你輸出層的啟用函式。sigmoid就是0,tanh就是-1.

         因為在全部訓練集上的誤差只是每個訓練樣本的誤差的總和,所以這裡我們先考慮對於一個樣本的BP。對於第n個樣本的誤差,表示為:

       傳統的全連線神經網路中,我們需要根據BP規則計算代價函式E關於網路每一個權值的偏導數。我們用l來表示當前層,那麼當前層的輸出可以表示為:

       輸出啟用函式f(.)可以有很多種,一般是sigmoid函式或者雙曲線正切函式。sigmoid將輸出壓縮到[0, 1],所以最後的輸出平均值一般趨於0 。所以如果將我們的訓練資料歸一化為零均值和方差為1,可以在梯度下降的過程中增加收斂性。對於歸一化的資料集來說,雙曲線正切函式也是不錯的選擇。

2.2、Backpropagation Pass反向傳播

         反向傳播回來的誤差可以看做是每個神經元的基的靈敏度sensitivities(靈敏度的意思就是我們的基b變化多少,誤差會變化多少,也就是誤差對基的變化率,也就是導數了),定義如下:(第二個等號是根據求導的鏈式法則得到的)

         因為∂u/∂b=1,所以∂E/∂b=∂E/∂u=δ,也就是說bias基的靈敏度∂E/∂b=δ和誤差E對一個節點全部輸入u的導數∂E/∂u是相等的。這個導數就是讓高層誤差反向傳播到底層的神來之筆。反向傳播就是用下面這條關係式:(下面這條式子表達的就是第l層的靈敏度,就是)

 公式(1

         這裡的“◦”表示每個元素相乘。輸出層的神經元的靈敏度是不一樣的:

         最後,對每個神經元運用delta(即δ)規則進行權值更新。具體來說就是,對一個給定的神經元,得到它的輸入,然後用這個神經元的delta(即δ)來進行縮放。用向量的形式表述就是,對於第l層,誤差對於該層每一個權值(組合為矩陣)的導數是該層的輸入(等於上一層的輸出)與該層的靈敏度(該層每個神經元的δ組合成一個向量的形式)的叉乘。然後得到的偏導數乘以一個負學習率就是該層的神經元的權值的更新了:

 公式(2

         對於bias基的更新表示式差不多。實際上,對於每一個權值(W)ij都有一個特定的學習率ηIj。

、Convolutional Neural Networks 卷積神經網路

2.1、Convolution Layers 卷積層

         我們現在關注網路中卷積層的BP更新。在一個卷積層,上一層的特徵maps被一個可學習的卷積核進行卷積,然後通過一個啟用函式,就可以得到輸出特徵map。每一個輸出map可能是組合卷積多個輸入maps的值:

       這裡Mj表示選擇的輸入maps的集合,那麼到底選擇哪些輸入maps呢?有選擇一對的或者三個的。但下面我們會討論如何去自動選擇需要組合的特徵maps。每一個輸出map會給一個額外的偏置b,但是對於一個特定的輸出map,卷積每個輸入maps的卷積核是不一樣的。也就是說,如果輸出特徵map j和輸出特徵map k都是從輸入map i中卷積求和得到,那麼對應的卷積核是不一樣的。

2.1.1、Computing the Gradients梯度計算

         我們假定每個卷積層l都會接一個下采樣層l+1 。對於BP來說,根據上文我們知道,要想求得層l的每個神經元對應的權值的權值更新,就需要先求層l的每一個神經節點的靈敏度δ(也就是權值更新的公式(2))。為了求這個靈敏度我們就需要先對下一層的節點(連線到當前層l的感興趣節點的第l+1層的節點)的靈敏度求和(得到δl+1),然後乘以這些連線對應的權值(連線第l層感興趣節點和第l+1層節點的權值)W。再乘以當前層l的該神經元節點的輸入u的啟用函式f的導數值(也就是那個靈敏度反向傳播的公式(1)的δl的求解),這樣就可以得到當前層l每個神經節點對應的靈敏度δl了。

      然而,因為下采樣的存在,取樣層的一個畫素(神經元節點)對應的靈敏度δ對應於卷積層(上一層)的輸出map的一塊畫素(取樣視窗大小)。因此,層l中的一個map的每個節點只與l+1層中相應map的一個節點連線。

     為了有效計算層l的靈敏度,我們需要上取樣upsample 這個下采樣downsample層對應的靈敏度map(特徵map中每個畫素對應一個靈敏度,所以也組成一個map),這樣才使得這個靈敏度map大小與卷積層的map大小一致,然後再將層l的map的啟用值的偏導數與從第l+1層的上取樣得到的靈敏度map逐元素相乘(也就是公式(1)。

        在下采樣層map的權值都取一個相同值β,而且是一個常數。所以我們只需要將上一個步驟得到的結果乘以一個β就可以完成第l層靈敏度δ的計算。

       我們可以對卷積層中每一個特徵map j重複相同的計算過程。但很明顯需要匹配相應的子取樣層的map(參考公式(1))

        up(.)表示一個上取樣操作。如果下采樣的取樣因子是n的話,它簡單的將每個畫素水平和垂直方向上拷貝n次。這樣就可以恢復原來的大小了。實際上,這個函式可以用Kronecker乘積來實現:

       好,到這裡,對於一個給定的map,我們就可以計算得到其靈敏度map了。然後我們就可以通過簡單的對層l中的靈敏度map中所有節點進行求和快速的計算bias基的梯度了:

 公式(3

       最後,對卷積核的權值的梯度就可以用BP演算法來計算了(公式(2)。另外,很多連線的權值是共享的,因此,對於一個給定的權值,我們需要對所有與該權值有聯絡(權值共享的連線)的連線對該點求梯度,然後對這些梯度進行求和,就像上面對bias基的梯度計算一樣:

       這裡,中的在卷積的時候與逐元素相乘的patch,輸出卷積map的(u, v)位置的值是由上一層的(u, v)位置的patch與卷積核k_ij逐元素相乘的結果。

      咋一看,好像我們需要煞費苦心地記住輸出map(和對應的靈敏度map)每個畫素對應於輸入map的哪個patch。但實際上,在Matlab中,可以通過一個程式碼就實現。對於上面的公式,可以用Matlab的卷積函式來實現:

       我們先對delta靈敏度map進行旋轉,這樣就可以進行互相關計算,而不是卷積(在卷積的數學定義中,特徵矩陣(卷積核)在傳遞給conv2時需要先翻轉(flipped)一下。也就是顛倒下特徵矩陣的行和列)。然後把輸出反旋轉回來,這樣我們在前向傳播進行卷積的時候,卷積核才是我們想要的方向。

3.2、Sub-sampling Layers 子取樣層

         對於子取樣層來說,有N個輸入maps,就有N個輸出maps,只是每個輸出map都變小了。

        down(.)表示一個下采樣函式。典型的操作一般是對輸入影象的不同nxn的塊的所有畫素進行求和。這樣輸出影象在兩個維度上都縮小了n倍。每個輸出map都對應一個屬於自己的乘性偏置β和一個加性偏置b。

3.2.1、Computing the Gradients 梯度計算

         這裡最困難的是計算靈敏度map。一旦我們得到這個了,那我們唯一需要更新的偏置引數β和b就可以輕而易舉了(公式(3)。如果下一個卷積層與這個子取樣層是全連線的,那麼就可以通過BP來計運算元取樣層的靈敏度maps。

         我們需要計算卷積核的梯度,所以我們必須找到輸入map中哪個patch對應輸出map的哪個畫素。這裡,就是必須找到當前層的靈敏度map中哪個patch對應與下一層的靈敏度map的給定畫素,這樣才可以利用公式(1那樣的δ遞推,也就是靈敏度反向傳播回來。另外,需要乘以輸入patch與輸出畫素之間連線的權值,這個權值實際上就是卷積核的權值(已旋轉的)。

      在這之前,我們需要先將核旋轉一下,讓卷積函式可以實施互相關計算。另外,我們需要對卷積邊界進行處理,但在Matlab裡面,就比較容易處理。Matlab中全卷積會對缺少的輸入畫素補0 。

      到這裡,我們就可以對b和β計算梯度了。首先,加性基b的計算和上面卷積層的一樣,對靈敏度map中所有元素加起來就可以了:

       而對於乘性偏置β,因為涉及到了在前向傳播過程中下采樣map的計算,所以我們最好在前向的過程中儲存好這些maps,這樣在反向的計算中就不用重新計算了。我們定義:

這樣,對β的梯度就可以用下面的方式計算:

2.3、Learning Combinations of Feature Maps 學習特徵map的組合

         大部分時候,通過卷積多個輸入maps,然後再對這些卷積值求和得到一個輸出map,這樣的效果往往是比較好的。在一些文獻中,一般是人工選擇哪些輸入maps去組合得到一個輸出map。但我們這裡嘗試去讓CNN在訓練的過程中學習這些組合,也就是讓網路自己學習挑選哪些輸入maps來計算得到輸出map才是最好的。我們用αij表示在得到第j個輸出map的其中第i個輸入map的權值或者貢獻。這樣,第j個輸出map可以表示為:

         需要滿足約束:

         這些對變數αij的約束可以通過將變數αij表示為一個組無約束的隱含權值cij的softmax函式來加強。(因為softmax的因變數是自變數的指數函式,他們的變化率會不同)。