作者:論智
連結:https://zhuanlan.zhihu.com/p/42090228
來源:知乎
近年來,随着一些強大、通用的深度學習架構相繼出現,把卷積層添加進深度學習模型也成了可能。這個過程很簡單,隻需一行代碼就能實作。但是,你真的了解“卷積”是什麼嗎?當初學者第一次接觸這個詞時,看到堆疊在一起的卷積、核、通道等術語,他們往往會感到困惑。作為一個概念,“卷積”這個詞本身就是複雜、多層次的。

在這篇文章中,我們将分解卷積操作的機制,逐漸将其與标準神經網絡聯系起來,探索它們是如何建立起強大的視覺層次結構,并最終成為強大的圖像特征提取器的。
2D卷積:操作
2D卷積是一個相當簡單的操作:我們先從一個小小的權重矩陣,也就是卷積核(kernel)開始,讓它逐漸在二維輸入資料上“掃描”。卷積核“滑動”的同時,計算權重矩陣和掃描所得的資料矩陣的乘積,然後把結果彙總成一個輸出像素。
标準卷積
卷積核會在其經過的所有位置上都重複以上操作,直到把輸入特征矩陣轉換為另一個二維的特征矩陣。簡而言之,輸出的特征基本上就是原輸入特征的權重和(權重是卷積核自帶的值),而從像素位置上看,它們所處的地方大緻相同。
那麼為什麼輸出特征的會落入這個“大緻區域”呢?這取決于卷積核的大小。卷積核的大小直接決定了在生成輸出特征時,它合并了多少輸入特征,也就是說:卷積核越小,輸入輸出的位置越接近;卷積核越大,距離就越遠。
這和全連接配接層很不一樣。在上圖的例子中,我們的輸入有5×5=25個特征,而我們的輸出則是3×3=9個特征。如果這是一個全連接配接層,輸入25個特征後,我們會輸出包含25×9=225個參數的權重矩陣,每個輸出特征都是每個輸入特征的權重和。
這意味着對于每個輸入特征,卷積執行的操作是使用9個參數進行轉換。它關注的不是每個特征究竟是什麼,而是這個大緻位置都有什麼特征。這一點很重要,了解了它,我們才能進行深入探讨。
一些常用的技巧
在我們繼續讨論前,我們先來看看卷積神經網絡中經常出現的兩種技巧:Padding和Strides。
Padding
如果你仔細看了上文中的gif,你會發現我們把5×5的特征矩陣轉換成了3×3的特征矩陣,輸入圖像的邊緣被“修剪”掉了,這是因為邊緣上的像素永遠不會位于卷積核中心,而卷積核也沒法擴充到邊緣區域以外。這是不理想的,通常我們都希望輸入和輸出的大小應該保持一緻。
padding
Padding就是針對這個問題提出的一個解決方案:它會用額外的“假”像素填充邊緣(值一般為0),這樣,當卷積核掃描輸入資料時,它能延伸到邊緣以外的僞像素,進而使輸出和輸入大小相同。
Stride
如果說Padding的作用是使輸出與輸入同高寬,那麼在卷積層中,有時我們會需要一個尺寸小于輸入的輸出。那這該怎麼辦呢?這其實是卷積神經網絡中的一種常見應用,當通道數量增加時,我們需要降低特征空間次元。實作這一目标有兩種方法,一是使用池化層,二是使用Stride(步幅)。
步幅
滑動卷積核時,我們會先從輸入的左上角開始,每次往左滑動一列或者往下滑動一行逐一計算輸出,我們将每次滑動的行數和列數稱為Stride,在上節的圖檔中,Stride=1;在上圖中,Stride=2。Stride的作用是成倍縮小尺寸,而這個參數的值就是縮小的具體倍數,比如步幅為2,輸出就是輸入的1/2;步幅為3,輸出就是輸入的1/3。以此類推。
在一些目前比較先進的網絡架構中,如ResNet,它們都選擇使用較少的池化層,在有縮小輸出需要時選擇步幅卷積。
多通道卷積
當然,上述例子都隻包含一個輸入通道。實際上,大多數輸入圖像都有3個RGB通道,而通道數的增加意味着網絡深度的增加。為了友善了解,我們可以把不同通道看成觀察全圖的不同“視角”,它或許會忽略某些特征,但一定也會強調某些特征。
彩色圖像一般都有紅、綠、藍三個通道
這裡就要涉及到“卷積核”和“filter”這兩個術語的差別。在隻有一個通道的情況下,“卷積核”就相當于“filter”,這兩個概念是可以互換的;但在一般情況下,它們是兩個完全不同的概念。每個“filter”實際上恰好是“卷積核”的一個集合,在目前層,每個通道都對應一個卷積核,且這個卷積核是獨一無二的。
filter:卷積核的集合
卷積層中的每個filter有且隻有一個輸出通道——當filter中的各個卷積核在輸入資料上滑動時,它們會輸出不同的處理結果,其中一些卷積核的權重可能更高,而它相應通道的資料也會被更加重視(例:如果紅色通道的卷積核權重更高,filter就會更關注這個通道的特征差異)。
備注:(卷積層——》filter過濾器——》卷積核)
卷積核處理完資料後,形成了三個版本的處理結果,這時,filter再把它們加在一起形成一個總的通道。是以簡而言之,卷積核處理的是不同通道的不同版本,而filter則是作為一個整體,産生一個整體的輸出。
最後,還有偏置項。我們都知道每個filter輸出後都要加上一個偏置項,那麼為什麼要放在這個位置呢?如果聯系filter的作用,這一點不難了解,畢竟隻有在這裡,偏置項才能和filter一起作用,産生最終的輸出通道。
以上是單個filter的情況,但多個filter也是一樣的工作原理:每個filter通過自己的卷積核集處理資料,形成一個單通道輸出,加上偏置項後,我們得到了一個最終的單通道輸出。如果存在多個filter,這時我們可以把這些最終的單通道輸出組合成一個總輸出,它的通道數就等于filter數。這個總輸出經過非線性處理後,繼續被作為輸入饋送進下一個卷積層,然後重複上述過程。
2D卷積:直覺
卷積仍是線性變換
盡管上文已經講解了卷積層的機制,但對比标準的前饋網絡,我們還是很難在它們之間建立起聯系。同樣的,我們也無法解釋為什麼卷積可以進行縮放,以及它在圖像資料上的處理效果為什麼會那麼好。
假設我們有一個4×4的輸入,目标是把它轉換成2×2的輸出。這時,如果我們用的是前饋網絡,我們會把這個4×4的輸入重新轉換成一個長度為16的向量,然後把這16個值輸入一個有4個輸出的密集連接配接層中。下面是這個層的權重矩陣W:
總而言之,有64個參數
雖然卷積的卷積核操作看起來很奇怪,但它仍然是一個帶有等效變換矩陣的線性變換。如果我們在重構的4×4輸入上使用一個大小為3的卷積核K,那麼這個等效矩陣會變成:
這裡真的隻有9個參數
注:雖然上面的矩陣是一個等效變換矩陣,但實際操作可能會不太一樣。
可以發現,整個卷積仍然是線性變換,但與此同時,它也是一種截然不同的變換。相比前饋網絡的64個參數,卷積得到的9個參數可以多次重複使用。由于權重矩陣中包含大量0權重,我們隻會在每個輸出節點看到標明數量的輸入(卷積核的輸入)。
而更高效的是,卷積的預定義參數可以被視為權重矩陣的先驗。卷積核的大小、filter的數量,這些都是可以預定義的網絡參數。當我們使用預訓練模型進行圖像分類時,我們可以把預先訓練的網絡參數作為目前的網絡參數,并在此基礎上訓練自己的特征提取器。這會大大節省時間。
從這個意義上講,雖然同為線性變換,卷積相比前饋網絡的優勢就可以被解釋了。和随機初始化不同,使用預訓練的參數允許我們隻需要優化最終全連接配接層的參數,這意味着更好的性能。而大大削減參數數量則意味着更高的效率。
上圖中我們隻展示了把64個獨立參數減少到9個共享參數,但在實際操作中,當我們從MNIST選擇784幅224×224×3的圖像時,它會有超過150,000個輸入,也就是超過100億個參數。相比之下,整個ResNet-50隻有約2500萬個參數。
是以,将一些參數固定為0可以大大提高效率。那麼對比遷移學習,我們是怎麼判斷這些先驗會産生積極效果的呢?
答案在于先前引導參數學習的特征組合。
局部性
在文章開頭,我們就讨論過這麼幾點:
- 卷積核僅組合局部區域的幾個像素,并形成一個輸出。也就是說,輸出特征隻代表這一小塊局部區域的輸入特征。
- 卷積核會在“掃描”完整張圖像後再生成輸出矩陣。
是以,随着反向傳播從分類節點開始往前推移,卷積核就可以不斷調整權重,努力從一組本地輸入中提取有效特征。另外,因為卷積核本身應用于整個圖像,是以無論它學習的是哪個區域的特征,這些特征必須足夠通用。
如果這是任何其他類型的資料,比如應用程式的安裝序列号,卷積的這種操作完全不起作用。因為序列号雖然是一系列有順序的數字,但他們彼此間沒有共享的資訊,也沒有潛在聯系。但在圖像中,像素總是以一緻的順序出現,并且會始終對周圍像素産生影響:如果所有附近的像素都是紅色,那麼我們的目标像素就很可能也是紅色的。如果這個像素最終被證明存在偏差,不是紅色的,那這個有趣的點就可能會被轉換為特征。
通過對比像素和臨近像素的差異來學習特征——這實際上是許多早期計算機視覺特征提取方法的基礎。例如,對于邊緣檢測,我們可以使用Sobel edge detection:
用于垂直邊緣檢測的Sobel算子
對于不包含邊緣的網格(如天空),因為大多數像素都是相同的值,是以它的卷積核的總輸出為0。對于具有垂直邊緣的網格,邊緣左側和右側的像素存在差異,是以卷積核的輸出不為零,激活邊緣區域。雖然這個卷積核一次隻能掃描3×3的區域,提取其中的特征,但當它掃描完整幅圖像後,它就有能力在圖像中的任何位置檢測全局範圍内的某個特征。
那麼深度學習和這種傳統方法的差別是什麼?對于圖像資料的早期處理,我們确實可以用低級的特征檢測器來檢測圖中的線條、邊緣,那麼,Sobel邊緣算子的作用能否被卷積學習到?
深度學習研究的一個分支是研究神經網絡模型可解釋性,其中最強大的是使用了優化的特征可視化。它的思路很簡單,就是通過優化圖像來盡可能強烈地激活filter。這确實具有直覺意義:如果優化後的圖像完全被邊緣填充,這其實就是filter本身正在尋找激活特征,并讓自己被激活的強有力證據。
GoogLeNet第一個卷積層的3個不同通道的特征可視化,請注意,雖然它們檢測到不同類型的邊緣,但它們仍然是低級邊緣檢測器
GoogLeNet第二個、第三個卷積層的12個通道的特征可視化
這裡要注意一點,卷積圖像也是圖像。卷積核是從圖像左上角開始滑動的,相應的,它的輸出仍将位于左上角。是以我們可以在這個卷積層上在做卷積,以提取更深層的特征可視化。
然而,無論我們的特征檢測器如何深入,在沒有任何進一步改變的情況下,它們仍将在非常小的圖像塊上運作。無論檢測器有多深,它的大小就隻有3×3,它是不可能檢測到完整的臉部的。這是感受野(Receptive field)的問題。
感受野
無論是什麼CNN架構,它們的基本設計就是不斷壓縮圖像的高和寬,同時增加通道數量,也就是深度。如前所述,這可以通過池化和Stride來實作。局部性影響的是臨近層的輸入輸出觀察區域,而感受野決定的則是整個網絡原始輸入的觀察區域。
步幅卷積背後的想法是我們隻滑動固定距離的間隔,并跳過中間的網格。
如上圖所示,把stride調整為2後,卷積得到的輸出大大縮小。這時,如果我們在這個輸出的基礎上做非線性激活,然後再上面再加一個卷積層,有趣的事就發生了。相比正常卷積得到的輸出,3×3卷積核在這個步幅卷積輸出上的感受野更大。
這是因為它的原始輸入區域就比正常卷積的輸入區域大,這會對後續特征提取産生影響。
這種感受野的擴大允許卷積層将低級特征(線條、邊緣)組合成更進階别的特征(曲線、紋理),正如我們在mixed3a層中看到的那樣。而随着我們添加更多Stride層,網絡會顯示出更多進階特征,如mixed4a、mixed5a。
通過檢測低級特征,并使用它們來檢測更進階别的特征,使其在視覺層次結構中向前發展,最終能夠檢測到整個視覺概念,如面部,鳥類,樹木等。這就是卷積在圖像資料上如此強大、高效的一個原因。
結論
現如今,CNN已經允許開發者們從建構簡單的CV應用,到把它用于為複雜産品和服務提供技術動力,它既是照片庫中用于檢測人臉的小工具,也是臨床醫學中幫助醫生篩查癌細胞的貼心助手。它們可能是未來計算機視覺的一個關鍵,當然,一些新的突破也可能即将到來。
但無論如何,有一件事是确定的:CNN是當今許多創新應用的核心,而且它們的效果絕對令人驚歎,這項技術本身也有掌握、了解的必要