卷積神經網絡


卷積神經網絡

完整版:https://git.oschina.net/wjiang/Machine-Learning

 

  1. 卷積網絡簡介

卷積網絡(leCun,1989),也被稱為卷積神經網絡或CNN, 它是處理數據的一個特殊的神經網絡,它包含一個已知的類網格的拓撲結構。例子包括時間序列,它可以被認為是一個以固定時間間隔采樣的1D網格,和圖像數據,它被認為是2D像素的網格。卷積網絡在實際的應用中已經非常地成功。"卷積神經網絡"這個名字表明了網絡中采用了一個叫做卷積的數學運算。卷積是一個特殊類型的線性運算。卷積網絡是一個簡單的神經網絡,它至少在3層網絡中地一層用卷積代替了一般的矩陣乘法。

這一章,我們首先講述什么是卷積,接下來我們會解釋在一個神經網路中使用卷積背后的動機。然后我們將解釋一個名叫"池化(pooling)"的運算,幾乎在所有的卷積網絡中都會用到它。通常,這個運算在卷積神經網絡不符合其他領域例如工程領域和純數學領域的中關於卷積的定義。我們將描述幾個在神經網絡實踐中廣泛應用的卷積函數的變體。我們也將展示卷積可以應用到很多種類型的不同維的數據,然后我們討論讓卷積更加有效的方法。卷積網絡作為一個神經科學原理的一個例子脫穎而出並影響着深度學習。我們將討論這些神經科學原理,最后總結卷積網絡在深度學習歷史中地角色。這章的一個主題不是介紹如何選擇卷積網絡架構,這一章的目的是描述卷積網絡提供的各種工具,而第11章描述什么情況下選擇什么工具的一個通用性的指導。對卷積網絡架構的研究進展如此之快以至於一個新的給定基准的最佳架構每周到每幾個月就會發布一次,致使在出版物中描述最佳的架構是不可能的。然而,最佳的體系架構始終是由這里所描述的構建塊組成的。

  1. 卷積運算

卷積的一般形式是兩個擁有一個實值參數的函數間的一個運算。為了促進卷積的定義,我們先以我們會用到的兩個函數做為一個例子開始。

假設我們正在用激光傳感器跟蹤一個宇宙飛船的位置,我們的激光傳感器提供一個單獨的輸出X(t), 以表示宇宙飛船在t時間的位置。X和t都是實值,例如,我們可能在任意緊急的時刻從激光傳感器中得到一個不同的地讀入。

現在我們假定我們的激光傳感器有一些噪聲。為了得到宇宙飛船位置的一個低噪聲的估計,我們應該取幾次測量的一個平均值。當然,越近的測量則越相關,所以我們希望這個加權平均使得最近的測量更加有分量。我們可以用一個權重函數w(a)來實現,其中a是測量的年代。如果我們每個月應用這個權值平均運算,我們將會得到一個新的函數s提供了宇宙飛船位置平滑的估計。

這個運算叫做卷積,卷積運算典型的以星號表示為:

在我們的例子總,w需要是一個有效的概率密度函數,或者輸出不是加權平均值。並且對於所有的負參數,w需要是0,或者展望未來,w的假設值超出我們的能力范圍。

這些限制對於我們的例子來說是特別的。一般的,卷積是對那些上面的部分已經定義了的任意函數的定義,並且可能用於其他目的除了執行加權平均值。

卷積網絡術語中,卷積的第一個參數(在這個例子中,函數x)通常被稱為輸入,第二個參數作為核。輸出有時候被稱為特征映射。

在我們的例子中,激光傳感器可以對實例實時的提供測量是不現實。通常,我們在電腦中處理數據,時間是離散的,並且我們的傳感器會定期的提供數據。在我們的例子中,可能假設我們的激光傳感器每秒提供一次測量更為現實。時間項t只能是整數值。如果我們現在假設x和w在整數的t上定義的,我們就可以定義離散卷積為:

在機器學習應用中,輸入通常是一個多維數組並且核通常是適應我們學習算法的一個多維參數數組。參考這些多維數組做為張量,因為每個輸入的每個元素和核必須是顯形的單獨存儲的,我們通常假定這些函數在任何地方都為0,但是我們存儲這些值得有限的點集。這也就是說在現實中我們可以把有限求和作為一個無限數組元素的求和。

