面向新手的CNN入門指南(一)
來自專欄 論智
作者:Adit Deshpande
編譯:Bot
編者按:最近小編在搜集CNN卷積計算方面的資料,希望能出一份清晰明了的圖文列表,但即便是在CNN介紹已經泛濫的今天,一篇好的、簡單易懂的博客文章都是那麼稀缺。今天,小編就先編譯加州大學洛杉磯分校學生Adit Deshpande的幾篇入門文章,希望能給新手讀者帶來幫助。
簡介
單從字面上看,卷積神經網路這個詞聽起來就像是生物學和數學的詭異組合,裡面可能還摻了一點計算機科學的意味,但這種神經網路一直在為計算機視覺領域默默貢獻著最具影響力的創新。2012年是神經網路蓬勃發展的第一年,Alex Krizhevsky利用它們在當年的ImageNet競賽中贏得了勝利,把分類錯誤率從原來的26%降低到了15%,這在當時簡直是驚天之舉。
從那之後,許多公司開始把深度學習納入自家的核心產品中:Facebook把神經網路用於自動標記演算法,Google把神經網路用於圖像搜索,亞馬遜把它們用於商品推薦,Pinterest把它們用於主頁的個性化,而Instagram則開始用神經網路改進搜索架構。
而在這些神經網路中,應用最為廣泛的就是今天我們要聊的CNN。以圖像處理為例,我們來看看CNN是怎麼幫助進行圖像分類的。
輸入和輸出
圖像分類指的是輸入一張圖像後,神經網路輸出一個關於這個圖像的類,或是圖像屬於某類的概率的任務。對人類而言,這是我們從出生那一刻起就開始不斷學習的技能之一,而且隨著年齡的增長,人們處理這種任務會越來越輕鬆自然。
無需二次思考,我們就能快速無縫識別身處的環境和周圍的所有物體。當看到一幅圖或是觀察周圍環境時,我們幾乎是下意識地調用以往學習的所有知識,為場景中的各個對象一一打上標籤。
但計算機不同。我們把圖像輸入計算機後,它「看」到的其實是一組像素值。這些像素值的數量會隨圖像的大小和解析度發生改變,如果輸入圖像是一張JPG格式的彩色圖像,它的像素為480×480,那麼計算機得到的就是一個大小為480×480×3(這裡3表示RGB值)的數組。
這個數組裡的每一個值都介於0-225之間,描述了對應像素的強度。雖然這些值對分類任務來說毫無意義,但它們是計算機可以用的唯一輸入。這就帶出了另一個更直白的圖像分類任務描述:它其實是把像素值數組作為輸入,然後輸出圖像屬於某一類的具體概率,如80%(貓)、15%(狗)、5%(鳥)。
我們想讓計算機做什麼
知道了理想的輸入和輸出,我們面臨的下一個問題是如何讓計算機解決這個任務。我們希望它能區分所有圖像,然後找出狗之所以是狗、貓之所以是貓的獨特特徵。這是人類的本能反應。當我們看到包含狗的圖像時,如果圖像里出現了一些明確的識別特徵,如狗爪子和四條小短腿,我們可以迅速將其歸類。
同樣的,計算機分辨貓狗的做法是觀察邊緣、曲線等低層次特徵,然後把這些放進一系列卷積層中進一步提取更多抽象概念。當然,這只是CNN進行圖像分類的一般概述,在下一節中我們會具體說明。
在開始正題前,我們先來探討一下「卷積神經網路」這個詞。當你第一次接觸這個術語時,你會不會覺得這應該是神經科學或生物學方面的東西?其實這種感覺是正確的,CNN是生物學家對動物的視覺研究成果的一個衍生物。
視覺皮層中存在一塊對視野特定區域尤為敏感的細胞。1962年,Hubel和Wiesel對視覺神經細胞做了一個實驗,實驗表結果明,只有在存在特定方向邊緣的情況下,大腦中的一些神經細胞個體才會響應。他們發現所有這些神經細胞都位於一個柱狀結構中,而且能產生視覺感知。這種在特定任務的系統內部尋找特定組件的思想正是如今許多計算機任務的核心,它也是CNN背後的基礎。
讓我們回到CNN,簡而言之,它的一般流程就是:輸入圖像——卷積層、非線性層、池化層(下採樣)、完全連接層——輸出分類/概率。那麼這些層分別都做了什麼呢?
第一層 - 數學視角
CNN的第一層是一個卷積層。我會假裝你還記得神經網路的輸入和輸出分別是什麼,所以在這裡我們假設輸入圖像是一張像素為32×32的彩色JPG,相應的,CNN的輸入就是一個32×32×3的像素值數組。那麼作為第一層的卷積層究竟有什麼用?如下圖所示,我們可以把卷積層想像成一片區域,上面一個發光的手電筒正在從左上角開始一塊塊檢查所有區域。手電筒的光照範圍是5×5。
在機器學習術語中,這個手電筒是filter(神經元/卷積核),每次照亮的這塊5×5的區域是receptive field(感受野)。filter也是一個數組(權重/參數),而且深度必須和輸入圖像深度一致,這樣才能確保計算。在我們的例子中,filter的尺寸是5×5×3。
隨著手電筒從左上角開始逐漸照亮周圍區域,圖像正在卷積,這時filter的數組會與原圖像像素值數組相乘(計算點積),在上述示例中,它需要進行75次乘法運算,然後把這些乘積相加得到一個值。檢查完第一塊5×5後,我們把手電筒往右挪一個像素繼續計算點積,之後繼續往右挪一個像素,以此類推。
已知原輸入是32×32×3,filter尺寸5×5×3,當手電筒掃完整片區域後,最後我們在隱藏層獲得的是一個28×28×1的數組(窗口逐格挪動,邊界少2;3個顏色通道合併成1個)。它也被稱為activation map(加激活函數)或feature map。
註:如果這裡我們用了兩個5×5×3的filter,那最後的映射結果會是28×28×2。filter越多,空間維度保留得越好。
第一層 - 高層次的視角
知道了具體的數學計算步驟後,我們似乎還是不清楚卷積層的作用,所以這裡我們從高層次的視角再看一遍。
每個filter都可以被看作是特徵標識符( feature identifiers),這裡的特徵指的是直線邊緣、曲線、黑白等,它們是每個圖像的都具備的最簡單的特徵。假設我們有一個7×7×3的能檢測曲線的filter,它會給帶有曲線像素結構的區域更高數值。(請忽略filter的深度,只把它看成一個數組)
上圖就是這個filter的可視化,它在曲線區域賦予了更高的權重,因此當圖像感受野和它相乘時,相應區域的值會很高。
假設輸入圖像是一隻小老鼠的簡筆畫。當filter從左上角開始卷積時,窗口先接觸到老鼠尾部。請記住一點,我們必須計算filter與圖像原始像素數組和乘積。
這個圓潤的曲線和filter的理想曲線形狀相似,相乘後,它們產生了一個很大的值。
但是,如果這時我們把窗口移到老鼠頭部,輸出結果就很差了。我們要注意一點,就是filter的輸出是個activation map(必定要ReLu一下),所以在這個只包含一個filter的簡單示例中,第一個卷積層在圖像左上角的區域得到了高值,而對右上角不會有激活反應。這就起到了「過濾」的效果。
當然這只是一個filter,一個只能分辨向左凸出的曲線的filter,在真實實踐中,我們可以設置大量不同的filter來獲得更全面的activation map,如檢測直線的、色彩的。
註:這裡的曲線、直線、色彩都是假設,事實上我們並不清楚CNN捕捉的特徵是什麼,我們只能從數據中看出它有沒有得到新特徵,切勿認為計算機看到的就等同於人眼看到的。
越來越深的網路
現在在一些經典CNN架構中,卷積層之間偶爾也會出現一些其他層,感興趣的讀者可以去了解一下這些層分別是什麼,或者分別有什麼作用,但總的來說,它們的出現都是為了增強神經網路的穩定性並控制過擬合。從某種角度上說,CNN一般長這樣:
常規的CNN包含兩個卷積層就夠了,一些更高級的可能會存在多個卷積層的情況。就上圖而言,最後一個完全連接層是非常重要的,但我們把它放到下一節再介紹,先聊聊之前的各個步驟。把圖像輸入神經網路後,第一個卷積層輸出的是activation map,這時網路提取到了圖像中的一些低層次特徵,就像人類眼中的邊緣和曲線。
用ReLu激活後,CNN把activation map輸入第二個卷積層,在這裡,filter過濾的就是activation map中的特徵,這是一個從低層次特徵中提取高層次特徵的過程,雖然我們不知道計算機看到了什麼,但如果拿人類學習來類比,這一步可以被理解為從之前看到的邊緣、曲線中找出能組成半圓、正方形的線條組合。
卷積層越多,我們能提取到的高層次特徵就越多,神經網路對像素空間就越敏感。反過來看,這時網路複雜度也高了,容易產生過擬合。
全連接層
有了高層次特徵,現在我們就能品嘗CNN的精華——全連接層了。無論之前是卷積層的輸出還是ReLu、池化層的輸出,全連接層基本只接受一個輸入,並輸出一個N維向量,其中N是必須從中選擇的分類數。如果你想要分類手寫數字,這時N就是10,因為有10個數字。
這個N維向量中的每個數字代表屬於某個類別的概率。例如,如果全連接層的輸出是[0 .1 .1 .75 0 0 0 0 .05],那麼圖像是1的概率就是10%,是2概率是10%,是3的概率是75%,是9的概率則是5%(注意:還有其他方法可以表示輸出,這裡只展示softmax方法)。
簡而言之,全連接層的作用就是觀察前一層的輸出(一般是包含高層次特徵的activation map),然後確定哪些特徵與特定類最相關。以人類類比,如果要辨別圖像里的是不是狗,我們會注意裡面有沒有爪子、四肢;如果要辨別是不是鳥,翅膀和喙就特別重要。全連接層會賦予這些相關性更強的特徵更多權重,以便當我們計算權重和上一層之間的乘積時,我們可以得到圖像屬於不同類別的正確概率。
訓練
最後就到了CNN最重要的部分——訓練了。在閱讀前文時,我們可能有諸多疑惑:filter是怎麼知道自己要找哪些低層次特徵的?全連接層又是怎麼篩選activation map的?計算機能自動選取filter中的權重嗎?很顯然,這一切都是由經典的反向傳播來實現的。
在我們剛出生的時候,一切都是新的,我們不知道什麼是狗,也不知道什麼是鳥。同樣的,當一個CNN被剛寫出來的時候,它的世界也才剛起步,所有數值都是隨機選取的,filter不知道自己要篩選什麼特徵,全連接層也無法在activation map里放大有效信息。而隨著年齡的增長,我們的父母和老師逐漸向我們展示了這個多彩的世界,以及和它緊密相關的諸多標籤。訓練就是CNN學習的過程,通過查看數據集中成千上萬的圖片,神經網路也能慢慢從中捕捉到特徵,並學會正確分類。
反向傳播由4個不同步驟組成:正向傳遞、損失函數、反向傳遞和權重更新。
正向傳遞時,我們輸入一張圖像,一個尺寸為32×32×3的像素值數組,然後將其傳遞給整個網路。在我們的第一個訓練示例中,由於所有權重/filter值都是隨機初始化的,因此輸出結果可能類似[.1 .1 .1 .1 .1 .1 .1 .1 .1],它在分類上「不偏不倚」。
損失函數開啟了「反向」的第一步。當網路現有權重無法提取低層次特徵時,這就意味著它沒法得出合理的分類結果。但是記住一點,我們用的是訓練數據,它包含圖像和標籤兩種信息,這就意味著我們能用損失函數計算預測標籤和真實標籤的差異,差異越小,CNN預測正確的可能性就越大,性能也越好。損失函數有很多,其中最常用的MSE(均方誤差):
既然目的是把損失值降到最低,那這就成了一個優化問題——找出對輸出影響最大的輸入,也就是dL / dW,其中W是特定層的權重。
現在,我們要做的是通過網路進行反向傳遞,確定哪些權重對損失影響最大,並找到調整它們的方法從而減少損失。一旦我們計算出這個導數,我們就會進入最後一步,權重更新。
學習率(learning rate)是一個可以自定義調整的超參數,它影響著著CNN的收斂速度。如果學習率過大,權重更新的幅度就很大,這時CNN能快速收斂,但它也帶來一個問題,就是權重的精度不夠,無法得出最優解。
正向傳遞、損失函數、反向傳遞和權重更新的過程構成一輪訓練迭代。CNN會對參與訓練的每組圖像(batch)進行進行固定次數的迭代。一旦你完成了最後一個訓練樣本的參數更新,這時網路的性能更好了,各層的權值也終於調整正確了。
下期預告
本文介紹了CNN的一些基礎知識,包括filter的作用、各層的作用等,但還未介紹網路架構、批量歸一化、損失函數選擇、數據增強、正則化方法等內容。新人可以依靠本文對CNN建立初步認識,部分重要內容我們會在下一篇文章中詳談。
原文地址:adeshpande3.github.io/adeshpande3.github.io/A-Beginner』s-Guide-To-Understanding-Convolutional-Neural-Networks/
譯文地址:
https://mp.weixin.qq.com/s?__biz=MzI3ODkxODU3Mg==&mid=2247486359&idx=1&sn=0a14c0e1d0204850d3ab924c92fdf5b1&chksm=eb4eef54dc396642435f4209e0680b6562912dcd3009967eded52d92a90eb0dd9333511d8ec0#rd推薦閱讀:
TAG:卷積神經網路CNN | 深度學習DeepLearning | 計算機視覺 |