卷積神經網路初探

發表於2017-03-27

前言

目前為止我已經完整地學完了三個機器學習教程:包括“Stanford CS229”,”Machine Learning on Coursrea” 和 “Stanford UFLDL”,卷積神經網路是其中最抽象的概念。

維基百科對卷積的數學定義為:

卷積神經網路初探

由於卷積常用與訊號處理,很多人基於“輸入->系統->響應”這一模型來解釋卷積的物理意義,這裡轉載一個非常通俗的版本:

比如說你的老闆命令你幹活,你卻到樓下打檯球去了,後來被老闆發現,他非常氣憤,扇了你一巴掌(注意,這就是輸入訊號,脈衝),於是你的臉上會漸漸地鼓起來一個包,你的臉就是一個系統,而鼓起來的包就是你的臉對巴掌的響應,好,這樣就和訊號系統建立起來意義對應的聯絡。下面還需要一些假設來保證論證的嚴謹:假定你的臉是線性時不變系統,也就是說,無論什麼時候老闆打你一巴掌,打在你臉的同一位置,你的臉上總是會在相同的時間間隔內鼓起來一個相同高度的包,並且假定以鼓起來的包的大小作為系統輸出。好了,下面可以進入核心內容——卷積了!

如果你每天都到地下去打檯球,那麼老闆每天都要扇你一巴掌,不過當老闆打你一巴掌後,你5分鐘就消腫了,所以時間長了,你甚至就適應這種生活了……如果有一天,老闆忍無可忍,以0.5秒的間隔開始不間斷的扇你的過程,這樣問題就來了,第一次扇你鼓起來的包還沒消腫,第二個巴掌就來了,你臉上的包就可能鼓起來兩倍高,老闆不斷扇你,脈衝不斷作用在你臉上,效果不斷疊加了,這樣這些效果就可以求和了,結果就是你臉上的包的高度隨時間變化的一個函式了(注意理解);如果老闆再狠一點,頻率越來越高,以至於你都辨別不清時間間隔了,那麼,求和就變成積分了。可以這樣理解,在這個過程中的某一固定的時刻,你的臉上的包的鼓起程度和什麼有關呢?和之前每次打你都有關!但是各次的貢獻是不一樣的,越早打的巴掌,貢獻越小,所以這就是說,某一時刻的輸出是之前很多次輸入乘以各自的衰減係數之後的疊加而形成某一點的輸出,然後再把不同時刻的輸出點放在一起,形成一個函式,這就是卷積,卷積之後的函式就是你臉上的包的大小隨時間變化的函式。本來你的包幾分鐘就可以消腫,可是如果連續打,幾個小時也消不了腫了,這難道不是一種平滑過程麼?反映到劍橋大學的公式上,f(a)就是第a個巴掌,g(x-a)就是第a個巴掌在x時刻的作用程度,乘起來再疊加就ok了,大家說是不是這個道理呢?我想這個例子已經非常形象了,你對卷積有了更加具體深刻的瞭解了嗎?

這是一些嘗試解釋卷積的文章:

http://www.guokr.com/post/342476/

http://blog.csdn.net/yeeman/article/details/6325693

https://zh.wikipedia.org/wiki/%E5%8D%B7%E7%A7%AF

而在影象處理中通常使用離散形式的卷積,在下一節中介紹。

卷積特徵提取(convolution)

卷積特徵提取的過程

假設有一個稀疏自編碼器 SAE,訓練使用的是 3×3 的小圖。將 SAE 用作深度網路的隱藏層時,它依然只接受 3×3 的資料作為輸入,且假設這個隱藏層有 k 個單元(每個單元也被稱為一個卷積核 – Convolution Kernel,由對應的權值向量 W 和 b 來體現)。

每個隱藏單元的輸入是用自己的權值向量 W 與 3×3 的小圖做內積,再與截距項相加得到的:

卷積神經網路初探

假如深度網路的輸入是 5×5 的大圖,SAE 要從中提取特徵,必須將 5×5 的大圖分解成若干 3×3 的小圖並分別提取它們的特徵。分解方法就是:從大圖的 (1, 1)、(1, 2)、(1, 3)、…  、(3, 3)等 9 個點開始分別作為小圖的左上角起點,依次擷取 9 張帶有重合區域的小圖,然後分別提取這 9 張小圖的特徵:

卷積神經網路初探

所以,每個隱藏單元將有 9 個輸入,不同於之前的 1 個。然後將所有輸入分別匯入啟用函式計算相應的輸出,卷積特徵提取的工作就完成了。

對於本例,隱藏層所提取的特徵共有 9×k 個;更一般化地,如果大圖尺寸是 r×c,小圖尺寸是 a×b,那麼所提取特徵的個數為:

卷積神經網路初探

卷積特徵提取的原理