最后,我們經常同時在多個軸上使用卷積,例如,我們用二維圖像I作為我們的輸入,我們可能總是想要用一個二維的核函數:

卷積是可交換的,也就是說我們可以等價的將上式寫成:

通常后一個公式在機器學習庫中是比較容易實現的,因為這里m和n在有效值得范圍內變化比較小。

卷積的交換律就出現了是因為我們已經將輸入相對應的核翻轉了,從這個意義上說,隨着m的增加,輸入的索引增加,而核的索引減小。翻轉核函數的唯一原因是為了得到交換律。交換律在寫證明的時候很有用,但是它並不是神經網絡實現中的一個重要性質。相反,神經網絡庫實現一個相關函數叫做交叉相關(cross-correlation), 這和卷積一樣但是不會翻轉核:

很多機器學習庫實現了交叉相關,但是卻把他叫做卷積。這一節中,我們將遵循這個慣例即把它兩都叫做卷積,並且在核翻轉是相關的情況下我們是否要翻轉核。在機器學習的環境中,學習算法會在合適的位置學習到核的合適的值,所以一個基於卷積並且擁有核翻轉特性的算法將會學習一個翻轉的核相對於一個由沒有翻轉的算法學些到的核。在機器學習中單獨運用卷積也是非常少見的,相反,卷積是與其他函數同時使用的,並且不管卷積運算是否翻轉他的核,這些函數的組合都不會改變。

看圖9.1,這個個應用在一個2-D張量卷積(沒有核翻轉)的例子。

離散卷積可以認為是矩陣的乘法,然而,矩陣有幾個元素被約束為等於其他的元素,例如單變量離散卷積,矩陣的每一行被約束為等於上一行平移了一個元素。這就是所謂的托普利茲矩陣,二維中,一個雙塊循環矩陣對應於卷積,另外這些約束也就是幾個元素互相等於對方,卷積通常對應於一個非常稀疏的矩陣(一個元素大多數等於0的矩陣),這是因為核通常小與輸入圖像,任何以矩陣乘法處理的並且不依賴於特定矩陣結構性質的神經算法都應該運用卷積,而不需要進一步的改變神經網絡。典型的卷積神經網絡為了有效的處理大量的輸入確實運用了進一步的特殊化,但是從理論的角度來說是不是必要的。

 

    圖9.1:一個2-D的沒有核翻轉的卷積。在這種情況下我們限定輸出到內核完全位於圖像中地位置,在某些情況下叫做"有效"卷積。我們畫些盒子來表示左上角的輸出張量是怎樣運用相對於左上角區域的輸入張量的核來形成的。

  1. 激勵

卷積利用三個重要的思想是可以幫助改善一個機器學習系統:稀疏交互、參數共享和等變表示。此外卷積為了處理處理輸入變量大小提供了一種方法。我們現在依次來描述這些想法。

傳統的神經網絡層由包含描述每個輸入單元和輸出單元之間交互的獨立參數的參數矩陣做矩陣乘法。這就意味着每個輸出單元都與每個輸入單元交互。然而卷積網絡,典型的包括稀疏交互(也被稱為稀疏連接或稀疏權重),這是通過使核小於輸入來完成的。例如,當處理一個圖片,輸入圖片可能有幾千個像素,但是我們可以檢測小的有意義的特征比如只有幾十個或是幾百個核的邊緣的像素。也就是說我們需要存儲更少的參數,這些參數減少模型內存的需求和改善它的統計效率。這也就意味着計算輸出需要更少的運算。這些效率上的改善通常是巨大的。如果這里有一個m輸入和n輸出,於是我們矩陣乘法需要m*n個參數並且實際中算法需要O(m*n)運行時間(每個)。如果我們限制連接到每個輸出的數量可能到k,那么稀疏的連接方法只需要k*n個參數和O(k*n)的運行時間。對於很多的實際應用,可能在當k比m小幾個數量級的時候在機器學習任務中得到很好的性能。對於稀疏連接的圖形演示可以參考圖9.2核9.3. 在深度卷積網絡中,在更深層次地單元中可能不直接和大量的輸入直接交互,例如圖9.4顯示的。這使得網絡能夠有效的描述從只描述稀疏交互的簡單構建塊構造交互的很多變量之間進行的復雜交互。

