技術向:一文讀懂卷積神經網絡CNN


  • 黃色和灰色是問題,粉色是重點。
  • Deep Learning強大的地方就是可以利用網絡中間某一層的輸出當做是數據的另一種表達,從而可以將其認為是經過網絡學習到的特征。基於該特征,可以進行進一步的相似度比較等。
  • 現在,CNN已經成為眾多科學領域的研究熱點之一,特別是在模式分類領域,由於該網絡避免了對圖像的復雜前期預處理,可以直接輸入原始圖像,因而得到了更為廣泛的應用。

一般地,CNN的基本結構包括兩層,其一為特征提取層,每個神經元的輸入與前一層的局部接受域相連,並提取該局部的特征。一旦該局部特征被提取后,它與其它特征間的位置關系也隨之確定下來;其二是特征映射層,網絡的每個計算層由多個特征映射組成,每個特征映射是一個平面,平面上所有神經元的權值相等。特征映射結構采用影響函數核小的sigmoid函數作為卷積網絡的激活函數,使得特征映射具有位移不變性。此外,由於一個映射面上的神經元共享權值,因而減少了網絡自由參數的個數。卷積神經網絡中的每一個卷積層都緊跟着一個用來求局部平均與二次提取的計算層,這種特有的兩次特征提取結構減小了特征分辨率。

 

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

 

1. 神經網絡

首先介紹神經網絡,這一步的詳細可以參考資源1。簡要介紹下。神經網絡的每個單元如下:

其對應的公式如下:

其中,該單元也可以被稱作是Logistic回歸模型。當將多個單元組合起來並具有分層結構時,就形成了神經網絡模型。下圖展示了一個具有一個隱含層的神經網絡。

其對應的公式如下:

比較類似的,可以拓展到有2,3,4,5,…個隱含層。

神經網絡的訓練方法也同Logistic類似,不過由於其多層性,還需要利用鏈式求導法則對隱含層的節點進行求導,即梯度下降+鏈式求導法則,專業名稱為反向傳播。關於訓練算法,本文暫不涉及。

2 卷積神經網絡

在圖像處理中,往往把圖像表示為像素的向量,比如一個1000×1000的圖像,可以表示為一個1000000的向量。在上一節中提到的神經網絡中,如果隱含層數目與輸入層一樣,即也是1000000時,那么輸入層到隱含層的參數數據為1000000×1000000=10^12,這樣就太多了,基本沒法訓練。所以圖像處理要想練成神經網絡大法,必先減少參數加快速度。

2.1 局部感知

卷積神經網絡有兩種神器可以降低參數數目,第一種神器叫做局部感知野。

如下圖所示:左圖為全連接,右圖為局部連接。

卷積神經網絡

在上右圖中,假如每個神經元只和10×10個像素值相連,那么權值數據為1000000×100個參數,減少為原來的千分之一。而那10×10個像素值對應的10×10個參數,其實就相當於卷積操作。

2.2 參數共享

但其實這樣的話參數仍然過多,那么就啟動第二級神器,即權值共享。在上面的局部連接中,每個神經元都對應100個參數,一共1000000個神經元,如果這1000000個神經元的100個參數都是相等的,那么參數數目就變為100了。

怎么理解權值共享呢?我們可以這100個參數(也就是卷積操作)看成是提取特征的方式,該方式與位置無關。這其中隱含的原理則是:圖像的一部分的統計特性與其他部分是一樣的。這也意味着我們在這一部分學習的特征也能用在另一部分上,所以對於這個圖像上的所有位置,我們都能使用同樣的學習特征。

更直觀一些,當從一個大尺寸圖像中隨機選取一小塊,比如說 8×8 作為樣本,並且從這個小塊樣本中學習到了一些特征,這時我們可以把從這個 8×8 樣本中學習到的特征作為探測器,應用到這個圖像的任意地方中去。特別是,我們可以用從 8×8 樣本中所學習到的特征跟原本的大尺寸圖像作卷積,從而對這個大尺寸圖像上的任一位置獲得一個不同特征的激活值。

如下圖所示,展示了一個33的卷積核在55的圖像上做卷積的過程。每個卷積都是一種特征提取方式,就像一個篩子,將圖像中符合條件(激活值越大越符合條件)的部分篩選出來。

卷積神經網絡

2.3 多卷積核

上面所述只有100個參數時,表明只有1個100*100的卷積核,顯然,特征提取是不充分的,我們可以添加多個卷積核,比如32個卷積核,可以學習32種特征。在有多個卷積核時,如下圖所示:

卷積神經網絡

上圖右,不同顏色表明不同的卷積核。每個卷積核都會將圖像生成為另一幅圖像。比如兩個卷積核就可以將生成兩幅圖像,這兩幅圖像可以看做是一張圖像的不同的通道。

下圖展示了在四個通道上的卷積操作,有兩個卷積核,生成兩個通道。其中需要注意的是,四個通道上每個通道對應一個卷積核,先將w2忽略,只看w1,那么在w1的某位置(i,j)處的值,是由四個通道上(i,j)處的卷積結果相加然后再取激活函數值得到的。

卷積神經網絡

卷積神經網絡

