全解卷積神經網路,並分享9篇必讀論文

資料派THU發表於2018-01-25

640?wx_fmt=png

轉自公眾號:大資料探勘DT資料分析

本文共18000字,建議閱讀18分鐘
本文為你介紹CNN整體系統架構及演算法,併為你分享9篇必讀論文。


Introduction

        

卷積神經網路CNN,雖然它聽起來就像是生物學、數學和計算機的奇怪混雜產物,但在近些年的機器視覺領域,它是最具影響力的創新結果。隨著Alex Krizhevsky開始使用神經網路,將分類錯誤率由26%降到15%並贏得2012年度ImageNet競賽(相當於機器視覺界的奧林匹克)時,它就開始聲名大噪了。從那時起,一票公司開始在它們的核心服務中使用深度學習技術。例如Facebook用它進行自動的影像標籤,google用它做照片檢索,amazon用它做產品推薦,Pinterest用它做個性化家庭定製推送,Instagram用它搭建他們的搜尋架構。

        

基於CNN最經典也是最流行的應用應當是影像處理領域。那麼,就讓我們看看怎樣使用CNN技術來設計影像分類演算法。


640?wx_fmt=jpeg


The Problem Space

        

影像分類主要指將輸入影像進行硬分類或模糊分類(例如貓圖、狗圖等)。對於人類來說,這是出生後就應當學會的第一個技能,並在成人後能夠做到非常輕鬆自然地做到這一點。我們能夠不假思索地連續快速地分辨所處的環境,周邊事物等。無論我們看到圖片還是真實景象,都能夠馬上對其進行判斷並打上標籤,有時候這種行為就是下意識的。這種識別技術主要基於人們的先驗知識與環境,而這些是我們的機器所無法擁有知識的。


640?wx_fmt=png


Inputs and Outputs

        

當我們的電腦看到一副圖片時,機器只是看到一個由畫素值組成的矩陣,例如說32*32*3,其中32表示其解析度或影像大小,3表示RGB三原色。為了把問題闡述清楚,我們這裡定義一個JPG格式的彩色影像,大小為480*480,那麼表示的矩陣就是480*480*3。矩陣裡每一點取值範圍0-255,表示為該點的畫素強度(灰度值)。在我們人類進行影像識別的時候,這些畫素點一點兒意義也沒有,它們只是作為機器進行影像識別的輸入而已。機器的輸出呢,可以是一組概率值,這組概率值表明了當前的影像是某一類影像的可能性有多大。(比如0.8可能性是貓,0.15可能性是狗,0.05可能性是鳥等)


What We Want the Computer to Do

        

我們知道了問題的輸入和輸出,現在要考慮該怎麼解決它。我們想要計算機做的是分辨出所有給出的圖中所具有的獨特特徵,例如說狗圖或貓圖的獨特特徵,這些特徵是在某一分類圖中一致,而跟其它型別圖不同。這件事在我們自己的腦中同樣也是自動完成的。例如,當我們看一副狗圖時,我們能夠根據圖中物體的爪子或4條腿分辨其是小狗。類似地,計算機也可以通過尋找一些低等級特徵,例如邊緣或紋理等,並由此通過一系列卷積層來建立更抽象的概念,來實現分類識別。大體上這就是CNN所做的事。接下來讓我們更具體地展開說。


Biological Connection

        

先讓我們從一些背景知識開始吧。當你第一次聽到卷積神經網路(CNN)這個短語時,也許你會想起生物神經科學領域的一些東西;可以說,某種程度上你是對的。CNN是從神經生物學中視覺皮層這個概念上獲取了靈感。在大腦的視覺皮層中,有著許多由細胞組成的,對特定的視覺領域敏感的微小區域。這個理論由Hubel以及Wiesel在1962年通過實驗獲得了證實。(Video) 在實驗中,大腦內一些獨立的神經元細胞僅對給實驗者展示的某些特徵放電或有反應,例如特定方向的邊緣。例如,在展示垂直邊緣、水平邊緣或對角線邊時,一些神經元開始放電。Hubel和Wiesel發現,這些神經元聚集並被組合成為縱列或柱形的結構,從而產生視覺。在一個系統整體中,不同的部分負責不同的任務(例如視覺皮層的神經元細胞負責感知視覺),這樣的構造,正是CNN的基礎。


Structure

        

回到細節裡來。針對CNN的具體行為,一個更加細化的視角是,使用者將影像經過一系列卷積、非線性、池化(下采樣)、以及全連通層後,獲得了輸出結果。就像之前說的,這種輸出結果也許是一個用於描述該影像的分類結果或是一個分類的可能性。現在的難點在於,如何理解每一層都做了些什麼。那麼,讓我們進入這個最重要的部分。


First Layer – Math Part

        

CNN的第一層通常都是卷積層。你必須記住的第一件事應當是卷積層(conv layer)的輸入是什麼。就像之前說的,輸入是一個32*32*3的畫素數列。要解釋這個卷積層,最好的辦法就是想象一下下面場景:你舉著手電筒將光束打在一幅影像的左上角。我們假定這個光束覆蓋的範圍是5*5。那麼現在,想象光束逐漸滑動平移,經過整幅影像。


在機器學習的語言裡,這個手電筒就被稱作濾波器filter(或神經元neuron,或核心kernel),而它照過的區域叫做感知區(receptive field)。這個濾波器也可以表示為一個陣列(陣列中的數字可稱為加權weight或引數parameter)。一個重要的點在於,濾波器的深度必須跟輸入影像深度一致(才能保證計算不出錯)。那麼,這個濾波器的維度就變成了:5*5*3。現在,以這個濾波器最初的位置為例,它應當處於影像的左上角。隨著濾波器的平移(或稱卷積convolving),經過整幅影像。它將自身陣列中的值與影像對應位置的畫素值進行相乘(即點乘),將點乘結果加起來(數學上一共有75次乘加),就有了一個數。


記住,這個數只代表濾波器在影像左上角初始位置時的卷積值。現在,我們一邊移動濾波器一邊重複這個計算(順序是從左到右,然後從上到下。下一步是往右移一個畫素)。這樣,影像上每個單獨的畫素位置都會產生一個濾波(卷積)後的數值。在遍歷整個影像後,你會得到一個28*28*1的數列,我們稱之為啟用圖activation map或特徵圖feature map。28的原因是32-5+1=28。這樣一共就有784個值。


640?wx_fmt=png

(注:上圖使用的圖片,是從這本特別棒的書中引用的 "Neural Networks and Deep Learning" by Michael Nielsen. 強烈推薦它)

        

如果現在我們有兩個5*5*3的濾波器,而不是一個,那麼輸出結果就會變成28*28*2,隨著使用越來越多的濾波器,我們能夠獲取到越來越多的空間維度資訊。從數學的角度,這就是卷積層所做的事。


First Layer – High Level Perspective

        

讓我們討論一下,從更高的層面上,該如何看待這個卷積層所做的事。事實上,這些濾波器可以看做是特徵識別器。這裡的特徵,指的是那些直線邊緣、顏色、紋理等。考慮所有影像中都共通的一些最簡單的特徵。讓我們把第一個濾波器改成大小為7*7*3的紋理識別器。(在這個章節,為了降低複雜度,我們忽略濾波器與影像的深度,僅考慮其頂層的灰度數列及其計算)。作為一個紋理識別器,它的畫素結構將會在紋理形狀的對應區域內具有較高的數值。(記住,所有的濾波器都只是數值和數值的組合)