參數共享指的是對模型中多個函數使用相同的參數,此外傳統的神經網絡,當計算一個層的輸出的時候,權重矩陣的每個元素只用一次,它乘以一個輸入並且不會再被訪問。作為共享參數的同義詞,可以說是一個網絡權重綁定(tied weights),因為應用到一個輸入的權值被綁定到應用到任何輸入的權值。在卷積網絡中,核的成員被用在輸入的任何位置(除了一些邊緣像素,根據設計有關邊界的決策)。卷積運算用到的參數共享意味着我們與其為每一個位置學習一個獨立的參數集,還不如學習一個參數集。

圖9.2 稀疏連接,看下面的部分:我們突出一個輸入單元,x3,並且也突出被這個單元影響的輸出單元s,(最上面)當s是由一個寬度為3的核函數卷積形成的,只有3個輸出受到x的影響。(下面)當s是 由矩陣乘法形成的,連接不再稀疏,所以所有的輸出都被x3影響。

圖9.3:稀疏連接,看圖的上半部分,我們突出一個輸出單元,s3,並且突出了影響這個單元的輸入單元x。這個些突出的單元被稱為感受域(receptive field)s3,。(上半部分)當s是由寬度為3的核函數卷積形成時,只有3個輸入影響s3.(下面)當s是由矩陣乘法形成時,連接不再稀疏,所以所有的輸入都影響s3.

圖9.4:卷積網絡中的更深層次單元的感受域(receptive field)比淺層單元的感受域(receptive field)要大。如果網絡包含了像條紋卷積(strided convolution)(圖9.12)或是池化(pooing)(圖9.3)這樣的架構特征,這種效應就會增加。意思就是即使在一個卷積網絡中直接連接是非常稀疏的,但是更深的層次可以間接的連接所有或者說是大部分輸入圖像。

圖9.5: 參數共享:黑色的箭頭表示這些在兩個不同模型之間用一個特殊參數的連接。(上半部分)黑色的箭頭表示在一個卷積模型中使用一個3元素核函數中心的元素。因為參數共享,這些單參數被用在所有輸入位置。(下半部分)單個黑色箭頭表示在一個全連接模型中使用權重矩陣中間的元素。這個模型沒有參數共享所以參數值被使用一次。

 

這不影響正向傳播的運行-它仍然是O(k*n)-但是它進一步減小k參數模型的存儲需求。回想一下k通常比m小幾個數量級,因為m和n的大小通常是一樣的,與m*n相比k實際上是無關緊要的。因此在內存需求和統計效率方面來說卷積顯然比密集的矩陣乘法更有效。有關參數共享是如何工作的圖形描述,請參見圖9.5.

正如前面兩個原則的一個例子,圖9.5展示了稀疏連接和參數共享在檢測一張圖像的邊沿可以顯著的改善一個線性函數的效率。

在卷積的例子中,參數共享的特殊形式使這個層有一個稱為等變性的屬性。說一個函數是等變的就是說如果輸入改變,輸出會以同樣的方式改變。特別的,if f(g(x)) = g(f(x)) 一個函數f(x)是等變到另一個函數g。在卷積的情況下,如果我們讓g為任何函數來轉換輸入,例如平移它,那么卷積函數等變到g。例如,讓I成為一個給定整數坐標下圖像亮度的函數。讓g成為一個映射一個圖像函數到另一個圖像函數的函數,這個 I' = g(I)是一個圖像函數I'(x,y) = I(x-1,y)。這個函數把I的每一個像素移到右邊,如果我們運用這個轉換到函數I,然后運用卷積,結果將和我們運用卷積到I'一樣,然后將轉換g應用到輸出。當處理時間序列數據時,卷積會產生一個時間軸,它顯示不同的特征何時出現在輸入上。如果我們稍后在輸入上移動一個事件,稍后同樣的表示會出現在輸出中。和圖像一樣,卷積會創建一個2-D的映射,其中的某些特征會在輸入中出現。如果在輸出中移動對象,在輸出中它的表示將會移動同樣的總數。當我們知道應用於多個輸入位置時,少量的領域像素的一些函數是有用的,這對我們來說很有用。比如,當處理圖像時,卷積網絡的第一層檢測邊沿是很有用的。同樣的邊沿或多或少的出現在圖像中,所以在整個圖像中共享參數是很實際的,在某些情況下,我們不能在整個圖像中共享參數,比如,如果我們處理的圖像被裁減以一個人臉為中心,我們可能想要在不同位置提取不同特征-網絡的這部分處理臉上部需要尋找眉毛,而網絡的這一部分處理臉下部的時候需要尋找下巴。

