大數據文摘作品,轉載要求見文末
編譯 | 馬卓群,元元
keiko,錢天培
在上周,我們為大家帶來了一篇卷積神經網絡的入門介紹:《卷積?神經?網絡?教你從讀懂詞語開始了解計算機視覺識別最火模型 | CNN入門手冊(上)》(戳標題直接閱讀),相信大家已經對卷積神經網絡有了初步的了解。這周,我們將更深入地介紹卷積神經網絡(以下簡稱「ConvNets」),解釋上周我們提到卻又沒有細講的一些概念 。
聲明:我在這部分介紹的一些主題非常複雜,完全可以單獨列出來寫成一篇文章。為了在保證內容全面性的同時,保持文章的簡潔明了,我會提供原研究論文的連結供大家參考,這些論文對我討論的主題有更詳細的解釋。
首先,讓我們回過頭來看看我們的之前介紹的卷積層。還記得過濾器,感受域,卷積嗎?如果不記得的話,請回顧本系列的上集《卷積?神經?網絡?教你從讀懂詞語開始了解計算機視覺識別最火模型 | CNN入門手冊(上)》(戳標題直接閱讀)。
現在,我們可以通過改變2個主要參數來修改每個層的表現行為。在選擇過濾器的尺寸後,還要選擇步長和填充。
步長控制著過濾器如何對輸入量進行卷積。在第一部分的例子中,過濾器是通過一次移動一個單位來對輸入量進行卷積的,而這個器移動單位就是步長。(在這種情況下,步長即為1。)我們通常選擇的步長會確保輸出量是整數,而非分數。讓我們看一個例子,想像我們有一個7×7的輸入量,一個3×3的過濾器(為了更加簡明,這裡我們忽略第三維度),步長為1。這是情況相信大家已經很熟悉了。
老一套,對吧?看看你是否能猜出,隨著步長增加到2,輸出量將會發生什麼變化。
圖為步長為2時卷積的輸出情況
所以,正如你所看到的,感受域現在一次移動了2個單位,輸出量也縮小了。請注意,如果我們試圖將步長設為3,當我們進行到最後一行/列,我們就會遇到感受域無法與輸入量完全重疊、有空白餘留的問題。通常,如果希望在感受域有更少地重疊、保持較小的空間維度,程式設計師們就會增加步長。
現在,讓我們看看填充。在開始之前,讓我們先想一個場景。當你把三個5×5×3個過濾器應用到一個32×32×3輸入量時會發生什麼?輸出量將會是28×28×3。請注意,空間維度會減少。當我們繼續應用卷積層的時候,量的大小將減少得比我們想像的更快。在學習網絡的早期層中,我們希望最大化地保存原始輸入卷的信息,以便我們提取那些低層次的特徵。比如說我們要運用同樣的卷積層,但同時我們想要讓輸出量保持在32 x 32 x 3。要做到這一點,我們可以對該層加一個大小為2的零填充。零填充就是對輸入量在邊界上用零進行填充。如果我們考慮2個零填充,那麼我們就有了一個36×36×3的輸入量。
如果你的步長為1,並且把零填充的大小設置為
其中,K是過濾器大小,那麼輸入量和輸出量將始終保持相同的空間維度。
對於任何一個定卷積層,輸出尺寸的計算公式如下:
其中,O是輸出量的高度/長度,W是輸入量的高度/長度,K是過濾器的大小,P是填充大小,S是步長。
選擇超級變量
那麼,我們要怎麼知道應該用多少神經網絡層、其中有多少卷積層、過濾器的尺寸是什麼,以及步長和填充的值是多少呢?這些都不是無關緊要的問題,但也沒有一套公認的標準。這是因為網絡的選取將在很大程度上依賴於您所擁有的數據類型。數據會因為圖像的大小、複雜度、圖像處理任務的類型不同而變化。當你分析數據的時候,一個選擇超參數的方式就是,尋找能創造出圖像抽象的合適尺寸組合。
修正先行單元層(ReLU)
根據傳統慣例,在每個卷積層後,我們會緊跟著應用一個非線性層(或激化層)。沒有這個非線性轉化,整個系統基本上就是在卷積層中進行線性操作(只是元素頻繁的的乘法和加法)。在過去,我們通常使用的是非線性函數,比如tanh 函數和sigmoid函數,但研究人員發現ReLU層在不犧牲精確度的前提下加快網絡的訓練速度,從而帶來更好的運作效果。同時,它也有助於緩解梯度消失問題。這個問題指的是,在經過每一層後,梯度會指數性地遞減,因而低層的網絡訓練會變得非常慢。(對這個問題的詳細解釋已超出了這篇文章範圍,如果想看進一步的解釋,請參照https://en.wikipedia.org/wiki/Vanishing_gradient_problem 和 https://www.quora.com/What-is-the-vanishing-gradient-problem )
ReLU層將函數f(x)= max(0,x)應用於所有的輸入值。基本上,這一層就是把所有的負激活變為0。這一層提高了模型中的非線性特性和整個網絡,並且不影響感受野的卷積層。
這篇由偉大的Geoffrey Hinton而著(又名深度學習之父)的文章更詳細的闡釋了ReLu的優點(http://www.cs.toronto.edu/~fritz/absps/reluICML.pdf)。
池化層
在應用了一些ReLU層之後,程式設計師可以選擇應用池化層。它也被稱為向下採樣層(downsampling layer)。在不同池化層中,最大值池化(maxpooling)是最受歡迎的。先用一個過濾器(通常大小2x2)和一個相同長度的步長。將其應用於輸入量,然後在每一個分區輸出最大數字 。
另外幾種池化層的類型包括平均池和L2規範池。池化層背後的直觀原理是,一旦我們知道原始輸入量中(這裡將會有一個高激活值)有一個特定的特徵,那麼它的確切位置,就沒有它相對於其他特徵的位置那麼重要了。所以,你可以想像,這一層是如何極大地減少了網絡的空間維度的(長度和寬度的變化,深度不變)。這可以幫助實現兩個目的。首先,參數(或者權重)的數量減少了75%,從而降低了計算成本。其次,我們也可以藉此控制過度擬合。
過度擬合這個術語指的是,一個模型過於貼近訓練示例,而導致不能很好地擬合驗證集和測試集。過度擬合的一個典型症狀就是,訓練好的一個模型在訓練集上可以達到100% 或 99% 擬合,而在測試集上卻只能達到50%
丟棄層
現在來看看丟棄層。丟棄層對於神經網絡而言有特殊作用 。在上一個部分,我們討論了過度擬合的問題,即訓練之後神經網絡的權重參數過於貼近訓練示例,以至於在新示例上的表現欠佳。丟棄層的想法本質上是很簡單的。在這一層隨機把幾個激發點設置為零,從而「丟棄」他們,如此而已。這樣一個看起來不必要而反常的簡單過程有什麼好處呢?一方面,這個過程促使神經網絡變得「冗餘」。這裡冗餘的意思是指,即使神經網絡失去了一些激發點,還是能夠提供正確的分類結論或者輸出特定的示例。另一方面也確保神經網絡沒有過度擬合訓練集,從而減輕過度擬合的問題。這裡重點強調一下,丟棄層只是在訓練過程中出現,而並不在測試過程中出現。
更多信息請參見Geoffrey Hinton 所著相關文獻。(https://www.cs.toronto.edu/~hinton/absps/JMLRdropout.pdf)
網中網層
網中網層是指一個採用1x1過濾器的卷積層。乍一看你可能會有疑問,感受域的範圍通常要大過輸出值的特徵圖,那麼網中網究竟有什麼作用呢?回想一下,這些1x1的卷積是有一定深度的,我們可以把它設想為1x1xN的卷積,其中N是在這層上過濾器的個數。實際上,網中網層是做了一個N維元素的對應相乘,其中N是層中輸入的深度。
Min Lin 所著相關文獻對網中網層進行了更詳細地闡述。(https://arxiv.org/pdf/1312.4400v3.pdf)
分類、定位、檢測、細分
在CNN入門手冊(上)(加入連結)中,我們討論過給圖片物體分類這一任務。在這個過程中,我們先輸入一張圖片,然後從一串類別中輸出圖片物體對應類別的序號。但是,對於物體定位這樣的任務而言,我們的目的不僅是得到分類序號,還要在圖片中用邊框指出物體的位置
除此之外,我們還可能碰到物體檢測的任務,這需要對圖片上的所有物體進行物體定位。因此,我們會得到多個邊框以及多個分類標籤。
最後,我們還有細分物體的任務,其目的是輸出分類標籤和圖片中所有物體的細節輪廓。
在CNN入門手冊(下)中,我們會講更多完整這些任務的細節,如果你已經急不可耐了,可以參閱下面的參考資料。
檢測/定位: https://arxiv.org/pdf/1311.2524v5.pdf細分: http://www.cv-foundation.org/openaccess/content_cvpr_2015/papers/Long_Fully_Convolutional_Networks_2015_CVPR_paper.pdf
是的,還有更多的參考材料沒有被列舉出來。
遷移學習
目前,深度學習圈子裡有一個常見的誤區,即如果沒有谷歌式的海量數據,你就不可能做出一個有效的深度學習模型。雖然數據是創建神經網絡的重要部分,但是遷移學習的思路可以減少數據的需求量。遷移學習的做法是採用一個預訓練好的模型(別人用大量數據訓練得到的神經網絡的權重和參數),再用自己的數據微調模型。這個思路利用了預訓練的模型進行特徵提取。你需要把原來神經網絡的最後一層去掉,換成你自己的分類標籤(取決於你的問題空間),接著保持其他層的權重不變,正常地訓練神經網絡模型(保持其他層不變意思是在梯度下降/最優化的過程中不改變其他層的權重)
我們來討論一下為什麼這個方法可行。比如說我們用ImageNet( ImageNet是一個包括了超過1000類1400萬張圖片的數據集)訓練得到預訓練的模型。考慮一下神經網絡模型的低層,我們知道低層部分會檢測到諸如邊緣和曲線這樣的特徵。現在,除非你的問題空間和數據集很獨特,你的神經網絡模型也會需要檢測曲線和邊緣特徵。與其從隨機權重初始值開始訓練整個神經網絡,我們可以採用預訓練模型的權重(並保持這部分權重不變),然後重點對重要層(更高的層)進行訓練。如果你的訓練集數據與ImageNet差異很大,你可以只固定低層部分中的幾層,用自己的數據訓練更多層。
Yoshua Bengio 所著的參考文獻(另一個深度學習的大師):https://arxiv.org/pdf/1411.1792v1.pdf
Ali Sharif Razavian 所著的參考文獻:https://arxiv.org/pdf/1403.6382.pdf
Jeff Donahue 所著的參考文獻:https://arxiv.org/pdf/1310.1531.pdf
數據增強技術
到目前為止,我們對卷積神經網絡中數據的重要性大概還是模糊不清的。事實上,海量的數據對卷積神經網絡的訓練是十分重要的。(當然了,遷移學習可以在一定程度上弱化我們對數據量的要求。)那麼最後,就讓我們來討論如何通過幾個簡單的變換增加已有的數據量吧。正如我們之前提到過的,當一個計算機處理一個圖片輸入時,它會讀入一個像素值數組。如果整個圖片都向左移動了一個單位,對於你我來說,這個變化是感覺不到的。然後,對於一個計算機而言,在分類和圖片標籤不變而像素數組改變的情況下,這個移動可能會造成很大的影響。在改變訓練數據表示的同時固定分類標籤的這種方法,被稱為數據增強技術,這是一種人為擴展數據集的方法。一些常用的數據增強方法有調成灰度(grayscales),水平翻轉(horizontal flips),豎直翻轉(vertical flips,),隨機裁剪(random crops), 顏色抖動(color jitters),平移(translations), 旋轉(rotation)等等。如果對訓練集的數據進行以上這幾種變換,你可以很容易地得到原數據兩至三倍的數據量來訓練模型。
到這裡,我們對卷積神經網絡的
基礎介紹就結束了。
下周我們將帶來該系列的最後一篇,
介紹卷積神經網絡
研究領域最重要的9篇論文,
請大家敬請期待!
下周一見!
原文連結:
https://adeshpande3.github.io/adeshpande3.github.io/A-Beginner's-Guide-To-Understanding-Convolutional-Neural-Networks-Part-2/