640?wx_fmt=png

        

現在,讓我們回到數學上。當我們把濾波器放到影像左上角時,它開始進行7*7範圍的內積計算。這裡我們用給出的特徵提取濾波器舉一個例子,見下圖。   

 

640?wx_fmt=jpeg


記住,我們做的事是矩陣對應的畫素值相乘再相加。


640?wx_fmt=jpeg
        

基本上,在輸入影像中,如果當前形狀跟我們的濾波器大體相像,卷積後的計算結果將會是一個很大的值!那麼讓我們看看如果移動濾波器到其它位置會發生什麼。


640?wx_fmt=png

        

計算結果很小!這是因為濾波器和當前形狀完全不同。記住,這個卷積層的輸出是一個啟用圖層(activation map)。那麼,針對這個單邊緣濾波器卷積的簡單例子來說,它的啟用圖層(activation map)將會展示出當前影像中最有可能是邊緣特徵的區域。


在上圖中,左上區域的卷積結果為6600,這個大數值表明圖中對應位置有這樣的邊緣特徵使得濾波器被啟用了。而右上區域的值為0,表示當前區域沒有任何能夠啟用濾波器的特徵。(或更簡單地說,圖中該區域沒有對應的影像特徵)。記住,這只是一個濾波器。這只是一個檢測豎直向右偏線狀特徵的濾波器。我們可以再新增其它濾波器用於檢測豎直左偏或垂直特徵等。濾波器越多,啟用圖層activation map的深度就越深,對於輸入影像我們就能夠獲取到越多的資訊。


宣告:文中所述的濾波器是為了卷積計算上的簡化而定義的。下圖給出了一些用於第一卷積層的實際濾波器示例,但主要引數(原理)還是類似的。第一層的濾波器通過對輸入影像的卷積和“啟用”(或計算極值點),來尋找輸入影像中特定的特徵。


640?wx_fmt=png

(注:上圖來自於史丹佛Andrej Karpathy以及Justin Johnson的 CS 231N course 。推薦給需要深入理解CNN的朋友們)


Going Deeper Through the Network

        

在傳統的CNN結構中,在這些卷積層之間還夾雜有其它型別的層。我強烈建議大家去鑽研並理解它們的功能和效果,這裡僅給出一個大致的介紹。這些層提供了非線性特性nonlinearities與維度保留特性preservation of dimension用於提高整個網路結構的魯棒性以及控制過擬合(control overfitting)。一個經典的CNN結構像下圖所示:


640?wx_fmt=png

        

然而,最後一層是非常重要的一層,我們稍後會介紹。現在讓我們回過頭來看看到目前已經學了哪些東西。我們討論了第一卷積層的濾波器的設計與檢測方法。它們用來檢測邊緣、紋理這類低階特徵。正如大家想象的,要想預測影像中的事物,我們需要一個網路結構用於識別像手掌、爪子、耳朵這樣的高階特徵。然後讓我們想一下第一卷積層的輸出應當是什麼:一個28*28*3的數列結構(假設我們用的是三個5*5*3的濾波器)。


當我們進入第二個卷積層的時候,第一卷積層的輸出就變成了第二卷積層的輸入。這就比較抽象,比較難以想象了。要知道,當我們討論第一層時,輸入就是未經處理的原始影像;但是,當我們討論第二卷積層時,輸入已經變成了第一層的卷積結果,也就是一個啟用圖層activation map。這個輸入的每一層基本上描述了某些低階特徵在原始影像中出現的位置。現在,當你把它輸入給第二層,也就是再使用一系列濾波器對其卷積時,輸出就應當是表示更高階特徵的啟用圖層,例如說半圓(結合了一個曲線和直線邊緣)、方形(結合了一些直線邊緣)等。


當你將資料繼續經過更多的卷積層時,你就會得到更加高階特徵的啟用圖層。在整個網路的最後,你也許會用一些濾波器用以啟用影像中的手寫特徵handwriting、粉紅色 物體pink object等。如果你想知道更多關於濾波器視覺化的資訊,Matt Zeiler與Rob Fergus在他們的ConvNets模型與其研究論文research paper中有精彩的闡述。同樣,在YouTube上,Jason Yosinski提供了一個非常棒的講解視訊video。另外一件有趣的事是,當你的網路結構越深,濾波器的感知區域範圍就越大,這意味著它們在處理時,能夠將對應原始影像中更大區域的資訊都攬括在內(能夠對更大的畫素空間進行反應和感知)。


Fully Connected Layer

        

檢測出高階特徵後,我們可以錦上添花地在網路結構的最後新增一個全連通層fully connected layer。全連通層輸入一個數列(無論這個輸入是來自卷積層conv、線性整流ReLU層還是池化層pool),輸出一個N維向量,N是由程式指定的分類類別數量。例如,對於一個數字分類程式,N就應該取10(0~9共10個數字)。這個N維向量中的每一個數字表示被分到該類的機率。例如,還是針對數字分類程式的分類結果為[0 .1 .1 .75 0 0 0 0 0 .05],這就表示這個輸入的影像為1的概率有10%,為2的概率10%,為3的概率75%,為9的概率5%。(注:輸出的表示方法不止這一種,這裡只是展示了這種小數概率表示的softmax演算法)


全連通層的工作原理是,根據之前其它層的輸出(表示為高階特徵的啟用圖層),檢測哪些特徵與特定的類別相匹配。例如,程式若判定影像是一隻狗,那麼啟用圖層中表示狗的高階特徵,像是爪子、四條腿等特徵將會具有很高的數值。再比如,程式若判定影像是一隻鳥,那麼啟用圖層中表示鳥的高階特徵,像是翅膀、鳥喙等就會具有很高的數值。基本上,全連通層的工作就是尋找與特定類別匹配的高階特徵,並設定相應的權重值。這樣當我們把之前層的結果通過權重進行計算後,就能夠正確估計其屬於某一類別的可能性了。


640?wx_fmt=png


Training (AKA:What Makes this Stuff Work)


現在這個部分是我特意在之前的討論中未提及的,很可能是關於神經網路的最重要的部分。也許你在之前的閱讀時會有很多問題。比如,第一卷積層的濾波器怎麼知道該如何查詢邊緣和紋理?而全連通層又是怎樣知道該如何查詢啟用圖層的?每一層的濾波器都是怎樣設定其值的?計算機在解決這些問題時主要依靠一個訓練過程training process,稱作反向傳播演算法backpropagation(BP演算法)。


在討論反向傳播之前,我們必須先回過頭來講講讓神經網路(生物學意義上的)工作起來需要什麼。當我們出生時,我們的大腦是一片空白的。我們並不知道什麼是貓、狗、鳥兒。類似地,在CNN執行之前,濾波器的數值和權重等引數都是隨機的。濾波器並不知道該如何尋找邊緣和紋理。高階層的濾波器同樣也不知道該如何尋找爪子、鳥喙這類高階特徵。