卷積不是自然等變到一些其他的轉換,比如縮放比例或是圖像旋轉。其他的機制對於處理這些類型的轉換也是非常必要的。

最后,一些數據不能由用固定形狀矩陣的矩陣乘法定義的神經網絡所處理,卷積卻可以對這類數據進行處理,我們將在9.7章節中做進一步的討論。

  1. 池化(Pooling)

一個典型的卷積網絡層由三個階段(如圖.9.7),在第一個階段,這一層並行的執行幾個卷積產生一個線性激活的子集。在第二階段,每一個線性激活通過一個非線性激活函數來運行,比如調整線性激活函數,這一級階段有時候被稱為探測器階段。在第三個階段,我們 用一個池化函數(pooling function) 來進一步的改變這一層的輸出。

一個池化函數將網絡的某個位置的輸出替換為鄰近輸出的統計量,例如,最大的池化操作運算報告了最大的輸出包含一個矩形鄰域。

圖9.6:邊緣檢測的效率。右邊的圖像是通過提取元素圖像中的每個像素並且在左邊圖像中減去相鄰像素的值來形成的。這個圖像顯示了在輸入圖像中所有垂直方向上邊緣的強度,在目標檢測中,這是一個非常有用的操作。兩個圖像都是280個像素高,輸入的圖像320個像素寬,而輸出圖像是319個像素寬。這個變換可以由一個包含兩個元素的卷積核來描述並且需要用卷積來計算319*280*3 = 267,960個浮點運算(兩個乘數和每個輸出像素增加一個)。為了描述一個矩陣乘法的同樣的轉換需要320*280*319*280,或是80億個以上,矩陣中的元素,用卷積表示這個轉換則會高效40億倍。簡單的矩陣乘法算法執行170億次浮點運算,從計算方面講用卷積大概會高效60,000倍。當然,矩陣的大多數元素都是0,如果我們矩陣的非0元素,因此矩陣乘法核卷積需要計算同樣數目的浮點型運算。矩陣將仍然需要包含2*319*280 = 178,640個元素。卷積是一種非常有效的描述應用相同變換的方法,在整個輸入中對一個小的局部的區域進行轉換(圖片來源,Paula Goodfellow)。

圖9.7:一個典型的卷積神經網絡層組件。它包括兩個通用術語集來描述這些層次。(左邊)在這個術語中,卷積網絡被看做是一個小的相對復合層,它的每一層由很多的'stages'。在這個術語中,由核張量核網絡層間的一對一的映射。本書中我們一般用的是這種術語。(右邊)在這個術語中,卷積網絡被看做是一個更大的簡單層次;處理的每一步被認為是單獨的層。意思就是說不是每一個"層"都有參數。

 

其他流行的池化函數包括鄰域的平均,矩形鄰域的L2范數,或者是基於距中心像素距離的加權平均。

在所有情況下,池化有助於使表示變得近似於輸入小轉化的不變量。轉化的不變性意思是說如果我們將輸入做一個小量的轉換,大多數池化輸出值不會改變。參考圖9.8 這是如何工作的一個例子。如果我們關心一些特征是否出現更勝於它的確切的位置,本地轉換的不變性是一個非常有用的性質。當判斷一個圖像是否包含一張臉的時候,我們不需要知道眼睛位置的像素級的精度,我們只需要知道臉的左邊有一只眼睛並且臉的右邊也有一只眼睛。在其他情況下,保存特征位置更為重要。例如,我們想要找到在特定方向上有兩條邊匯合定義的一個角,我們就需要很好的保存邊沿的位置以測試他們是否匯合。

