9. 深度學習實踐:卷積網絡

卷積神經網絡,Convolutional Neural Network,CNN

卷積網絡:至少在網絡的一層中使用了卷積運算來替代一般的矩陣乘法運算的NN。

1. 卷積運算

用計算機處理數據時,時間會被離散化,則爲求和形式:

s(t)=(xw)(t)=a=x(a)w(ta)

x 通常是多維數組的輸入。w 是核函數(卷積核),通常由學習算法優化得到。輸出也稱特徵映射(feature map)。

2維卷積的例子如圖,滑動平移窗口,對應元素相乘總相加,可以看做是一種特殊的矩陣乘法:

這裏寫圖片描述

2. 動機

卷積運算的三個重要特點,幫助改進ML系統:

  • 稀疏交互
  • 參數共享
  • 等變表示

2.1 稀疏表示

亦稱稀疏連接,或稀疏權重。使核的大小遠小於輸入的大小來達到。

這裏寫圖片描述

這個圖從下往上看,下方是s由矩陣乘法產生,一個輸入單元x3會供應所有輸出,與所有都連接,所有輸出都會受到x3的影響。上方是s由核寬度爲3的卷積產生,只有3個輸出與x3輸入相連。強調輸入單元。

假設m個輸入,n個輸出。矩陣乘法需要mn個參數。若限制每個輸出的連接數爲k(核寬度),則需要kn個參數。

這裏寫圖片描述

這個圖從上往下看。上面s3輸出來自於3個輸入,這三個單元被稱爲s3的 感受野(receptive field)。下面s3輸出來自於所有輸入。強調輸出單元。

深度卷積網路中,網絡深層的單元可能與絕大多數輸入是間接交互的,如圖所示:

這裏寫圖片描述

深層的g3的感受野,比h3等中層的感受野大。若包含步幅卷積或池化之類的結構,效應會更強。這意味着:儘管CNN中連接很稀疏,但deep層的單元可間接地連接到全部或大部分輸入圖像。

2.2 參數共享

一個模型中的多個函數中使用相同的參數。傳統NN中,當計算一層的輸出時,權重矩陣的每個權重元素僅用一次。CNN中,核的每一個元素都作用在輸入的每一個位置上(核跳着給每個輸入都上一遍)。參數共享沒有改變前向傳播的時間,但顯著降低了模型存儲和統計效率。如圖示:

這裏寫圖片描述

上面的總共3個參數,滑動着給每個輸入都上一遍。下面的總共25個參數。下圖說明了稀疏連接和參數共享是如何顯著提高線性函數在一張圖上進行邊緣檢測的效率的:

這裏寫圖片描述

卷積核爲-11 。輸入爲320*280,輸出爲319*280。該卷積滑動一遍給出了輸入圖中所有垂直方向帶上的邊緣的強度。使用卷積:319*280*3=267960次浮點運算(2個乘法1個加法)。爲了用矩陣描述相同的變換,需要(320*280)*(319*280)個元素的矩陣(大多數元素爲0)。

將小的局部區域上的相同線性變換,應用到整個輸入上,卷積是描述這種變換的極其有效的方法。

2.3 等變表示

如果一個函數滿足:輸入改變,輸出也以同樣的方式改變,這一性質,就說它是等變的(equivariant)。特別地,對於卷積函數f(x) ,平移函數g(x) ,有f(g(x))=g(f(x)) 。先平移再卷積,先卷積再平移,效果是一樣的。因爲參數共享的特殊形式使然,遲早都要被卷積下。卷積對其他一些變換並不是天然等變的,例如圖像縮放或旋轉等。

3. 池化

池化函數使用某一位置的相鄰輸出的總體統計特徵,來代替網絡在該位置的輸出。例如,最大池化函數,給出相鄰矩陣區域的最大值。

當我們對輸入進行少量平移時,經過池化函數後的大多數輸出,並不會發生改變。圖示:

這裏寫圖片描述

局部平移不變性,是一個很有用的性質,尤其是當我們關心某個特徵是否出現而不關心它出現的具體位置時。例如,判斷一張圖是否包含人臉,並不需要知道眼睛的具體位置,只需要知道一隻眼在左邊,一隻眼在右邊。

池化能幫助輸入的表示近似不變。如圖,下面一行的所有值都發生了改變,但上面一行只有一半的值改變。因爲最大池化單元只對周圍的最大值比較敏感,而不是對精確的位置。

降採樣的池化,使得表示的大小減少,減輕了下一層的計算和統計負擔。

4. 卷積與池化:無限強的先驗

先驗概率分佈:模型參數的概率分佈,刻畫了我們看到數據之前,我們認爲什麼樣的模型是合理的信念。先驗,強或者弱,取決於先驗中概率密度的集中程度。弱先驗,具有較高熵值,例如方差很大的高斯分佈,允許數據對於參數的改變具有或多或少的自由性。強先驗,具有較低熵值,例如方差很小的高斯分佈,在決定參數取得最終值時,起着更加積極作用。

無限強的先驗,需要對一些參數的概率置零,並且完全禁止對這些參數賦值。可以把卷積網絡想象成一個全連接網絡,但對其權重有無限強的先驗:一個隱藏單元的權重必須和它鄰居的權重相同,但可以在空間中移動,大部分權重爲0(沒連接可以認爲就是0嘛)。該先驗說明了:該層應該學的函數只包含局部連接關係,並且對平移具有等變性。池化的先驗說明了:我們期望該層的每一個單元都具有對少量平移的不變性。

這個想象的一個啓發是:卷積和池化可能導致欠擬合。若一項任務依賴於保存精確的空間信息,則所有特徵上池化將會增大訓練誤差。若一項任務中涉及到要對輸入中相隔較遠的信息進行合併時,那麼卷積利用的先驗就不正確了。

5. 基本卷積函數的變體

(1)NN中的卷積,通常是指由多個並行卷積組成的運算。一個卷積提取一種特徵。我們希望網絡每一層能夠在多個位置提取多種類型的特徵。

(2)有時希望跳過核中的一些位置,降低計算開銷,當然特徵沒有之前好。可看做是對全卷積函數輸出的下采樣。下采樣卷積的步幅,隔多久採一個。

這裏寫圖片描述

圖上部是直接做步幅爲2的卷積。圖下部是先做單位步幅的卷積,隨後降採樣。二者的輸入輸出等價。

(3)零填充。不零填充,則每一層就會縮減。

這裏寫圖片描述

(4)非共享卷積(unshared convolutional)。有時並非想真用卷積,而是一些 局部連接 的網絡層。和具有一個小核的離散卷積很像,但並不橫跨位置來共享參數。

這裏寫圖片描述

上半部分的感受野有兩個像素的局部連接層。下半部分爲卷積層。區別在於參數共享上。當我們知道每一個特徵都是一小塊空間的函數,並且相同的特徵不會出現在所有空間上時,局部連接層很有用。例如,我們想要辨別一張圖片是否是人臉圖像時,只需要去尋找嘴是否再圖像下半部即可。

平鋪卷積(tiled convolutional):對卷積層和局部連接層的折中。

這裏寫圖片描述

(5)實現卷積網絡時,通常也需要除卷積外的其他運算。卷積是一種線性運算,可表示成矩陣乘法的形式,其中包含的矩陣是關於卷積核的函數。該矩陣稀疏(僅核寬度連,其他爲0的表示不連),且核的每個元素都複製給矩陣的多個元素。

這種觀點可幫助我們導出實現一個卷積網絡所需的很多其他運算。例如,通過卷積定義的矩陣轉置的乘法,可用在卷積層反向傳播誤差的導數計算上。若想要從隱藏層單元重構可視化單元時,同樣的運算也需要。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章