所以,在上圖由4個通道卷積得到2個通道的過程中,參數的數目為4×2×2×2個,其中4表示4個通道,第一個2表示生成2個通道,最后的2×2表示卷積核大小。

2.4 Down-pooling

在通過卷積獲得了特征 (features) 之后,下一步我們希望利用這些特征去做分類。理論上講,人們可以用所有提取得到的特征去訓練分類器,例如 softmax 分類器,但這樣做面臨計算量的挑戰。例如:對於一個 96X96 像素的圖像,假設我們已經學習得到了400個定義在8X8輸入上的特征,每一個特征和圖像卷積都會得到一個 (96 − 8 + 1) × (96 − 8 + 1) = 7921 維的卷積特征,由於有 400 個特征,所以每個樣例 (example) 都會得到一個 892 × 400 = 3,168,400 維的卷積特征向量。學習一個擁有超過 3 百萬特征輸入的分類器十分不便,並且容易出現過擬合 (over-fitting)。

為了解決這個問題,首先回憶一下,我們之所以決定使用卷積后的特征是因為圖像具有一種“靜態性”的屬性,這也就意味着在一個圖像區域有用的特征極有可能在另一個區域同樣適用。因此,為了描述大的圖像,一個很自然的想法就是對不同位置的特征進行聚合統計,例如,人們可以計算圖像一個區域上的某個特定特征的平均值 (或最大值)。這些概要統計特征不僅具有低得多的維度 (相比使用所有提取得到的特征),同時還會改善結果(不容易過擬合)。這種聚合的操作就叫做池化 (pooling),有時也稱為平均池化或者最大池化 (取決於計算池化的方法)。

卷積神經網絡

至此,卷積神經網絡的基本結構和原理已經闡述完畢。

2.5 多層卷積

在實際應用中,往往使用多層卷積,然后再使用全連接層進行訓練,多層卷積的目的是一層卷積學到的特征往往是局部的,層數越高,學到的特征就越全局化。

3 ImageNet-2010網絡結構

ImageNet LSVRC是一個圖片分類的比賽,其訓練集包括127W+張圖片,驗證集有5W張圖片,測試集有15W張圖片。本文截取2010年Alex Krizhevsky的CNN結構進行說明,該結構在2010年取得冠軍,top-5錯誤率為15.3%。值得一提的是,在今年的ImageNet LSVRC比賽中,取得冠軍的GoogNet已經達到了top-5錯誤率6.67%。可見,深度學習的提升空間還很巨大。

下圖即為Alex的CNN結構圖。需要注意的是,該模型采用了2-GPU並行結構,即第1、2、4、5卷積層都是將模型參數分為2部分進行訓練的。在這里,更進一步,並行結構分為數據並行與模型並行。數據並行是指在不同的GPU上,模型結構相同,但將訓練數據進行切分,分別訓練得到不同的模型,然后再將模型進行融合。而模型並行則是,將若干層的模型參數進行切分,不同的GPU上使用相同的數據進行訓練,得到的結果直接連接作為下一層的輸入。

 

作者:李哲龍
鏈接:https://www.zhihu.com/question/53851014/answer/158794752
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

首先說下為什么要並行,眾所周知目前的深度學習領域就是海量的數據加上大量的數學運算,所以計算量相當的大,訓練一個模型跑上十天半個月啥的是常事。那此時分布式的意義就出現了,既然一張GPU卡跑得太慢就來兩張,一台機器跑得太慢就用多台機器,於是我們先來說說數據並行,放張網上copy的圖


在上面的這張圖里,每一個節點(或者叫進程)都有一份模型,然后各個節點取不同的數據,通常是一個batch_size,然后各自完成前向和后向的計算得到梯度,這些進行訓練的進程我們成為worker,除了worker,還有參數服務器,簡稱ps server,這些worker會把各自計算得到的梯度送到ps server,然后由ps server來進行update操作,然后把update后的模型再傳回各個節點。因為在這種並行模式中,被划分的是數據,所以這種並行方式叫數據並行。

然后呢咱們來說說模型並行,深度學習的計算其實主要是矩陣運算,而在計算時這些矩陣都是保存在內存里的,如果是用GPU卡計算的話就是放在顯存里,可是有的時候矩陣會非常大,比如在CNN中如果num_classes達到千萬級別,那一個FC層用到的矩陣就可能會大到顯存塞不下。這個時候就不得不把這樣的超大矩陣給拆了分別放到不同的卡上去做計算,從網絡的角度來說就是把網絡結構拆了,其實從計算的過程來說就是把矩陣做了分塊處理。這里再放一張網上盜的圖表示下模型並行:


最后說說兩者之間的聯系,有的時候呢數據並行和模型並行會被同時用上。比如深度的卷積神經網絡中卷積層計算量大,但所需參數系數 W 少,而FC層計算量小,所需參數系數 W 多。因此對於卷積層適合使用數據並行,對於全連接層適合使用模型並行。 就像這樣:


關於這個更多地可以參考這篇博客,說的挺詳細的卷積神經網絡的並行化模型--One weird trick for parallelizing convolutional neural networks

上圖模型的基本參數為:

輸入:224×224大小的圖片,3通道
第一層卷積:5×5大小的卷積核96個,每個GPU上48個。
第一層max-pooling:2×2的核。

      

對於mean pooling,真的是好簡單:假設pooling的窗大小是2x2, 在forward的時候啊,就是在前面卷積完的輸出上依次不重合的取2x2的窗平均,得到一個值就是當前mean pooling之后的值。backward的時候,把一個值分成四等分放到前面2x2的格子里面就好了。如下

forward: [1 3; 2 2] -> [2]
backward: [2] -> [0.5 0.5; 0.5 0.5]

max pooling就稍微復雜一點,forward的時候你只需要把2x2窗子里面那個最大的拿走就好了,backward的時候你要把當前的值放到之前那個最大的位置,其他的三個位置都弄成0。如下

forward: [1 3; 2 2] -> 3
backward: [3] -> [0 3; 0 0]



作者:李濟深
鏈接:https://www.zhihu.com/question/23437871/answer/46491291
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。


第二層卷積:3×3卷積核256個,每個GPU上128個。
第二層max-pooling:2×2的核。
第三層卷積:與上一層是全連接,3*3的卷積核384個。分到兩個GPU上個192個。
第四層卷積:3×3的卷積核384個,兩個GPU各192個。該層與上一層連接沒有經過pooling層。
第五層卷積:3×3的卷積核256個,兩個GPU上個128個。
第五層max-pooling:2×2的核。
第一層全連接:4096維,將第五層max-pooling的輸出連接成為一個一維向量,作為該層的輸入。
第二層全連接:4096維
Softmax層:輸出為1000,輸出的每一維都是圖片屬於該類別的概率。

softmax https://www.zhihu.com/question/23765351 這里有推導沒看懂

 

=========================================================================

對於一個32x32x3(寬32像素x高32像素xRGB三通道)的圖像,如果我們在CNN的第一個卷積層定義訓練12個濾波器,那就這一層的輸出便是32X32X12.按照不同的任務,我們可以對這個輸出做進一步的處理,這包括激活函數,池化,全連接等。

簡單來說,訓練CNN在相當意義上是在訓練每一個卷積層的濾波器。讓這些濾波器組對特定的模式有高的激活,以達到CNN網絡的分類/檢測等目的。

 

卷積神經網絡的第一個卷積層的濾波器用來檢測低階特征,比如邊、角、曲線等。隨着卷積層的增加,對應濾波器檢測的特征就更加復雜(理性情況下,也是我們想要的情況)。比如第二個卷積層的輸入實際上是第一層的輸出(濾波器激活圖),這一層的濾波器便是用來檢測低價特征的組合等情況(半圓、四邊形等),如此累積,以檢測越來越復雜的特征。

 

所以,在相當程度上,構建卷積神經網絡的任務就在於構建這些濾波器。也就是,將這些濾波器變成這樣(改變濾波器矩陣的值,也就是Weight)的——能識別特定的特征。這個過程叫做訓練。

在訓練開始之時,卷積層的濾波器是完全隨機的,它們不會對任何特征激活(不能檢測任何特征)。

把一個空白的濾波其,修改其權重(weights)以使它能檢測特定的模式,整個過程就如工程里面的反饋。

在*有監督學習中,數據是有標注的,以(x, t)的形式出現,其中x是輸入數據,t是標注.正確的t標注是ground truth, 錯誤的標記則不是。(也有人將所有標注數據都叫做ground truth)

由模型函數的數據則是由(x, y)的形式出現的。其中x為之前的輸入數據,y為模型預測的值。

標注會和模型預測的結果作比較。在損耗函數(loss function / error function)中會將y 和 t 作比較,從而計算損耗(loss / error)。 比如在最小方差中:

\frac{1}{2m}  \sum_{i=1}^{m} (y - t)^2


在訓練過程就是這樣的:第一次訓練,輸入一張圖像,這個圖像通過各層卷積處理輸出量一組向量[1,1,1,1,1,1,1,1,1,1],也就是,對於完全由隨機濾波器構建的網絡,其輸出認為這張圖等概率的是十個類別中的某一種。但是對於訓練,我們有一個Gound Thuth, 也就是這張圖中物體所屬的類別:[0,0,1,0,0,0,0,0,0,0],也就是屬於第三類。這時候我們可以定義一個損失函數,比如常見的MSE(mean squared error).我們假定L是這個損失函數的輸出。這時候我們的目的就是,讓L的值反饋(這種神經網絡概念下稱為 back propagation,反向傳輸)給整個卷積神經網絡,以修改各個濾波器的權重,使得損失值L最小。

這是一個典型的最優化問題。當然地,在工程上我們幾乎不可能一次就把濾波器的權重W修改到使L最小的情況,而是需要多次訓練和多次修改。

如果情況理想的話,權重修改的方向是使得L的變化收斂的。這也就是說很可能達到了我們訓練這個

神經網絡的目的——讓各個卷積層的濾波器能夠組合起來最優化的檢測特定的模式。

--------


作者:lee philip
鏈接:https://www.zhihu.com/question/22464082/answer/21443035
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。


免責聲明!

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



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