卷積特徵提取利用了自然影象的統計平穩性(Stationary):

自然影象有其固有特性,也就是說,影象的一部分的統計特性與其他部分是一樣的。這也意味著我們在這一部分學習的特徵也能用在另一部分上,所以對於這個影象上的所有位置,我們都能使用同樣的學習特徵。

池化(Pooling)

池化過程

在完成卷積特徵提取之後,對於每一個隱藏單元,它都提取到 (r-a+1)×(c-b+1)個特徵,把它看做一個矩陣,並在這個矩陣上劃分出幾個不重合的區域,然後在每個區域上計算該區域內特徵的均值或最大值,然後用這些均值或最大值參與後續的訓練,這個過程就是【池化】。

卷積神經網路初探

 

池化的優點

  1. 顯著減少了引數數量
  2. 池化單元具有平移不變性 (translation invariant)有一個 12×12 的 feature map (隱藏層的一個單元提取到的卷積特徵矩陣),池化區域的大小為 6×6,那麼池化後,feature map 的維度變為 2×2。

    卷積神經網路初探

    假設原 feature map 中灰色元素的值為 1,白色元素的值為 0。如果採用 max pooling,那麼池化後左上角視窗的值為 1。如果將影象向右平移一個畫素:

    卷積神經網路初探

    池化後左上角視窗的值還是 1。如果將影象縮小:

    卷積神經網路初探

    池化後左上角視窗的值依然是 1。

    通常我們認為影象經過有限的平移、縮放、旋轉,不應改變其識別結果,這就要求經過平移、縮放、旋轉的圖片所提取的特徵與原圖所提取的特徵相同或相似,因此分類器才能把它們識別成同一類。

幾種池化方式

比較主流的池化方式有如下幾種:

  1. 一般池化(General Pooling): max pooling 和 average pooling現在已經知道了 max pooling 與 average pooling 的幾何意義,還有一個問題需要思考:它們分別適用於那些場合?在不同的場合下,它們的表現有什麼不一樣?為什麼不一樣?

    網路上有人這樣區分 max pooling 和 average pooling:

    “average對背景保留更好,max對紋理提取更好”。

    限於篇幅以及我的理解還不深,就不展開討論了,如果以後需要,我會深入研究一下。

  2. 重疊池化(Overlapping Pooling)重疊池化的相鄰池化視窗之間會有重疊區域。
  3. 空間金字塔池化(Spatial Pyramid Pooling)空間金字塔池化擴充了卷積神經網路的實用性,使它能夠以任意尺寸的圖片作為輸入。
  4. 下面列出一些研究池化的論文:http://yann.lecun.com/exdb/publis/pdf/boureau-icml-10.pdf

    http://yann.lecun.com/exdb/publis/pdf/boureau-cvpr-10.pdf

    http://yann.lecun.com/exdb/publis/pdf/boureau-iccv-11.pdf

    http://ais.uni-bonn.de/papers/icann2010_maxpool.pdf

彙總

有 m 張彩色自然圖片拿來訓練一個神經網路,使它能夠對圖片中的物體做分類。訓練過程可以大致分為以下幾步:

  1. 從圖片庫中隨機裁剪出相同尺寸的小圖若干張,用來訓練一個稀疏自編碼器 C1;
  2. 以 C1 作為第一個卷積層,從原圖中做卷積特徵提取;
  3. 在 C1 下游新增一個池化層 S1,對 C1 所提取的特徵做池化計算;
  4. 如果需要提取更加抽象的特徵,在 S1 之後新增摺積層 C2,C2 是一個使用 S1 的資料進行訓練的稀疏自編碼器;
  5. 在 C2 下游新增一個池化層 S2,如果需要提取進一步抽象的特徵,重複新增摺積層與池化層即可;
  6. 以最後一個池化層的輸出作為資料訓練分類器。

卷積神經網路初探

 

課後作業(Convolution and Pooling)

In this exercise you will use the features you learned on 8×8 patches sampled from images from the STL-10 dataset in the earlier exercise on linear decoders for classifying images from a reduced STL-10 dataset applying convolution and pooling. The reduced STL-10 dataset comprises 64×64 images from 4 classes (airplane, car, cat, dog).

這次作業依賴上一次“linear decoders”作業的程式碼,使用的資料是 STL-10 的一個子集,用來識別四種影象:飛機、汽車、貓和狗。

程式碼地址,由於 GIthub 有檔案大小限制,所以這次沒有上傳資料檔案。

Pooling 的程式碼比較簡單,所以這裡把計算卷積的程式碼詳細註釋後貼出來:

cnnConvolve.m

卷積神經網路初探

卷積神經網路初探

執行結果(識別的正確率):

  1. 使用 average pooling:卷積神經網路初探
  2. 使用 max pooling:卷積神經網路初探

相關文章