當我們逐漸長大,父母以及老師會利用照片、影像與之對應的標籤來教會我們這些動物的辨別方法。這種利用標籤的圖片同樣也是CNN所使用的訓練過程。在深入研究之前,我們先簡單地打個比方:我們有一個訓練集,其中有幾千張圖片,繪製著貓、狗、鳥兒,同時每張圖片上都有一個標明這是哪種動物的標籤label。好的,現在回到我們的反向傳播演算法。


反向傳播演算法可以分為4個部分:前向傳播forward pass,損失函式loss function,反向傳播backward pass,權重更新weight update。在前向傳播的過程中,你將一個訓練資料(32*32*3的影像數列,表示一個數字)輸入整個網路。由於所有權重或濾波器係數都是隨機生成的,輸出很可能是類似這樣的結果[.1 .1 .1 .1 .1 .1 .1 .1 .1 .1],基本上這樣的輸出難以判別是一個有效分類的。系統以目前的引數/權值是很難尋找低階特徵,並且也很難以此進行可靠的分類的。於是進入演算法的損失函式階段。


記得我們剛才使用的輸入是訓練資料,那麼除了影像數列外還附帶標籤。比方說這個輸入的訓練資料是3,那麼標籤就應當是[0 0 0 1 0 0 0 0 0 0]。通過其輸出結果和標籤的比較,就能夠計算損失函式了。損失函式的定義方法很多,這裡就用一個常見的均方差演算法MSE(mean squared error),如下式


640?wx_fmt=jpeg


這裡我們使用變數L儲存這個損失函式的結果。可以想象,在訓練剛開始時這個值會相當的大。現在讓我們用直覺去想想,我們想要找到一個“點”使得預測的標籤(也就是網路的輸出)和訓練標籤相同(這意味著我們的網路預測的結果是正確的)。那麼我們需要做的就是最小化損失函式L。將其具象化,其實就是一個演算calculus優化的問題,我們想要找到哪些輸入(在我們的系統中就是權值)更直接地影響到損失L,或者說誤差。


640?wx_fmt=png


上圖表示,針對這個問題具象化的一個方法是將其放在由一個誤差(損失相關)座標軸、兩個權值座標軸組成的3D圖中。(當然大部分神經網路的權值顯然大於2,這只是為了簡化)。想要最小化誤差值就需要不斷調節權值w1和w2。用圖上的話說,我們要找到這個碗狀曲面的z軸最低點。要做到這一點,就需要求出誤差在各個方向(權值)上的導數(斜率)。


在數學上,這等價於針對某一層的權重W,計算導數dL/dW。那麼現在,我們想要做的就是對網路進行一次反向傳播backward pass,以判斷哪些權重對損失L有較大的影響,並且調整這些權重以減小損失。一旦導數計算出來之後,我們就可以進行最後一個步驟:更新權重。我們將所有濾波器的權重進行更新使得它們隨著其梯度方向的變化而改變(change in the direction of the gradient梯度下降法?)


640?wx_fmt=jpeg


學習速率learning rate是由程式設計師所指定的引數。高學習速率表明在進行權重更新的跨度大,這樣模型就能更快地彙集到最優的權重集上面來。但是,過高的學習速率有可能導致跨度過大而難以精確地收斂到最優解上。


640?wx_fmt=jpeg


這整套流程:前向傳遞forward pass、損失函式loss function、後向傳遞backward pass、引數更新parameter update合起來稱為一代epoch。針對每個訓練影像,程式會重複進行多代epoch的訓練。每次迭代結束後,我們都希望能夠讓網路通過良好地訓練,正確地調節其每層的權重。


Testing


最後,要想驗證我們的CNN是否運作正確,我們需要準備另外一套資料和標籤(不能與訓練集重複!),將其送入CNN進行測試。我們會比較輸出結果與金標準ground truth是否一致,以驗證網路是否正確。


How Companies Use CNNs


資料,資料,資料。這神奇的單詞,那些有著大量資料的公司才能在激烈的市場競爭中獲得潛在的先機。在網路訓練的過程中,你的訓練資料量越大,能夠進行的訓練迭代就越多,能夠進行的權重調整也越多,調優的結果就越好。Facebook與Instagram公司擁有旗下數億規模使用者的照片;Pinterest公司的網站上也有500億張拼趣圖片pin供其使用;Google坐擁海量的使用者搜尋資料;而Amazon則每天都在接收著幾百萬項使用者產品購買的資訊。現在你能明白隱藏在這些資料之下的魔力了吧。


Stride and Padding


好的,讓我們回憶一下我們的老朋友卷積層。還記得那些濾波器、感知區、卷積嗎?現在讓我們介紹兩個卷積層中的重要引數。步長stride和填充padding。


步長stride主要用於控制濾波器在輸入影像上的卷積行為。如下圖例子所示,濾波器在影像上的卷積是每次卷積計算後平移一定距離再次計算。這個距離就是通過步長stride來進行控制的。在這個例子中,步長stride設為1。通常來說,步長stride引數的選擇需要考慮到這個步數能夠被整除。讓我們看一下圖中的這個例子:設輸入為7*7的影像,濾波器尺寸為3*3(同樣忽略了第三維),設定步長為1,那麼輸出就應該是下圖右邊的5*5影像。


640?wx_fmt=png


還是老樣子,不是嗎?想想如果我們把步長stride設為2的情形。


640?wx_fmt=jpeg


那麼,感知區每次就會平移兩個單位(畫素),那麼輸出自然就相應的縮小為3*3了。如果我們想要把步長stride設為3,那麼在進行卷積時就會有空間上的問題了,同時也難以保證感知區在平移時是否還處於影像內(譯者:原因是步數不能整除?)。通常,在設計卷積層時,步長stride越大,那麼感知區的重疊就越小,同樣地輸出的影像也越小。


現在,讓我們看一下填充padding引數。先想象一下這樣的場景。當你使用3個5*5*3的濾波器對一個32*32*3的輸入影像濾波,那麼輸出影像應當是28*28*3。注意空間尺寸變小了。然後我們把這個影像再次放入卷積層,會發現尺寸更小了。


事實上,在整個網路的開始幾層,我們並不希望尺寸縮水得這麼快。我們希望能夠儘量保留下這些輸入影像的資訊,才能夠比較好地提取底層特徵。也就是說,我們想要保證輸出仍然是32*32*3。為了實現這個目的,我們在卷積層上引入了尺寸為2的零填充zero padding。它能夠在輸入影像的邊界上形成一層寬度為2,值為0的邊界。那麼輸入影像就變成了36*36*3。如下圖所示。


640?wx_fmt=png


若設定步長stride為1,同時零填充zero padding的尺寸為:


640?wx_fmt=png


式中K為濾波器尺寸。那麼輸入和輸出影像的尺寸就會永遠保持一致。


卷積層的輸出影像的尺寸可以通過下面公式得出:


640?wx_fmt=png


式中O是輸出寬/高,W是輸入寬/高,K為濾波器尺寸,P為填充padding尺寸,S為步長stride。


Choosing Hyperparameters


我們該怎樣確定在一個系統中,卷積層的數量、濾波器的尺寸、或是步長stride、填充padding這些引數呢?這些可不是細枝末節的問題,另外這些問題也沒有一個放之四海而皆準的答案。這是因為系統引數的設定主要取決於你的資料型別。資料的大小、影像的複雜度、影像處理的目的和方式等,都會隨著處理目的的不同而發生變化。選擇超引數的正確做法是,在檢視資料集時通過抽象概念將資料/影像以合適的尺度正確組合起來。


ReLU (Rectified Linear Units) Layers


按照慣例,每個卷積層之後都緊跟一個非線性層(或啟用層activation layer)。由於系統在卷積層的計算主要為線性操作(畫素/元素級的乘法和加法計算),因此這層的主要目的在於為系統引入非線性性。在過去,研究人員主要利用雙曲正切tanh或S函式sigmoid作為非線性函式進行處理,後來大家發現線性整流層ReLU效果更佳,由於其計算效率能夠大大加快整個系統訓練的速度。同時它能減輕梯度消失問題vanishing gradient problem,這個問題主要出現在訓練時,由於梯度呈指數下降而導致的底層訓練十分緩慢的問題。線性整流層ReLU將輸入影像的所有元素通過這樣的一個整流函式:f(x) = max(0, x) 。從術語的角度上,本層將所有負啟用negative activations都改為0,由此提高了模型與整個系統的非線性特性,而不會影響到卷積層的感知區。


相關資訊可參考Geoffrey Hinton大神(也就是深度學習之父)的論文http://www.cs.toronto.edu /~fritz/absps/reluICML.pdf


Pooling Layers


通過線性整流層ReLU處理後,研究人員可能會在其後新增一個池化pooling層,也叫下采樣downsampling層。這同樣有許多可選的方法,其中最常用的是最大池化maxpooling方法。這種方法定義一個最大值濾波器(通常2*2)以及對應長度的步長stride,然後對輸入影像進行濾波輸出濾波器經過的每個子區域的最大值。如下圖:


640?wx_fmt=png


池化層也可以用均值或L2範數(L2-norm,歐氏距離)來計算。池化層的直觀意義在於,從輸入影像中獲取到某個特徵(會有較高的啟用值activation value),它與其它特徵的相對位置比其自身的絕對位置更加重要。從圖中不難看出,池化層大大降低了輸入影像的空間維度(寬和高,不包括深度)。這就達到了兩個目的:


  • 首先,引數/權重的個數降低為原來的1/4,計算量相應減少了。

  • 第二,它能夠防止過擬合overfitting。


過擬合表示為由於過度的調優導致模型過於執著滿足樣本的特徵(可能有些是區域性特徵)而失去了泛用性,從而難以識別其它資料。過擬合overfitting的一個徵兆就是,模型在訓練集上能獲得99%或100%的精確度但在測試資料上僅有50%。


Dropout Layers


在神經網路中,丟包層dropout layer有一個非常特殊的函式。在上一節,我們介紹了過擬合overfitting問題,當訓練完成後,由於對訓練集過度調優導致的系統對新資料的識別效果不好。實際上丟包層在前向傳播的過程中,故意地把一些隨機的啟用特徵activations設為0值,這樣就把它們簡單地“丟包”了。那麼,這樣一個看似不必要、違反常理的簡單操作有什麼好處呢?事實上,它強行地保證了整個系統的冗餘性。也就是說,系統需要滿足這樣的情形:當輸入資料的一部分啟用特徵activations缺失時,系統也能夠將其正確識別。丟包層dropout能夠保證系統不會跟訓練集過於相似,從而從一定程度上解決過擬合overfitting問題。需要注意的是,丟包層dropout僅用於訓練環節。

        

Network in Network Layers


網路中的網路層Network in Network(NIN)指的是一個擁有1*1大小濾波器的卷積層。初看你會奇怪網路層有什麼用,它投影出來的感知區區域比待投影物件還大。但是,請記住濾波器還有一個維度:深度N。因此這是一個1*1*N的卷積操作。實際上,它進行了一次N-D逐畫素乘法,其中N是輸入資料的深度。(大概是用子網路結構代替原先的線性卷積)


Classification, Localization, Detection, Segmentation


在我們之前的影像分類任務那個例子中,系統將輸入的影像處理後輸出其分類標籤(或類別可能性陣列)。但是,如果任務變成目標識別,那麼除了需要進行分類外,還需要用一個框劃出目標的具體位置。如圖:


640?wx_fmt=png


另外在一些目標檢測的任務中,圖中所有目標的位置都需要確定。因此,就需要輸出多個定位框和類別標籤。


更進一步地,在目標分割任務中,除開分類標籤和定位之外,還需要系統能夠將目標的邊緣輪廓識別並描繪出來,如下圖:


640?wx_fmt=png

       

Transfer Learning

        

許多人認為只有擁有了google級別的資料量才能訓練好一個模型,這是一個常見的對深度學習的誤解。誠然,資料量對於整個系統的搭建是至關重要的,然而我們還有遷移學習transfer learning的方法來緩解資料量的需求。遷移學習transfer learning是把已訓練的模型(指其他研究人員利用其它大型資料集訓練的模型及其引數/權重),利用自己的資料集進行引數調整的過程。方法思路在於,將已訓練模型當作一個特徵提取器feature extractor。


我們需要把模型的最後一層(全連通層?)移除,替換為自己的分類器(取決於我們自己需要解決的問題空間)。然後,凍結其它層的權重/引數,並開展資料訓練。凍結是為了防止在梯度下降/優化時引數的改變。


讓我們看看它是怎麼工作的。假設我們提到的已訓練模型是通過ImageNet進行訓練的(ImageNet是一個擁有1400萬資料量以及1000多個分類標籤的資料庫)。如同之前描述的,模型的底層通常是一些基本特徵的提取,例如邊緣和紋理等,這些特徵資訊在大部分影像處理問題都是必要的(除非你的問題空間和資料集非常獨特)。


當進行遷移學習transfer learning時,我們就可以使用這些具有共性的權重並保持它們的值,而不是設定一個隨機的初始值,這樣我們的訓練就可以專注於更重要的層(通常是更高層)。當然,如果你的資料集跟已訓練集有很大不同,那麼你就需要凍結更少層的引數,而進行更多的訓練。


Data Augmentation Techniques


我們現在已經對卷積網路中資料的重要性非常清楚了,那麼就談談該怎樣通過一些簡單的轉換,進一步擴大我們的現有資料集。就像我們之前所說,當電腦輸入一組資料(影像)時,輸入的形式通常為灰度值陣列。假設我們把整幅影像平移1個畫素,從我們的角度來說,這種變化是幾乎難以察覺的。但是,對電腦來說,若要保證不影響結果,這種變化就相當明顯了。


這種在保持結果不變的前提下修改訓練資料表現形式的方法稱為資料擴容方法data augmentation techniques。這是人工擴充套件資料集的方法。一些常用的擴容方法包括灰度擴充套件grayscales,水平翻轉horizontal flips,垂直翻轉vertical flips,隨機裁剪random crops,顏色抖動color jitters,翻譯(轉化?)translations,旋轉rotations等等。應用這些變換方法,我們可以很輕易地成倍擴充套件我們的資料集。


我們將介紹幾篇重要的公開發表的論文,討論它們為何重要。前一半的論文(AlexNet到ResNet)將主要涉及整體系統架構的發展和演變,後一半論文將主要集中在一些有趣的子領域應用上。


AlexNet  (2012)


https://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf


這篇文章算是深度學習的起源(儘管有些學者認為Yann LeCun在1998年的論文 paper 才是真正的起源)。文章標題是“ImageNet Classification with Deep Convolutional Networks”,已經獲得了共6184次引用,並被廣泛認為是業內最具深遠影響的一篇。Alex Krizhevsky, Ilya Sutskever, 以及Geoffrey Hinton三人創造了一個“大規模、有深度的卷積神經網路”,並用它贏得了2012年度ILSVRC挑戰(ImageNet Large-Scale Visual Recognition Challenge)。


ILSVRC作為機器視覺領域的奧林匹克,每年都吸引來自全世界的研究小組,他們拿出渾身解數相互競爭,用自己組開發的機器視覺模型/演算法解決影像分類、定位、檢測等問題。2012年,當CNN第一次登上這個舞臺,在前五測試錯誤率top 5 test error rate專案上達到15.4%的好成績。(前五錯誤Top 5 error指的是當輸入一幅影像時,模型的預測結果可能性前五中都沒有正確答案)。排在它後面的成績是26.2%,說明CNN相對其它方法具有令人震驚的優勢,這在機器視覺領域引起了巨大的震動。可以說,從那時起CNN就變成了業內家喻戶曉的名字。


這篇文章主要討論了一種網路架構的實現(我們稱為AlexNet)。相比現在的架構,文中所討論的佈局結構相對簡單,主要包括5個卷積層、最大池化層、丟包dropout層,以及3個全連通層。該結構用於針對擁有1000個可能的影像類別進行分類。


640?wx_fmt=png

圖中文字:AlexNet架構採用兩個不同的資料“流”使得它看起來比較奇怪。這是因為訓練過程的計算量極大因此需要將步驟分割以應用兩塊GPU平行計算。


文中要點


  • 利用ImageNet資料庫進行網路訓練,庫中包含22000種類的1500萬標籤資料。

  • 利用線性整流層ReLU的非線性函式。(利用線性整流層ReLU後,執行速度比傳統雙曲正切函式快了幾倍)

  • 利用了資料擴容方法data augmentation,包括影像變換、水平反射、塊提取patch extractions等方法;

  • 為解決訓練集過擬合問題而引入了丟包層dropout layer。

  • 使用批量隨機梯度下降法batch stochastic gradient descent進行訓練,為動量momentum和權重衰退weight decay設定限定值。

  • 使用兩塊GTX 580 GPU訓練了5~6天。


本文重要性


本文的方法是機器視覺領域的深度學習和CNN應用的開山怪。它的建模方法在ImageNet資料訓練這一歷史性的難題上有著很好的表現。它提出的許多技術目前還在使用,例如資料擴容方法以及丟包dropout層。這篇文章真真切切地用它在競賽中的突破性表現給業內展示了CNN的巨大優勢。


ZF Net (2013)


http://arxiv.org/pdf/1311.2901v3.pdf


AlexNet在2012年大出風頭之後,2013年隨即出現了大量的CNN模型。當年的的ILSVRC比賽勝者是來自紐約大學NYU的Matthew Zeiler以及Rob Fergus設計的模型,叫做ZF Net。它達到了11.2%的錯誤率。ZF Net的架構不僅對之前的AlexNet進行了進一步的優化,而且引入了一些新的關鍵技術用於效能改進。另外一點,文章作者用了很長的篇幅講解了隱藏在卷積網路ConvNet之下的直觀含義以及該如何正確地將濾波器及其權重係數視覺化。


本文標題是“Visualizing and Understanding Convolutional Neural Networks”。在文章開頭,Zeiler和Fergus提出CNN的復興主要依靠的是大規模訓練集以及GPU帶來的計算能力飛躍。他們指出,目前短板在於研究人員對模型的內部執行機理知之甚少,若是不能解決這個問題,針對模型的改進就只能依靠試錯。“development of better models is reduced to trial and error”. 雖然相較3年前,我們現在對模型有了進一步的瞭解;然而這依然是一個重要問題。本文的主要貢獻是一個改進型AlexNet的細節及其視覺化特徵圖層feature map的表現方式。


640?wx_fmt=png


文章要點


  • 除了一些微小改進外,模型架構與AlexNet非常相似

  • AlexNet訓練集規模為1500萬張影像,ZF Net僅為130萬張

  • 相比AlexNet在第一層使用的11*11濾波器,ZF Net使用7*7的濾波器及較小步長。如此改進的深層次原因在於,在第一卷積層中使用較小尺寸的濾波器有助於保留輸入資料的原始畫素資訊。事實證明,在第一卷積層中使用11*11濾波器會忽略大量相關資訊。

  • 隨著網路層數深入,使用的濾波器數量同樣增加。

  • 啟用方法activation function使用了線性整流層ReLUs,誤差函式error function(疑為作者筆誤,應該是損失函式loss function)使用了交叉熵損失函式cross-entropy loss,訓練方法使用了批量隨機梯度下降法batch stochastic gradient descent。

  • 用1塊GTX580 GPU訓練了12天

  • 發明一種卷積網路視覺化技術,名為解卷積網路Deconvolutional Network,有助於檢查不同啟用特徵以及它們與輸入空間的關係。命名為“解卷積網路”"deconvnet"是因為它把特徵投影為可見的畫素點,這跟卷積層把畫素投影為特徵的過程是剛好相反的。


DeConvNet


解卷積的基本工作原理是,針對訓練後的CNN網路中的每一層,都附加一個解卷積層deconvnet用於將感知區回溯path back到影像畫素。在CNN的工作流程總,我們把一幅影像輸入給CNN,一層一層地計算其啟用值activations,這是前向傳遞。現在,假設我們想要檢查第四卷積層中針對某個特徵的啟用值,我們把這層對應的特徵圖層中的這個啟用值儲存起來,並把本層中其它啟用值設為0,隨後將這個特徵圖層作為解卷積網路的輸入。這個解卷積網路與原先的CNN有相同的濾波器設定。輸入的特徵圖層通過一系列的反池化(最大池化求反),整流(反整流?),以及濾波(反濾波?),隨後到達輸入端。


隱藏在這整套流程之下的原因是,我們想要知道當給定某個特徵圖層時,什麼樣的影像結構能夠啟用它。下圖給出了第一和第二層的解卷積層的視覺化結果。


640?wx_fmt=png

圖中文字:第一層與第二層的視覺化表示。每層都表示為兩幅圖片:其一表示為濾波器;另一表示為輸入原始影像中的一部分結構,在給定的濾波器和卷積層之下,這些結構能夠激發最強的啟用訊號。圖中第二解卷積層的左圖,展示了16個不同的濾波器。

(跟第一層9個組合起來)


圖中卷積網路ConvNet的第一層通常是由一些用於檢測簡單邊緣、顏色等資訊的低階特徵檢測子組成。從圖中也可以看出,第二層則是更多的圓形特徵。讓我們看看下圖3,4,5層的情形。


640?wx_fmt=png


圖中這幾層展示出更進一步的高階特徵,例如狗的臉部特徵或是花朵的特徵等。也許你還記得,在第一卷積層後,我們應用了一個池化層pooling layer用於影像下采樣(例如,將32*32*3的影像轉換為16*16*3)。它帶來的效果是第二層的濾波器視野(檢測範圍scope)更寬了。想要獲取更多有關解卷積網路以及這篇論文的資訊,請參考Zeiler的發表視訊presenting。


https://www.youtube.com/watch?v=ghEmQSxT6tw


本文重要性


ZF Net不僅僅是2013年度競賽的冠軍,而且它為CNN提供了更加直觀的展示能力,同時提供了更多提升效能的技巧。這種網路視覺化的方法有助於研究人員理解CNN的內部工作原理及其網路架構。迷人的解卷積網路視覺化以及阻塞實驗讓這篇文章成了我的最愛。


VGG Net (2014)


http://arxiv.org/pdf/1409.1556v6.pdf


簡單但有深度。2014年度ILSVRC其中一個模型最好地利用了這兩個特點達到了7.3%的錯誤率(但並不是當年的冠軍)。牛津大學的Karen Simonyan以及Andrew Zisserman兩位創造了一個19層的CNN,網路中僅使用了3*3尺寸的濾波器,步長stride和填充padding都為1,池化層使用2*2的最大池化函式,步長為2。是不是很簡單?


640?wx_fmt=png


文章要點


  • 僅使用3*3濾波器,這與之前的AlexNet的首層11*11濾波器、ZF Net的7*7濾波器都大不相同。作者所闡述的理由是,兩個3*3的卷積層結合起來能夠生成一個有效的5*5感知區。因此使用小尺寸濾波器既能保持與大尺寸相同的功能又保證了小尺寸的優勢。優勢其中之一就是參量的減少,另一個優勢在於,針對兩個卷積網路我們可以使用多一個線性整流層ReLU。(ReLU越多,越能降低系統線性性?)

  • 3個3*3卷積層並排起來相當於一個有效的7*7感知區。

  • 輸入影像的空間尺寸隨著層數增加而減少(因為通過每層的卷積或是池化操作),其深度反而隨著濾波器越來越多而增加。

  • 一個有趣的現象是,每個最大池化層之後,濾波器數量都翻倍,這進一步說明了資料的空間尺寸減少但深度增加。

  • 模型不僅對影像分類有效,同樣能很好地應用在本地化任務中(翻譯任務)。作者在文章中進行了一系列的迴歸分析說明此事。(論文第10頁很好地說明了)

  • 用Caffe工具箱進行建模

  • 在訓練中使用了尺寸抖動技術scale jittering進行資料擴容data augmentation

  • 每卷積層後緊跟一個線性整流層ReLU並使用批量梯度下降法batch gradient descent進行訓練

  • 用4塊Nvidia Titan Black GPU進行訓練2~3周。


本文重要性


VGG Net是我印象中影響最為深遠的一篇文章,原因在於它強調了卷積網路中的深度,CNN必須保證擁有一個足夠深的網路結構才能體現它在處理視覺資料的層次性。保持深度、保持簡單。


GoogLeNet (2015)


http://www.cv-foundation.org/openaccess/content_cvpr_2015/papers/Szegedy_Going_Deeper_With_2015_CVPR_paper.pdf


還記得剛才我們所說的簡單法則嗎?然而Google在自己的架構Inception Module裡把這個原則拋到了九霄雲外。GoogLeNet是一個22層的CNN,它以6.7%的錯誤率贏得了2014年度ILSVRC的冠軍。據我所知,這是第一個跟傳統方法,也就是卷積層與池化層簡單疊加以形成序列結構的方法不同的一種CNN的新架構。文章作者強調,他們的新模型也特別重視記憶體與計算量的使用(這是之前我們沒有提到的:多層堆積以及大量濾波器的使用會耗費很多計算與儲存資源,同樣也會提升過擬合的機率)


640?wx_fmt=png


Inception Module


當我們第一眼看到GoogLeNet的架構時,會發現並不是像之前架構那樣,所有流程都是順序執行的。系統的許多部分是並行執行的。


640?wx_fmt=png


下圖就稱為Inception module。讓我們仔細研究一下它的構成。


640?wx_fmt=png

底部的綠色模組就是我們的輸入,而頂部綠色模組是輸出(把它順時針轉90°就可以跟之前的GoogLeNet架構圖對應起來了)。基本上在傳統卷積網路ConvNet中,你需要選擇當前輸入是用於執行池化pooling操作還是卷積操作(同樣要選擇濾波器尺寸)。然而在Inception module裡,你可以讓它們同時跑一遍。實際上,這正是作者一開始設計時的“天真”想法。


640?wx_fmt=png


為什麼說它“天真”呢?答案是它會導致太多的輸出。最終我們會得到一個具有極為巨大深度的陣列。為了解決這個問題,作者在3*3以及5*5卷積層之前,採用了一個1*1卷積操作。1*1卷積(或稱為網路中的網路架構NIN)提供了降維的效果。打個比方,假設你有一個100*100*60的輸入影像(尺寸無關緊要,可以看成是其中某一層的輸出)。將其進行20個1*1的卷積操作,則會將尺寸變為100*100*20(不太明白了,估計20個濾波器尺寸應當是1*1*60)。這意味著之後3*3以及5*5卷積所要面對的影像資料變少了。這就像是一個“特徵池化pooling of features”的操作,就跟在一般模型中的最大池化maxpooling層中降低空間尺寸的操作類似,在這裡我們降低了資料的深度。另外一點在於這些濾波器後跟線性整流層ReLU。


你可能會問“這架構有啥用?”。事實上,在這個由網路中的網路NIN層,中型濾波器,大型濾波器以及池化操作組成的架構中,NIN層能夠從輸入資料中提取出極為精細的影像細節資訊,5*5濾波器能夠覆蓋較大的感知區與提取其內部的資訊。同樣,池化操作流程能夠幫你減少空間尺寸,處理過擬合問題。另外,每個卷積層都配有一個線性整流層ReLU,它能夠降低你的系統線性度。基本來說,這個架構能夠以一個可接受的計算量處理這些複雜操作。此外,文章中還提到了一個更高層次的用途,是有關稀疏及稠密連線sparsity and dense connections的。


文章要點


  • 模型裡共使用9個Inception module模組,深度總計100層!

  • 並沒有使用全連通層,而是用一個平均池化層average pool取而代之,將7*7*1024的資料降低為1*1*1024。這個構造大大降低了參量個數。

  • 比AlexNet的參量個數少了12倍。

  • 在測試時,使用相同輸入影像的多個副本multiple crops(?)作為系統輸入,將其結果進行歸一化指數函式softmax平均操作後得到其最終結果。

  • 在模型中引入了區域卷積網路R-CNN的概念(之後會提到)

  • Inception module現在不斷更新中(現在版本6,7)

  • “用一些高階GPU訓練1周即可”


本文重要性


GoogLeNet是最先提出CNN模型中的非序列疊加模型這一概念的。文章作者通過介紹Inception module模組,為業內展示了一個獨具創造性的,有著較高執行效率的模型。本文為隨後出現的一些精彩的模型奠定了基石。

   

Microsoft ResNet (2015)


https://arxiv.org/pdf/1512.03385v1.pdf