池化可以被認為是增加了一個無限強的先驗(prior),即這一層學習的函數必須是對小轉化是不變的。當這個假設正確時,就可以極大改善網絡統計效率。

在空間區域上的池化產生轉化不變性,但是為我們在獨立參數化卷積的輸出上做池化,特征可以學習到是哪些轉換變為不變量。(參考圖9.9)

因為池化匯總了整個鄰域的響應,它通過報告池化區域間隔為k個像素而不是1個像素的統計匯總,所以可以使用比探測器更少的池化單元。參考9.10的例子。這就改善了網絡的計算的效率,因為下一層要處理的輸入大概少k倍。當下一層的的參數的數量是它輸入大小的函數時候(比如當下一層是全連接並且是基於矩陣乘法的時候),輸入大小的減小也可以引起統計效率的改善並且減小存儲參數的內存需求。

對於很多任務,池化對於處理大小可變化的(varying)輸入來說是必不可少的。比如,如果我們想要將可變大小的圖像進行分類,類別層的輸入必須是固定大小的,這通常由改變在池化區域間偏移的大小來完成的,所以分類層總是接受同樣數量的匯總統計而不管輸入大小是多少。例如,網絡最后的池化層可能定義輸出四組匯總統計,一組用於圖像的每個象限(quadrant), 而不考慮圖像的大小。

一些理論工作給出了在不同情況下應該使用哪種池化的指導(Boureau et,al,2010)。

圖9.8:最大池化引入不變性。(圖的上半部)一個卷積層輸出的中間部分的視圖。下面一行顯示了非線性的輸出。最上面的一行顯示了最大池化的輸出,它在池化區域跨了一個像素並且一個池化區域的寬度為3個像素。(最下面)同一個網絡在輸入已經平移一個像素到右邊之后的視圖。在最底下一行的每個值已經改變,因為最大的池化單元只對鄰域中最大的值敏感,而不是它的確切位置。

圖9.9:學習不變性的例子:一個匯集了多個特征的池化單元,這些特征是用單獨參數來學習的,它可以學習為對輸入轉換保持不變。這里我們展示三個學習濾波器的一個子集和一個最大池化單元是怎樣學習變成旋轉不變的。所有的濾波器想要檢測一個手寫5,,每個濾波器嘗試匹配稍微不同方向的5。當一個5出現在輸出的時候,相應的濾波器將匹配它並且檢測器單元中引起一個大的激勵。不管哪一個池化單元已經被激勵,最大的那個池化單元有一個大的激勵。這里我們展示網絡是怎樣處理兩個不同的輸入,進而導致兩個不同的探測器被激活的。對池化單元的影響大致相同。這個原則是由maxout網絡(Goodfellow et,al, 2013a)核其他卷積網絡所利用。在空間位置上的最大池化是自然不變量的轉化,這個多通道的方法只對學習其他轉換時必須的。

圖9.10: 用降采樣(downsampling – 縮減像素采樣)的池化,這里我們用一個池寬度為3的最大池和兩個池之間的跨度。這減少表示大小的兩倍,也下一個層級減小了計算和統計的開銷。注意最右邊的池化區域由一個較小的,但是如果我們不想要忽略一些探測器單元則必須將其包含在內。

也可以動態的將特征集中在一起,例如,在感興趣的特征(Boureau et,al,2010)位置運行一個聚類算法。這個方法為每個圖片產生出不同的池化區域集。另外一些方法是去學習一個單池化結構,然后應用到所有圖片(Jia et al., 2012).

池化可以使得一些類型的使用自頂向下的信息的神經網絡結構變得復雜化,比如Boltzmann機器和自編碼器。這些問題會在我們在第三部分介紹這些類型的網絡時做進一步的討論。池化在卷積Boltzmann機器將會20.6部分中介紹。在一些可微的網絡的需要在池化單元上的反式操作將包含在20.10.6部分中。

一些為分類器用卷積和池化計算卷積網絡結構的例子圖9.11顯示。

 

限於篇幅到此,持續更新在:https://git.oschina.net/wjiang/Machine-Learning


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM