Convolutional Neural Net 筆記

更改版本:

2016/11/16 初版

2016/12/16 感謝rxliu同學提供的資料,讓我更清楚CNN的完整架構

 

 

本文公式推導來自於 [1] Notes on Convolutional Neural Networks,以及眾多參考資料 [6] [7] ,小編將他們統整起來,並給出一個範例code實作,將公式與程式對照起來,希望能給剛接觸CNN的人一點參考,code是摘自網路上的 [8] Matlab Deep Learning Toolbox,如果看不懂的話也已經有人對code做了精闢的解說 [9],相信仔細閱讀的話能有不少收穫。

 
 

概念介紹:

 

CNN網路是近年才發展起來的,早在1980年,Fukushima就做出了第一代CNN網路[2] Neocognitron,但當時效果還不是很好,經過後人不斷的研究改進後才慢慢演變成為今日的CNN網路,CNN網路最初的構想是來自於Hubel, Wiesel在1962年發表的 [3] 論文,他們把探針放到貓腦中特定的神經元細胞上,發現該神經元細胞對特定角度的直線有反應,不管是粗的或是細的。例如某顆神經元對傾斜45度的直線會激發,不管他們選擇粗的線或是細的線又或是在螢幕上的不同位置,他們發現只要將直線傾斜45度就會激發,當然他們也發現到其他角度的神經元。

 

 
       

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

而在後來的研究中發現不只存在這種偵測特定角度神經元存在,連高階特徵神經元也存在,例如偵測人臉神經元,且他們位於大腦的不同區域,低階神經元位於大腦視覺處理的V1區,相關資料可參考 [4] [5]。

 
 

 

 

CNN正是模仿人腦的這種架構產生出來的,由底層一層一層的學習低階特徵,再慢慢地由低階特徵組合出高階特徵去學,如下圖。

 

 

CNN主要由兩種網路架構所組成,一種是convolution layer,另一種是subsampling layer,最後一層就是把subsampling layer攤開,稱為full connected layer。
關於我為什麼會對CNN有興趣是從一個TED影片開始的,我很喜歡看TED影片,裡面都會分享很多最新的科技,像這則就是講如何利用AI技術一步一步的訓練電腦經由圖片然後就可以產生出一個通順有理的句子,背後的功臣就是要感謝CNN,當時我還不知道上台演講的人是誰,後來慢慢接觸才知道原來她是大咖教授李飛飛,看完全身真的是起雞皮疙瘩,AI簡直太強了,更不用說後面Google拿 CNN去做 Alpha GO學下圍棋的事情,因此我下定決心要探究這塊領域。
 

 
關於CNN的更多基礎概念可以先參考 [6],網路上也有許多其他的資源可供參考,本文著重於更實際的例子以及實現方式,要懂CNN的推導必須先懂傳統類神經的推導方式。
如果不懂類神經的可以看這篇由小編從頭到尾鉅細靡遺的講解推導類神經文章: 類神經推導

已知類神經數學推導:

 

 

 

上面為已知的類神經數學公式

第一行:表示 Error 是等於樣本t與輸出y的方均跟差

第二行:表示類神經的組合公式,後一層的輸出x(L)等於前一層的輸出乘以Weight+bias,然後再挑選一個適當的激活函數當f()

 

 

第三行:表示Error對 bias的微分直接等於 Error對u的微分,因為u對bias的微分為1

第四、五行:是類神經網路中最重要的精神,即這一層的敏感度(L)是後面那層的敏感度(L+1)     傳過來然後乘以W(L+1)最後再乘以輸出對輸入的微分

第六行:表示 Error 對 W的微分等於 敏感度 乘以前一層的輸出

 

 

 

Forward mapping:

 

第一層卷積層:

 

關於卷積過程大家可以看 Stanford 推出的 [10] UFIDL(Unsupervised Feature Learning and Deep Learning),裡面有動畫介紹。

 

 
 

第一層sub層:

 

        

 
 

 

全連接層:

 

全連接層和以前的類神經一樣,差別就只在於把前面的捲積層神經元攤開,假如前面的size是 20*20 ,那麼到全連階層就是 400顆神經元排列在前方。

 

 

Backward mapping:

 

接下來的推導過程我都會放一個實際的例子,下面擺公式以及matlab實現的代碼,方便大家對照,matlab代碼是參考github上大牛寫的 [8] Deeplearning Toolbox,真心推薦想理解DL的人可以從詳讀這個代碼開始,小編也是從這份代碼開始學起的,如果看不懂的話也有人整理出 [9] 筆記出來可以參考看看。其實小編也還不完全了解CNN,裡面有的數學甚是繁雜,小編也是從網路上拼拼湊湊才整理出這份資料,如果有大師看到什麼錯誤的地方,還望您不吝惜指教。

 

從最後一層傳到sub層(S2):

 

這邊解釋一下為什麼實現f微分的方式為o*(1-o),假如你的激發函數選擇sigmoid函數也就是1/(1+e-x),假設y=1/(1+e-x),

 

所以我們如果要求F的微分的話,我們只要把輸出*(1-輸出)就代表F的微分,現在我們假設已知網路最後面的誤差,根據公式,要算出前一層的敏感度就是算出當層的敏感度,然後乘上weight係數再乘以函數對輸入的微分,最後一層的敏感度就直接是樣本誤差,而如果我們選的f()為 sigmoid函數的話,那麼 f’(u)可以表示為輸出 o*(1-o),至此,前面一層的敏感度就出來了。

​    

這裡我們假設後面三科神經元的輸出都是0.5方便計算,而誤差分別為0.4,0.8,0.16,因此得到我們的綠色底線:

 

 

再繼續乘以weight值就可以求出前一層的敏感度,所以這裡weight的維度為W(4*3),綠色底線的維度為net.od(3*1),因此根據矩陣乘法可以得知前一層的敏感度維度為net.fvd(4*1)

第一個元素的算法為 w11*net.od(1)+w12*net.od(1)+w13*net.od(1)

第二個元素的算法為 w21*net.od(2)+w22*net.od(2)+w23*net.od(2)

後面以此類推

 

最後將維度的形狀從(4,1)轉成(2,2)就可以算出到sub層的敏感度了,還記得剛剛的全聯階層嗎?這裡就是把它還原回去而已,這樣等等才可以繼續算下去,所以sub層的敏感度為

 

 

從sub層傳到conv層(C2):

這裡也是把剛剛的動作做還原而已,剛剛如果選擇的2*2值為1/4的捲積核,那麼還原的結果為如下

 

 


 

繼續算出到conv層的敏感度,也就是圖中紅色的部分,這裡繼續假設輸出為0.5方便計算

 

 

所以conv層的敏感度為

 

到這裡完整結構如下,下面表示該層的敏感度:

 

從conv層傳到sub層(S1):

因此我們繼續推算S1層的敏感度,求S1的層的敏感度非常簡單,只要將前一層的敏感度與旋轉180度的kernel做卷積即可得知,基本上還是計算下列公式,只是採取矩陣的小技巧罷了,這裡要感謝 rxliu 同學提供的資料 [12] ,裏面非常詳細的用圖解描述為什麼kernel要轉180度計算:

 

原MLP公式:

CNN:

 

 


 

如果都有各層的敏感度了,那就開始求weight偏導:


 

根據公式,想要知道W怎麼改變就必須知道前一層的輸出 x(l-1) 再乘以那一層的敏感度:

 

Error對w的微分:

這裡以求導conv(b)的weight為例,似乎是與kernel轉180度同樣的技巧,執行上面那個式子就是把前一層的輸出a轉個180度然後再 和 d 互相卷積就可以求出了,假設前一層的輸出X(l-1)輸出a如下,因此求出Error對weight的微分如下:


 

 

注意看程式碼只有當層是卷積層時才需要做梯度運算,因為只有conv層要學weight而已,sub層並不用,所以如果要求conv(b)的weight的話必須要先求得C2的敏感度以及S1層的輸出。

 


 

Error對b的微分:​

根據公式 Error 對 b 的微分公式如下:

 

 

因此會把所有的敏感度都加總,然後再除以batch size

 



 

然後帶入學習率算出學習之後的W:

求出Error對W的微分之後,接下來只要帶入學習率就可以知道Weight的改變方向了,這裡注意bias的 Error對b微分是要全部相加的,因此:

 

 
 

參考資料:

 
  1. [1].J. Bouvrie, “Notes on convolutional neural networks”, MIT CBCL Tech Report, pp. 38- 44, 2006

  2. [2].K. Fukushima, "Neocognitron: A Self-Organizing Neural Network Model for a Mechanism of Pattern Recognition Unaffected by Shift in Position", Biological Cybernetics, vol. 36, pp. 193-202, 1980.

  3. [3].D. H. Hubel and T. N. Wiesel, “Receptive fields of single neurones in the cat’s striate cortex,”J. Physiol. (London) 148, 574–591 (1959).

  4. [4].https://smallcollation.blogspot.tw/2013/06/visual-cortex.html#gsc.tab=0

  5. [5].http://mmdays.com/2008/04/17/aperture_problem/

  6. [6].一文讀懂CNN卷積神經網路

  7. [7].数据挖掘系列(10)——卷积神经网络算法的一个实现

  8. [8].Matlab Deep Learning Toolbox

  9. [9].Matlab Deep Learning Toolbox 筆記

  10. [10].http://deeplearning.stanford.edu/wiki/index.php/Feature_extraction_using_convolution

  11. [11].Deep learning:五十一(CNN的反向求導及練習)

  12. [12] https://grzegorzgwardys.wordpress.com/2016/04/22/8/

 

 

 

 

arrow
arrow
    文章標籤
    CNN
    全站熱搜

    Darwin的AI天地 發表在 痞客邦 留言(10) 人氣()