想象一個很深的CNN架構,把它的層數翻兩番,它的深度可能還比不上ResNet,它是微軟亞研MRA在2015年提出的架構。ResNet是一個擁有152層網路架構的新秀,它集分類、檢測與翻譯功能於一身。除開層數破了紀錄,ResNet自身的表現也破了ILSVRC2015的記錄,達到了不可思議的3.6%(通常人類也只能達到5~10%的出錯率,跟專業領域和技能相關。請參考Andrej Karpathy以自身經驗撰寫的,有關ImageNet挑戰中人類與卷積網路ConvNet競賽的雄文great post http://karpathy.github.io/2014/09/02/what-i-learned-from-competing-against-a-convnet-on-imagenet/



640?wx_fmt=gif


Residual Block


文章中提出的殘差區塊residual block概念,其設計思路是這樣的:當我們的輸入x通過卷積-線性整流-卷積系列操作後,產生的結果設為F(x),將其與原始輸入x相加,就有H(x)=F(x)+x。對比傳統CNN,只有H(x)=F(x)。而ResNet需要把卷積結果F(x)與輸入x相加。下圖的子模組表現了這樣一個計算過程,它相當於對輸入x計算了一個微小變化"delta",這樣輸出H(x)就是x與變化delta的疊加(在傳統CNN中,輸出F(x)完全是一個全新的表達,它並不包含輸入x的資訊)。文章作者認為,“這種殘差對映關係residual mapping比起之前的無關對映unreferenced mapping更加容易優化”。


640?wx_fmt=png


殘差區塊的另外一個優勢在於反向傳播操作時,梯度資訊流由於這些附加的計算,從而更加容易傳播flow easily through the effective。


文章要點


  • “極度深寒Ultra-deep” - Yann LeCun

  • 152層...

  • 一個有意思的特點是,最初兩層處理後,輸入影像的空間尺寸由224*224壓縮至56*56

  • 作者宣告若在平層網路plain nets中隨意增加層數會導致訓練計算量以及錯誤率上升

  • 研究團隊曾嘗試使用1202層網路架構,結果精確度反而降低了,推測原因是過擬合。

  • 訓練使用一個8GPU的機器,持續了2~3周


文章重要性


模型達到的3.6%錯誤率本身就極具說服力了。ResNet模型是目前最棒的CNN架構,同時是殘差學習residual learning的一項重要創新。2012年以來,隨著錯誤率逐年下降,我很懷疑在ILSVRC2016上是否能看到更好的成績。我想我們也許已經到了一個瓶頸,僅依靠往模型中堆砌更多的卷積層已經難以獲取演算法效能上的提升了。就像之前的兩年那樣,今年的競賽一定會有更具創造性的新型模型架構。2016.9.16,這是今年比賽結果揭曉之日。別忘了。

     

Region Based CNNs 


  • R-CNN - 2013

https://arxiv.org/pdf/1311.2524v5.pdf

  • Fast R-CNN - 2015

https://arxiv.org/pdf/1504.08083.pdf

  • Faster R-CNN - 2015

http://arxiv.org/pdf/1506.01497v3.pdf

        

也許會有人認為比起之前所說的那些新架構,R-CNN才是最重要,對業內影響最大的CNN模型。UC Berkeley的Ross Girshick團隊發明了這種在機器視覺領域有著深遠影響的模型,其相關論文被引量超過了1600次。如同標題所說的,Fast R-CNN以及Faster R-CNN方法使我們的模型能夠更好更快地解決機器視覺中的目標檢測問題。


目標檢測的主要目的是:給出一副影像,把其中所有物體都框起來。這個過程可以分為兩個主要的部分:目標標定、分類。


作者提出,針對區域標定方法,任何類不可知區域檢測法class agnostic region proposal method都是合適的。其中Selective Search方法特別適用於RCNN模型。Selective Search演算法在執行的過程中會生成2000個不同的,有最大可能性標定影像中的目標的區域標定region proposals。獲取到這些標定區域後,演算法把它們“變形warped”轉換為一幅影像並輸入一個已訓練好的CNN中(例如AlexNet),進行特徵向量的提取。隨後將這些向量作為一系列線性SVM分類器的輸入進行分類。同樣將這些向量輸入給區域邊界的迴歸分析器regressor,用於進一步精確獲取目標的位置。


640?wx_fmt=png


隨後,模型採用一個非極大值抑制演算法用於去除那些互相重疊的區域。


Fast R-CNN


Fast R-CNN針對之前模型的改進主要集中在這3個方面的問題。多個階段的訓練(卷積網路ConvNet、SVM、區域邊界迴歸分析)計算負載很大且十分耗時。Fast R-CNN通過優化流程與改變各生成標定區域的順序,先計算卷積層,再將其結果用於多個不同的功能計算模組,以此解決速度的問題。在模型中,輸入影像首先通過一個ConvNet,從其最後輸出的特徵圖層中獲取特徵標定區域,最後將其同時輸入全連通層、迴歸分析模組以及分類模組。(譯者按:這段基本上為字面翻譯,然而有許多不合常理的地方。從圖中看出標定區域似乎是在ConvNet之前,跟文中所述矛盾;另外圖中似乎應該有多個ROI區域,並行地進行ConvNet,輸出結果再並行輸入FC,regressor等)


640?wx_fmt=png


Faster R-CNN


Faster R-CNN用於解決在R-CNN和Fast R-CNN中的一些複雜的訓練流程。作者在最後一層卷積層後插入了一個區域標定網路region proposal network(RPN)。RPN能夠從其輸入的特徵圖層中生成標定區域region proposals。之後流程則跟R-CNN一樣(ROI池化、全連通、分類以及迴歸)


640?wx_fmt=png


文章重要性


首先它能檢測影像中的特定物體;更重要的是它能夠找到這個物體在影像中的具體位置,這是機器學習的一個重要進步。目前,Faster R-CNN已經成為目標檢測演算法的標杆。


Generative Adversarial Networks (2014)


https://arxiv.org/pdf/1406.2661v1.pdf


根據Yann LeCun的說法,這個網路架構可以說又是一個大進步。在介紹這篇文章之前,我們先談談對抗樣本adversarial examples。例如,有一個經過ImageNet資料訓練好的CNN,現在給一副圖(如下圖左)加一些擾動或微小修改(中,右),輸入後導致預測錯誤率增加了許多。雖然影像看起來跟原來似乎是一樣的,但是最終分類卻與原先已經不同了。歸納起來,對抗樣本就是那些故意愚弄並破壞卷積網路ConvNets結果的影像。


640?wx_fmt=png

圖中文字:左列影像為正確樣本,中間一列表示左和右圖之間的擾動,右列影像的大部分都被歸類為鴕鳥ostrich。事實上,人眼幾乎難以分辨左右圖之間的差異,然而卷積網路ConvNet在分類時竟會產生如此誇張的錯誤。


對抗樣本Adversarial examples 嚇到了許多研究人員並馬上成為議論的熱點。現在讓我們談談這個generative adversarial networks模型。這裡有兩個模型:產生模型generative model和判別模型discriminative model。判別模型discriminative model用於判斷某幅影像是天然的(直接來自資料集裡)還是人為製造的。產生模型generator則創造樣本供給判別模型discriminator訓練。


這可以看成是一個零和zero-sum遊戲或是最小最大minimax遊戲。文章中用的類比是這樣的,產生模型generative model就像是“一群造假幣的”,而判別模型discriminative model則像是“抓造假幣者的警察”。產生模型不停地試圖欺騙判別模型而判別模型試圖識破欺騙。隨著模型的訓練,二者的能力不斷提升最後達到“贗品和正品已經完全分不清楚了”的程度。


論文重要性


聽起來這麼的簡單,那為什麼我們要關注這個模型呢?就像Yann LeCun在Quora網站上的帖子post   (https://www.quora.com/What-are-some-recent-and-potentially-upcoming-breakthroughs-in-deep-learning)


所述,因為判別模型discriminator已經能夠識別來自資料集中的真實影像以及人工仿造的影像,因此可以說其探悉了“資料的內在表達”。因此,這個模型可用作CNN中的特徵提取器;另外你也可以用它來仿造一些以假亂真的影像。


Generating Image Descriptions (2014)


https://arxiv.org/pdf/1412.2306v2.pdf


當你把CNN和RNN(迴圈神經網路)結合在一起會產生什麼?抱歉,別想錯了,你並不能得到R-CNN;-);但確實能得到一個很不錯的模型。Andrej Karpathy(我個人最喜歡的作者之一)和Fei-Fei Li所寫的這篇文章就是著重於研究將CNN與雙向RNN bidirectional RNN相結合生成用於描述影像區域的自然語言描述器。基本上這個模型通過輸入一副影像,產生如下的輸出:


640?wx_fmt=png


看起來非常不可思議。讓我們看看它跟普通CNN有什麼不同。在傳統的模型中,針對訓練資料中的每一張圖片,都只有一個確定的標籤與之對應。但本文所描述的模型則通過一個句子(或標題)與影像相關聯。這種標籤形式被稱為弱標籤,其語句中的成分與影像中的(未知)部分相關聯。使用這樣的訓練集,讓一個深度神經網路模型“推斷語句成分與其描述的影像區域之間的潛在結合alignment關係(文中語)”;另外還有一個網路模型則將影像作為輸入,生成其文字描述。現在讓我們分別看看這兩個部分:配對alignment與產生generation。


Alignment Model


這個部分的主要目的在於將視覺資訊和文字資訊進行配對結合(影像和描述文字)。模型輸入一幅影像與一句話,然後對它們倆的匹配程度進行打分作為輸出(有關這個模型工作的具體細節,作者Karpathy引用了另外一篇論文paper  https://arxiv.org/pdf/1406.5679v1.pdf。模型主要使用相容/不相容圖文對compatible and incompatible image-sentence pairs進行訓練。)


現在看一下該如何表現一幅影像。首先,把一幅影像輸入一個用ImageNet資料訓練過的R-CNN網路,檢測其中的物體。前19個檢測出來的物體(加上自身)表現為深度為500維的維度空間。那麼現在我們有了20個500維向量(文章中表示為v),這就是影像中的資訊。隨後,我們需要獲取語句中的資訊。我們利用雙向RNN架構,把輸入語句嵌入同樣的多模態維度空間。在模型的最高層,輸入的語句內容會以給定的句式(given sentence)表現出來。這樣,影像的資訊和語句資訊就處於同一個建模空間內,我們通過計算其內積就可以求得相似度了。


Generation Model


剛才說了,配對alignment模型建立了一個存放影像資訊(通過RCNN)和對應文字資訊(通過BRNN)的資料集。現在我們就可以利用這個資料集來訓練產生generation模型,讓模型從給定影像中生成一個新的描述文字資訊。模型將一幅影像輸入CNN,忽略其softmax層,其全連通層的輸出直接作為另一個RNN的輸入。這個RNN的主要功能則是為語句的不同單詞形成一個概率分佈函式。(同樣需要另外訓練)


宣告:這絕對是最難懂的文章之一,如果大家對我的講述有不同意見和建議,請一定在評論區留言。


640?wx_fmt=png


文章重要性


對我來說,本文要點在於利用了看起來似乎不同的兩種模型RNN和CNN,創造了一個結合機器視覺和自然語言處理兩方面功能的應用。它開啟了新世界的大門,提供了一個新的思路,使得深度學習模型更加聰明並能夠勝任跨學科領域的任務。


Spatial Transformer Networks (2015)


https://arxiv.org/pdf/1506.02025.pdf


最後,讓我們介紹一個最近的文章。這篇文章是由Google Deepmind研究組在一年前撰寫的。它提出了一種空間變形模組Spatial Transformer module。模組將輸入影像進行某種變形從而使得後續層處理時更加省時省力。比起修改CNN的主要結構,作者更關注於對輸入影像進行改造。它進行的改造主要有兩條:姿態正規化pose normalization(主要指影像場景中的物體是否傾斜、是否拉伸)以及空間聚焦spatial attention(主要指在一個擁擠的影像中如何聚焦某個物體)。在傳統CNN中,如果想要保證模型對尺度和旋轉具有不變性,那麼需要對應的大量訓練樣本。而在這個變形模組中,則不需要如此麻煩,下面就讓我們看看它是怎麼做的。


在傳統CNN中,應對空間不變性的模組主要是最大池化maxpooling層。其背後的直觀原因在於最大池化層能夠提取特徵資訊(在輸入影像中有著高啟用值的那些區域)的相對位置作為一個重要屬性,而不是絕對位置。而文中所述的空間變形模組則是通過一種動態的方式對輸入影像進行變換(扭曲、變形)。這種形式不像傳統的最大池化操作那樣簡單與死板。讓我們看看它的組成:


  • 一個區域性網路結構,通過輸入影像計算出應該對影像採用的形變引數並將其輸出。形變引數稱作theta,定義為一個6維的仿射變換向量。

  • 一個正規化網格經過上述引數的仿射變換之後生成的取樣網格產物。

  • 用作對輸入圖層變換的取樣器sampler


640?wx_fmt=png


這樣的一個模組可以插入於CNN網路的任何地方,幫助整個網路結構學習特徵圖層形變,降低訓練成本。


640?wx_fmt=png

圖中文字:在一個全連通網路架構用於扭曲手寫MNIST庫的數字識別的專案中,新增空間變形模組spatial transformer作為架構的第一層的執行結果:(a)輸入資料是MNIST手寫庫中的影像,影像上施加了隨機變換、縮放、旋轉以及其它干擾噪聲clutter。(b)空間變形模組預測的影像形變。(c)通過空間變形模組處理後的結果。(d)隨後通過全連通網路分類預測後的結果。附帶空間變形模組的網路架構在訓練時僅使用了最後的正確標籤,也就是數字標籤,而並沒有使用正確變形引數作為標籤進行訓練。


文章重要性


這篇文章吸引眼球的地方在於它提出這樣的一種可能性:對CNN的改進並不一定要對網路架構的大規模修改,也不需要創造出另外一個ResNet或Inception module這樣的複雜模型。這篇文章通過實現了一個對輸入影像進行仿射變換的簡單功能從而讓模型擁有了很強的形變、伸縮、旋轉不變性。如果對本文所述的模型還有興趣的同學,可以看一下這個Deepmind團隊的視訊video,https://drive.google.com/file/d/0B1nQa_sA3W2iN3RQLXVFRkNXN0k/view

對CNN加空間形變模組的結果有很好的展示,同時也可以參考這個Quora討論貼discussion。https://www.quora.com/How-do-spatial-transformer-networks-work


這就是我們的卷積網路入門的三部曲。再次強烈推薦Stanford的CS 231n視訊課程,http://study.163.com/course/courseMain.htm?courseId=1004697005


640?wx_fmt=jpeg

相關文章