CNN(卷積神經網路)是什麼?有入門簡介或文章嗎?

想要了解一下CNN的原理及作用,還有實現方法。


Part 1:圖像識別任務


卷積神經網路,聽起來像是計算機科學、生物學和數學的詭異組合,但它們已經成為計算機視覺領域中最具影響力的革新的一部分。神經網路在 2012 年嶄露頭角,Alex Krizhevsky 憑藉它們贏得了那一年的 ImageNet 挑戰賽(大體上相當於計算機視覺的年度奧林匹克),他把分類誤差記錄從 26% 降到了 15%,在當時震驚了世界。自那之後,大量公司開始將深度學慣用作服務的核心。Facebook 將神經網路用於自動標註演算法、谷歌將它用於圖片搜索、亞馬遜將它用於商品推薦、Pinterest 將它用於個性化主頁推送、Instagram 將它用於搜索架構。

然而,應用這些網路最經典最流行的案例是進行圖像處理。在圖像處理任務中,讓我們看一下如何使用卷積神經網路進行圖像分類。


問題空間

圖像分類是對輸入圖像的操作,最終輸出一組最好地描述了圖像內容的分類(如貓、狗等)或分類的概率。對人類來說,識別是打出生便開始學習的技能之一,對成人來說更是信手拈來,毫不費力。我們只需一眼便能快速識別我們所處的環境以及環繞在我們身邊的物體。當我們看到一張圖片或是環看四周的時候,無需刻意觀察,多數時候也能立即描述出場景特徵並標記出每一個對象。快速識別不同模式、根據早前知識進行歸納、以及適應不同的圖像環境一直都是人類的專屬技能,機器尚未享有。

輸入與輸出


當計算機看到一張圖像(輸入一張圖像)時,它看的是一大堆像素值。根據圖片的解析度和尺寸,它將看到一個 32 x 32 x 3 的數組(3 指代的是 RGB 值)。為了講清楚這一點,假設我們有一張 JPG 格式的 480 x 480 大小的彩色圖片,那麼它對應的數組就有 480 x 480 x 3 個元素。其中每個數字的值從 0 到 255 不等,其描述了對應那一點的像素灰度。當我們人類對圖像進行分類時,這些數字毫無用處,可它們卻是計算機可獲得的唯一輸入。其中的思想是:當你提供給計算機這一數組後,它將輸出描述該圖像屬於某一特定分類的概率的數字(比如:80% 是貓、15% 是狗、5% 是鳥)。


我們想要計算機做什麼


現在我們知道了問題所在以及輸入與輸出,就該考慮如何處理了。我們想要計算機能夠區分開所有提供給它的圖片,以及搞清楚貓貓狗狗各自的特有特徵。這也是我們人類的大腦中不自覺進行著的過程。當我們看到一幅狗的圖片時,如果有諸如爪子或四條腿之類的明顯特徵,我們便能將它歸類為狗。同樣地,計算機也可以通過尋找諸如邊緣和曲線之類的低級特點來分類圖片,繼而通過一系列卷積層級建構出更為抽象的概念。這是 CNN(卷積神經網路)工作方式的大體概述,下面是具體細節。


生物學連接


首先介紹些背景。當你第一次聽到卷積神經網路這一術語,可能會聯想到神經科學或生物學,那就對了。可以這樣說。CNN 的確是從視覺皮層的生物學上獲得啟發的。視覺皮層有小部分細胞對特定部分的視覺區域敏感。Hubel 和 Wiesel 於 1962 年進行的一項有趣的試驗詳細說明了這一觀點,他們驗證出大腦中的一些個體神經細胞只有在特定方向的邊緣存在時才能做出反應(即放電)。例如,一些神經元只對垂直邊緣興奮,另一些對水平或對角邊緣興奮。Hubel 和 Wisesl 發現所有這些神經元都以柱狀結構的形式進行排列,而且一起工作才能產生視覺感知。這種一個系統中的特定組件有特定任務的觀點(視覺皮層的神經元細胞尋找特定特徵)在機器中同樣適用,這就是 CNN 的基礎。


結構


回到細節上來。更為詳細的 CNN 工作概述指的是你挑一張圖像,讓它歷經一系列卷積層、非線性層、池化(下採樣(downsampling))層和完全連接層,最終得到輸出。正如之前所說,輸出可以是最好地描述了圖像內容的一個單獨分類或一組分類的概率。如今,難點在於理解其中每一層的工作方法。我們先來看最重要的部分。

第一層——數學部分


CNN 的第一層通常是卷積層(Convolutional Layer)。首先需要了解卷積層的輸入內容是什麼。如上所述,輸入內容為一個 32 x 32 x 3 的像素值數組。現在,解釋卷積層的最佳方法是想像有一束手電筒光正從圖像的左上角照過。假設手電筒光可以覆蓋 5 x 5 的區域,想像一下手電筒光照過輸入圖像的所有區域。在機器學習術語中,這束手電筒被叫做過濾器(filter,有時候也被稱為神經元(neuron)或核(kernel)),被照過的區域被稱為感受野(receptive field)。過濾器同樣也是一個數組(其中的數字被稱作權重或參數)。重點在於過濾器的深度必須與輸入內容的深度相同(這樣才能確保可以進行數學運算),因此過濾器大小為 5 x 5 x 3。現在,以過濾器所處在的第一個位置為例,即圖像的左上角。當篩選值在圖像上滑動(卷積運算)時,過濾器中的值會與圖像中的原始像素值相乘(又稱為計算點積)。這些乘積被加在一起(從數學上來說,一共會有 75 個乘積)。現在你得到了一個數字。切記,該數字只是表示過濾器位於圖片左上角的情況。我們在輸入內容上的每一位置重複該過程。(下一步將是將過濾器右移 1 單元,接著再右移 1 單元,以此類推。)輸入內容上的每一特定位置都會產生一個數字。過濾器滑過所有位置後將得到一個 28 x 28 x 1 的數組,我們稱之為激活映射(activation map)或特徵映射(feature map)。之所以得到一個 28 x 28 的數組的原因在於,在一張 32 x 32 的輸入圖像上,5 x 5 的過濾器能夠覆蓋到 784 個不同的位置。這 784 個位置可映射為一個 28 x 28 的數組。

(注意:包括上圖在內的一些圖片來自於 Micheal Nielsen 的 「神經網路與深度學習( Neural Networks and Deep Learning)」一書。我強烈推薦這本書。這本書可免費在線瀏覽:Neural networks and deep learning)


當我們使用兩個而不是一個 5 x 5 x 3 的過濾器時,輸出總量將會變成 28 x 28 x 2。採用的過濾器越多,空間維度( spatial dimensions)保留得也就越好。數學上而言,這就是卷積層上發生的事情。


第一層——高層次角度


不過,從高層次角度而言卷積是如何工作的?每個過濾器可以被看成是特徵標識符( feature identifiers)。這裡的特徵指的是例如直邊緣、原色、曲線之類的東西。想一想所有圖像都共有的一些最簡單的特徵。假設第一組過濾器是 7 x 7 x 3 的曲線檢測器。(在這一節,為了易於分析,暫且忽略該過濾器的深度為 3 個單元,只考慮過濾器和圖像的頂層層面。)作為曲線過濾器,它將有一個像素結構,在曲線形狀旁時會產生更高的數值(切記,我們所討論的過濾器不過是一組數值!)

左圖:過濾器的像素表示;右圖:曲線檢測器過濾器的可視化;對比兩圖可以看到數值和形狀的對應


回到數學角度來看這一過程。當我們將過濾器置於輸入內容的左上角時,它將計算過濾器和這一區域像素值之間的點積。拿一張需要分類的照片為例,將過濾器放在它的左上角。

切記,我們要做的是將過濾器與圖像的原始像素值相乘。

左圖:感受野的可視化;右圖:感受野的像素表示 * 過濾器的像素表示


簡單來說,如果輸入圖像上某個形狀看起來很像過濾器表示的曲線,那麼所有點積加在一起將會得出一個很大的值!讓我們看看移動過濾器時會發生什麼。

這個值小了很多!這是因為圖像的這一部分和曲線檢測器過濾器不存在對應。記住,這個卷積層的輸出是一個激活映射(activation map)。因此,在這個帶有一個過濾器卷積的例子里(當篩選值為曲線檢測器),激活映射將會顯示出圖像里最像曲線的區域。在該例子中,28 x 28 x 1 的激活映射的左上角的值為 6600。高數值意味著很有可能是輸入內容中的曲線激活了過濾器。激活地圖右上角的值將會是 0,因為輸入內容中沒有任何東西能激活過濾器(更簡單地說,原始圖片中的這一區域沒有任何曲線)。這僅僅是一組檢測右彎曲線的過濾器。還有其它檢測左彎曲線或直線邊緣的過濾器。過濾器越多,激活映射的深度越大,我們對輸入內容的了解也就越多。


聲明:我在本小節中描繪的過濾器(filter)只是為了描述卷積中的數學過程。在下圖中你可以看到訓練後的網路中第一個卷積層的過濾器的實際可視化。儘管如此,主要觀點仍舊不變。當在輸入內容中尋找特定特徵時,第一層上的過濾器在輸入圖像上進行卷積運算和「激活」(即計算高數值)。

上圖來自於斯坦福大學由 Andrej Karpathy 和 Justin Johnson 授課的 CS 231N 課程,推薦給渴望更深層理解 CNN 的人們:CS231n: Convolutional Neural Networks for Visual Recognition


網路中的更深處

在傳統卷積神經網路架構中,卷積層之間還有其它類型的層。我強烈建議有興趣的人閱讀和它們有關的材料,並理解相應的功能和作用;但總的來說,它們提供的非線性和維度保留有助於提高網路的穩健性(robustness)並控制過擬合。一個典型的 CNN 結構看起來是這樣的:

輸入→卷積→ReLU→卷積→ReLU→池化→ReLU→卷積→ReLU→池化→全連接


我們稍後再來討論關鍵的最後一層,先回顧一下學到了哪些。我們討論了過濾器是如何在第一個卷積層檢測特徵的。它們檢測邊緣和曲線一類的低級特徵。正如想像的那樣,為了預測出圖片內容的分類,網路需要識別更高級的特徵,例如手、爪子與耳朵的區別。第一個卷積層的輸出將會是一個 28 x 28 x 3 的數組(假設我們採用三個 5 x 5 x 3 的過濾器)。當我們進入另一卷積層時,第一個卷積層的輸出便是第二個卷積層的輸入。解釋這一點有些困難。第一層的輸入是原始圖像,而第二卷積層的輸入正是第一層輸出的激活映射。也就是說,這一層的輸入大體描繪了低級特徵在原始圖片中的位置。在此基礎上再採用一組過濾器(讓它通過第 2 個卷積層),輸出將是表示了更高級的特徵的激活映射。這類特徵可以是半圓(曲線和直線的組合)或四邊形(幾條直線的組合)。隨著進入網路越深和經過更多卷積層後,你將得到更為複雜特徵的激活映射。在網路的最後,可能會有一些過濾器會在看到手寫筆跡或粉紅物體等時激活。如果你想知道更多關於可視化卷積網路中過濾器的內容,可以查看 Matt Zeiler 和 Rob Fergus 的一篇討論該問題的頗為傑出的研究論文。在 YouTube 上,Jason Yosinski 有一段視頻十分視覺化地呈現了這一過程(如下)。有趣的是,越深入網路,過濾器的感受野越大,意味著它們能夠處理更大範圍的原始輸入內容(或者說它們可以對更大區域的像素空間產生反應)。


完全連接層


檢測高級特徵之後,網路最後的完全連接層就更是錦上添花了。簡單地說,這一層處理輸入內容(該輸入可能是卷積層、ReLU 層或是池化層的輸出)後會輸出一個 N 維向量,N 是該程序必須選擇的分類數量。例如,如果你想得到一個數字分類程序,如果有 10 個數字,N 就等於 10。這個 N 維向量中的每一數字都代表某一特定類別的概率。例如,如果某一數字分類程序的結果矢量是 [0 .1 .1 .75 0 0 0 0 0 .05],則代表該圖片有 10% 的概率是 1、10% 的概率是 2、75% 的概率是 3、還有 5% 的概率是 9(註:還有其他表現輸出的方式,這裡只展示了 softmax 的方法)。完全連接層觀察上一層的輸出(其表示了更高級特徵的激活映射)並確定這些特徵與哪一分類最為吻合。例如,如果該程序預測某一圖像的內容為狗,那麼激活映射中的高數值便會代表一些爪子或四條腿之類的高級特徵。同樣地,如果程序測定某一圖片的內容為鳥,激活映射中的高數值便會代表諸如翅膀或鳥喙之類的高級特徵。大體上來說,完全連接層觀察高級特徵和哪一分類最為吻合和擁有怎樣的特定權重,因此當計算出權重與先前層之間的點積後,你將得到不同分類的正確概率。

訓練(也就是:什麼能讓其有效)


下面是神經網路中的一個我尚未提及但卻最為重要的部分。閱讀過程中你可能會提出許多問題。第一卷積層中的濾波器是如何知道尋找邊緣與曲線的?完全連接層怎麼知道觀察哪些激活圖?每一層級的濾波器如何知道需要哪些值?計算機通過一個名為反向傳播的訓練過程來調整過濾器值(或權重)。


在探討反向傳播之前,我們首先必須回顧一下神經網路工作起來需要什麼。在我們剛出生的時候,大腦一無所知。我們不曉得貓啊狗啊鳥啊都是些什麼東西。與之類似的是 CNN 剛開始的時候,權重或過濾器值都是隨機的。濾波器不知道要去尋找邊緣和曲線。更高層的過濾器值也不知道要去尋找爪子和鳥喙。不過隨著年歲的增長,父母和老師向我們介紹各式各樣的圖片並且一一作出標記。CNN 經歷的便是一個介紹圖片與分類標記的訓練過程。在深入探討之前,先設定一個訓練集,在這裡有上千張狗、貓、鳥的圖片,每一張都依照內容被標記。下面回到反向傳播的問題上來。

反向傳播可分為四部分,分別是前向傳導、損失函數、後向傳導,以及權重更新。在前向傳導中,選擇一張 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 (均方誤差)。

假設變數 L 等同該數值。正如所料,前兩張訓練圖片的損失將會極高。現在,我們直觀地想一下。我們想要預測標記(卷積網路的輸出)與訓練標記相同(意味著網路預測正確)。為了做到這一點,我們想要將損失數量最小化。將其視為微積分優化問題的話,也就是說我們想要找出是哪部分輸入(例子中的權重)直接導致了網路的損失(或錯誤)。

這是一個 dL/dW 的數學等式,W 是特定層級的權重。我們接下來要做的是在網路中進行後向傳導,測定出是哪部分權重導致了最大的損失,尋找調整方法並減少損失。一旦計算出該導數,將進行最後一步也就是權重更新。所有的過濾器的權重將會更新,以便它們順著梯度方向改變。

學習速率是一個由程序員決定的參數。高學習速率意味著權重更新的動作更大,因此可能該模式將花費更少的時間收斂到最優權重。然而,學習速率過高會導致跳動過大,不夠準確以致於達不到最優點。

總的來說,前向傳導、損失函數、後向傳導、以及參數更新被稱為一個學習周期。對每一訓練圖片,程序將重複固定數目的周期過程。一旦完成了最後訓練樣本上的參數更新,網路有望得到足夠好的訓練,以便層級中的權重得到正確調整。


測試


最後,為了檢驗 CNN 能否工作,我們準備不同的另一組圖片與標記集(不能在訓練和測試中使用相同的!)並讓它們通過這個 CNN。我們將輸出與實際情況(ground truth )相比較,看看網路是否有效!


企業如何使用 CNN

數據、數據、數據。數據越多的企業在競爭中越發彰顯優勢。你提供給網路的訓練數據越多,你能進行的訓練迭代也越多,緊接著權重更新也多,那麼當用於產品時調整出的網路自然就好。Facebook (和 Instagram)可以使用它如今擁有的十幾億用戶的圖片,Pinterest 可以使用它站點上 500 億花瓣的信息,谷歌可以使用搜索數據,亞馬遜可以使用每天銷售的數以百萬計的商品數據。而你現在也知道它們使用數據背後的神奇之處了。


Part 2:卷積神經網路中的部分問題

引言


在這篇文章中,我們將更深入地介紹有關卷積神經網路(ConvNet)的詳細情況。聲明:我確實知道本文中一部分內容相當複雜,可以用一整篇文章進行介紹。但為了在保持全面性的同時保證簡潔,我會在文章中相關位置提供一些更詳細解釋該相關主題的論文鏈接。


步幅和填充


好了,現在來看一下我們的卷積神經網路。還記得過濾器、感受野和卷積嗎?很好。現在,要改變每一層的行為,有兩個主要參數是我們可以調整的。選擇了過濾器的尺寸以後,我們還需要選擇步幅(stride)和填充(padding)。


步幅控制著過濾器圍繞輸入內容進行卷積計算的方式。在第一部分我們舉的例子中,過濾器通過每次移動一個單元的方式對輸入內容進行卷積。過濾器移動的距離就是步幅。在那個例子中,步幅被默認設置為1。步幅的設置通常要確保輸出內容是一個整數而非分數。讓我們看一個例子。想像一個 7 x 7 的輸入圖像,一個 3 x 3 過濾器(簡單起見不考慮第三個維度),步幅為 1。這是一種慣常的情況。

還是老一套,對吧?看你能不能試著猜出如果步幅增加到 2,輸出內容會怎麼樣。

所以,正如你能想到的,感受野移動了兩個單元,輸出內容同樣也會減小。注意,如果試圖把我們的步幅設置成 3,那我們就會難以調節間距並確保感受野與輸入圖像匹配。正常情況下,程序員如果想讓接受域重疊得更少並且想要更小的空間維度(spatial dimensions)時,他們會增加步幅。

現在讓我們看一下填充(padding)。在此之前,想像一個場景:當你把 5 x 5 x 3 的過濾器用在 32 x 32 x 3 的輸入上時,會發生什麼?輸出的大小會是 28 x 28 x 3。注意,這裡空間維度減小了。如果我們繼續用卷積層,尺寸減小的速度就會超過我們的期望。在網路的早期層中,我們想要儘可能多地保留原始輸入內容的信息,這樣我們就能提取出那些低層的特徵。比如說我們想要應用同樣的卷積層,但又想讓輸出量維持為 32 x 32 x 3 。為做到這點,我們可以對這個層應用大小為 2 的零填充(zero padding)。零填充在輸入內容的邊界周圍補充零。如果我們用兩個零填充,就會得到一個 36 x 36 x 3 的輸入卷。

如果我們在輸入內容的周圍應用兩次零填充,那麼輸入量就為 32×32×3。然後,當我們應用帶有 3 個 5×5×3 的過濾器,以 1 的步幅進行處理時,我們也可以得到一個 32×32×3 的輸出


如果你的步幅為 1,而且把零填充設置為

K 是過濾器尺寸,那麼輸入和輸出內容就總能保持一致的空間維度。


計算任意給定卷積層的輸出的大小的公式是

其中 O 是輸出尺寸,K 是過濾器尺寸,P 是填充,S 是步幅。


選擇超參數

我們怎麼知道要用多少層、多少卷積層、過濾器尺寸是多少、以及步幅和填充值多大呢?這些問題很重要,但又沒有一個所有研究人員都在使用的固定標準。這是因為神經網路很大程度上取決於你的數據類型。圖像的大小、複雜度、圖像處理任務的類型以及其他更多特徵的不同都會造成數據的不同。對於你的數據集,想出如何選擇超參數的一個方法是找到能創造出圖像在合適尺度上抽象的正確組合。


ReLU(修正線性單元)層


在每個卷積層之後,通常會立即應用一個非線性層(或激活層)。其目的是給一個在卷積層中剛經過線性計算操作(只是數組元素依次(element wise)相乘與求和)的系統引入非線性特徵。過去,人們用的是像雙曲正切和 S 型函數這樣的非線性方程,但研究者發現 ReLU 層效果好得多,因為神經網路能夠在準確度不發生明顯改變的情況下把訓練速度提高很多(由於計算效率增加)。它同樣能幫助減輕梯度消失的問題——由於梯度以指數方式在層中消失,導致網路較底層的訓練速度非常慢。ReLU 層對輸入內容的所有值都應用了函數 f(x) = max(0, x)。用基本術語來說,這一層把所有的負激活(negative activation)都變為零。這一層會增加模型乃至整個神經網路的非線性特徵,而且不會影響卷積層的感受野。

  • 參見 Geoffrey Hinton(即深度學習之父)的論文:Rectified Linear Units Improve Restricted Boltzmann Machines

池化層


在幾個 ReLU 層之後,程序員也許會選擇用一個池化層(pooling layer)。它同時也被叫做下採樣(downsampling)層。在這個類別中,也有幾種可供選擇的層,最受歡迎的就是最大池化( max-pooling)。它基本上採用了一個過濾器(通常是 2x2 的)和一個同樣長度的步幅。然後把它應用到輸入內容上,輸出過濾器卷積計算的每個子區域中的最大數字。

帶有 2×2 和過濾器的且步幅為 2 的最大池化的例子


池化層還有其他選擇,比如平均池化(average pooling)和 L2-norm 池化 。這一層背後的直觀推理是:一旦我們知道了原始輸入(這裡會有一個高激活值)中一個特定的特徵,它與其它特徵的相對位置就比它的絕對位置更重要。可想而知,這一層大幅減小了輸入卷的空間維度(長度和寬度改變了,但深度沒變)。這到達了兩個主要目的。第一個是權重參數的數目減少到了75%,因此降低了計算成本。第二是它可以控制過擬合(overfitting)。這個術語是指一個模型與訓練樣本太過匹配了,以至於用於驗證和檢測組時無法產生出好的結果。出現過擬合的表現是一個模型在訓練集能達到 100% 或 99% 的準確度,而在測試數據上卻只有50%。


Dropout 層

如今,Dropout 層在神經網路有了非常明確的功能。上一節,我們討論了經過訓練後的過擬合問題:訓練之後,神經網路的權重與訓練樣本太過匹配以至於在處理新樣本的時候表現平平。Dropout 的概念在本質上非常簡單。Dropout 層將「丟棄(drop out)」該層中一個隨機的激活參數集,即在前向通過(forward pass)中將這些激活參數集設置為 0。簡單如斯。既然如此,這些簡單而且似乎不必要且有些反常的過程的好處是什麼?在某種程度上,這種機制強制網路變得更加冗餘。這裡的意思是:該網路將能夠為特定的樣本提供合適的分類或輸出,即使一些激活參數被丟棄。此機制將保證神經網路不會對訓練樣本「過於匹配」,這將幫助緩解過擬合問題。另外,Dropout 層只能在訓練中使用,而不能用於測試過程,這是很重要的一點。

  • 參考 Geoffrey Hinton 的論文:Dropout: A Simple Way to Prevent Neural Networks from Overfitting

網路層中的網路


網路層中的網路指的是一個使用了 1 x 1 尺寸的過濾器的卷積層。現在,匆匆一瞥,你或許會好奇為何這種感受野大於它們所映射空間的網路層竟然會有幫助。然而,我們必須謹記 1x1 的卷積層跨越了特定深度,所以我們可以設想一個1 x 1 x N 的卷積層,此處 N 代表該層應用的過濾器數量。該層有效地使用 N 維數組元素依次相乘的乘法,此時 N 代表的是該層的輸入的深度。

  • 參閱 Min Lin 的論文:Network In Network

分類、定位、檢測、分割


本系列第一部分使用的案例中,我們觀察了圖像分類任務。這個過程是:獲取輸入圖片,輸出一套分類的類數(class number)。然而當我們執行類似目標定位的任務時,我們要做的不只是生成一個類標籤,而是生成一個描述圖片中物體suo所在位置的邊界框。

我們也有目標檢測的任務,這需要圖片上所有目標的定位任務都已完成。


因此,你將獲得多個邊界框和多個類標籤。


最終,我們將執行目標分割的任務:我們需要輸出類標籤的同時輸出圖片中每個目標的輪廓。

關於目標檢測、定位、分割的論文有很多,這裡就不一一列出了。


遷移學習


如今,深度學習領域一個常見的誤解在於沒有谷歌那樣的巨量數據,你將沒有希望創建一個有效的深度學習模型。儘管數據是創建網路中至關重要的部分,遷移學習的思路將幫助我們降低數據需求。遷移學習指的是利用預訓練模型(神經網路的權重和參數都已經被其他人利用更大規模的數據集訓練好了)並用自己的數據集將模型「微調」的過程。這種思路中預訓練模型扮演著特徵提取器的角色。你將移除網路的最後一層並用你自有的分類器置換(取決於你的問題空間)。然後凍結其他所有層的權重並正常訓練該網路(凍結這些層意味著在梯度下降/最優化過程中保持權值不變)。


讓我們探討一下為什麼做這項工作。比如說我們正在討論的這個預訓練模型是在 ImageNet (一個包含一千多個分類,一千四百萬張圖像的數據集)上訓練的 。當我們思考神經網路的較低層時,我們知道它們將檢測類似曲線和邊緣這樣的特徵。現在,除非你有一個極為獨特的問題空間和數據集,你的神經網路也會檢測曲線和邊緣這些特徵。相比通過隨機初始化權重訓練整個網路,我們可以利用預訓練模型的權重(並凍結)聚焦於更重要的層(更高層)進行訓練。如果你的數據集不同於 ImageNet 這樣的數據集,你必須訓練更多的層級而只凍結一些低層的網路。

  • Yoshua Bengio (另外一個深度學習先驅 )論文:How transferable are features in deep neural networks?

  • Ali Sharif Razavian 論文:CNN Features off-the-shelf: an Astounding Baseline for Recognition

  • Jeff Donahue 論文:DeCAF: A Deep Convolutional Activation Feature for Generic Visual Recognition

數據增強技術


現在我們對卷積網路中數據的重要性可能已經感到有些麻木了,所以我們來談下如何利用一些簡單的轉換方法將你現有的數據集變得更大。正如我們之前所提及的,當計算機將圖片當作輸入時,它將用一個包含一列像素值的數組描述(這幅圖)。若是圖片左移一個像素。對你和我來說,這種變化是微不可察的。然而對計算機而已,這種變化非常顯著:這幅圖的類別和標籤保持不變,數組卻變化了。這種改變訓練數據的數組表徵而保持標籤不變的方法被稱作數據增強技術。這是一種人工擴展數據集的方法。人們經常使用的增強方法包括灰度變化、水平翻轉、垂直翻轉、隨機編組、色值跳變、翻譯、旋轉等其他多種方法。通過利用這些訓練數據的轉換方法,你將獲得兩倍甚至三倍於原數據的訓練樣本。


深度 | 從入門到精通:卷積神經網路初學者指南(附論文)


該文是卷積神經網路--介紹,並假設你理解前饋神經網路。

如果不是,強烈建議你讀完如何簡單形象又有趣地講解神經網路是什麼? 後再來讀該篇。

目錄

  • 視覺感知
    • 畫面識別是什麼
    • 識別結果取決於什麼
  • 圖像表達
    • 畫面識別的輸入
    • 畫面不變形
  • 前饋神經網路做畫面識別的不足
  • 卷積神經網路做畫面識別
    • 局部連接
    • 空間共享
    • 輸出空間表達
    • Depth維的處理
    • Zero padding
    • 形狀、概念抓取
    • 多filters
    • 非線性
    • 輸出尺寸控制
    • 矩陣乘法執行卷積
    • Max pooling
    • 全連接層
    • 結構發展
  • 畫面不變性的滿足
    • 平移不變性
    • 旋轉和視角不變性
    • 尺寸不變性
    • Inception的理解
    • 1x1卷積核理解
    • 跳層連接ResNet

視覺感知

一、畫面識別是什麼任務?

學習知識的第一步就是明確任務,清楚該知識的輸入輸出。卷積神經網路最初是服務於畫面識別的,所以我們先來看看畫面識別的實質是什麼。

先觀看幾組動物與人類視覺的差異對比圖。

1. 蒼蠅的視覺和人的視覺的差異

2. 蛇的視覺和人的視覺的差異

(更多對比圖請參考鏈接)

通過上面的兩組對比圖可以知道,即便是相同的圖片經過不同的視覺系統,也會得到不同的感知。

這裡引出一條知識:生物所看到的景象並非世界的原貌,而是長期進化出來的適合自己生存環境的一種感知方式。 蛇的獵物一般是夜間行動,所以它就進化出了一種可以在夜間也能很好觀察的感知系統,感熱。

任何視覺系統都是將圖像反光與腦中所看到的概念進行關聯。

所以畫面識別實際上並非識別這個東西客觀上是什麼,而是尋找人類的視覺關聯方式,並再次應用。 如果我們不是人類,而是蛇類,那麼畫面識別所尋找的 就和現在的不一樣。

畫面識別實際上是尋找(學習)人類的視覺關聯方式 ,並再次應用

二、圖片被識別成什麼取決於哪些因素?

下面用兩張圖片來體會識別結果取決於哪些因素。

1. 老婦與少女

請觀察上面這張圖片,你看到的是老婦還是少女? 以不同的方式去觀察這張圖片會得出不同的答案。 圖片可以觀察成有大鼻子、大眼睛的老婦。也可以被觀察成少女,但這時老婦的嘴會被識別成少女脖子上的項鏈,而老婦的眼睛則被識別為少女的耳朵。

2. 海豚與男女

上面這張圖片如果是成人觀察,多半看到的會是一對親熱的男女。倘若兒童看到這張圖片,看到的則會是一群海豚(男女的輪廓是由海豚構造出的)。所以,識別結果受年齡,文化等因素的影響,換句話說:

圖片被識別成什麼不僅僅取決於圖片本身,還取決於圖片是如何被觀察的。

圖像表達

我們知道了「畫面識別是從大量的(x,y)數據中尋找人類的視覺關聯方式 ,並再次應用。 其x-是輸入,表示所看到的東西y-輸出,表示該東西是什麼。

在自然界中,x是物體的反光,那麼在計算機中,圖像又是如何被表達和存儲的呢?

[from]

圖像在計算機中是一堆按順序排列的數字,數值為0到255。0表示最暗,255表示最亮。 你可以把這堆數字用一個長長的向量來表示,也就是tensorflow的mnist教程中784維向量的表示方式。 然而這樣會失去平面結構的信息,為保留該結構信息,通常選擇矩陣的表示方式:28x28的矩陣。

上圖是只有黑白顏色的灰度圖,而更普遍的圖片表達方式是RGB顏色模型,即紅(Red)、綠(Green)、藍(Blue)三原色的色光以不同的比例相加,以產生多種多樣的色光。

這樣,RGB顏色模型中,單個矩陣就擴展成了有序排列的三個矩陣,也可以用三維張量去理解,其中的每一個矩陣又叫這個圖片的一個channel。

在電腦中,一張圖片是數字構成的「長方體」。可用 寬width, 高height, 深depth 來描述,如圖。

畫面識別的輸入x是shape為(width, height, depth)的三維張量。

接下來要考慮的就是該如何處理這樣的「數字長方體」。

畫面不變性

在決定如何處理「數字長方體」之前,需要清楚所建立的網路擁有什麼樣的特點。 我們知道一個物體不管在畫面左側還是右側,都會被識別為同一物體,這一特點就是不變性(invariance),如下圖所示。

我們希望所建立的網路可以儘可能的滿足這些不變性特點。

為了理解卷積神經網路對這些不變性特點的貢獻,我們將用不具備這些不變性特點的前饋神經網路來進行比較。

圖片識別--前饋神經網路

方便起見,我們用depth只有1的灰度圖來舉例。 想要完成的任務是:在寬長為4x4的圖片中識別是否有下圖所示的「橫折」。 圖中,黃色圓點表示值為0的像素,深色圓點表示值為1的像素。 我們知道不管這個橫折在圖片中的什麼位置,都會被認為是相同的橫折。

若訓練前饋神經網路來完成該任務,那麼表達圖像的三維張量將會被攤平成一個向量,作為網路的輸入,即(width, height, depth)為(4, 4, 1)的圖片會被展成維度為16的向量作為網路的輸入層。再經過幾層不同節點個數的隱藏層,最終輸出兩個節點,分別表示「有橫折的概率」和「沒有橫折的概率」,如下圖所示。

下面我們用數字(16進位)對圖片中的每一個像素點(pixel)進行編號。 當使用右側那種物體位於中間的訓練數據來訓練網路時,網路就只會對編號為5,6,9,a的節點的權重進行調節。 若讓該網路識別位於右下角的「橫折」時,則無法識別。

解決辦法是用大量物體位於不同位置的數據訓練,同時增加網路的隱藏層個數從而擴大網路學習這些變體的能力。

然而這樣做十分不效率,因為我們知道在左側的「橫折」也好,還是在右側的「橫折」也罷,大家都是「橫折」。 為什麼相同的東西在位置變了之後要重新學習?有沒有什麼方法可以將中間所學到的規律也運用在其他的位置? 換句話說,也就是讓不同位置用相同的權重

圖片識別--卷積神經網路

卷積神經網路就是讓權重在不同位置共享的神經網路。

局部連接

在卷積神經網路中,我們先選擇一個局部區域,用這個局部區域去掃描整張圖片。 局部區域所圈起來的所有節點會被連接到下一層的一個節點上。

為了更好的和前饋神經網路做比較,我將這些以矩陣排列的節點展成了向量。 下圖展示了被紅色方框所圈中編號為0,1,4,5的節點是如何通過w_1,w_2,w_3,w_4連接到下一層的節點0上的。

這個帶有連接強弱的紅色方框就叫做 filterkernelfeature detector。 而filter的範圍叫做filter size,這裡所展示的是2x2的filter size。

left[ egin{matrix} w_1w_2\ w_3w_4\ end{matrix} 
ight] (1)

第二層的節點0的數值就是局部區域的線性組合,即被圈中節點的數值乘以對應的權重後相加。 用x表示輸入值,y表示輸出值,用圖中標註數字表示角標,則下面列出了兩種計算編號為0的輸出值y_0的表達式。

註:在局部區域的線性組合後,也會和前饋神經網路一樣,加上一個偏移量b_0

egin{split} y_0 = x_0*w_1 + x_1*w_2+ x_4*w_3+ x_5*w_4+b_0\y_0 = left[ egin{matrix} w_1w_2 w_3w_4 end{matrix} 
ight] cdot left[ egin{matrix} x_0\ x_1\ x_4\ x_5\ end{matrix} 
ight]+b_0 end{split} (2)

空間共享

當filter掃到其他位置計算輸出節點y_i 時,w_1,w_2,w_3,w_4包括b_0是共用的。

下面這張動態圖展示了當filter掃過不同區域時,節點的鏈接方式。 動態圖的最後一幀則顯示了所有連接。 可以注意到,每個輸出節點並非像前饋神經網路中那樣與全部的輸入節點連接,而是部分連接。 這也就是為什麼大家也叫前饋神經網路(feedforward neural network)為fully-connected neural network。 圖中顯示的是一步一步的移動filter來掃描全圖,一次移動多少叫做stride。

空間共享也就是卷積神經網路所引入的先驗知識。

輸出表達

如先前在圖像表達中提到的,圖片不用向量去表示是為了保留圖片平面結構的信息。 同樣的,卷積後的輸出若用上圖的排列方式則丟失了平面結構信息。 所以我們依然用矩陣的方式排列它們,就得到了下圖所展示的連接。

這也就是你們在網上所看到的下面這張圖。在看這張圖的時候請結合上圖的連接一起理解,即輸入(綠色)的每九個節點連接到輸出(粉紅色)的一個節點上的。

經過一個feature detector計算後得到的粉紅色區域也叫做一個「Convolved Feature」 或 「Activation Map」 或 「Feature Map」。

Depth維的處理

現在我們已經知道了depth維度只有1的灰度圖是如何處理的。 但前文提過,圖片的普遍表達方式是下圖這樣有3個channels的RGB顏色模型。 當depth為複數的時候,每個feature detector是如何卷積的?

現象:2x2所表達的filter size中,一個2表示width維上的局部連接數,另一個2表示height維上的局部連接數,並卻沒有depth維上的局部連接數,是因為depth維上並非局部,而是全部連接的。

在2D卷積中,filter在張量的width維, height維上是局部連接,在depth維上是貫串全部channels的。

類比:想像在切蛋糕的時候,不管這個蛋糕有多少層,通常大家都會一刀切到底,但是在長和寬這兩個維上是局部切割。

下面這張圖展示了,在depth為複數時,filter是如何連接輸入節點到輸出節點的。 圖中紅、綠、藍顏色的節點表示3個channels。 黃色節點表示一個feature detector卷積後得到的Feature Map。 其中被透明黑框圈中的12個節點會被連接到黃黑色的節點上。

  • 在輸入depth為1時:被filter size為2x2所圈中的4個輸入節點連接到1個輸出節點上。
  • 在輸入depth為3時:被filter size為2x2,但是貫串3個channels後,所圈中的12個輸入節點連接到1個輸出節點上。
  • 在輸入depth為n時:2x2xn個輸入節點連接到1個輸出節點上。

(可從vectary在3D編輯下查看)

注意:三個channels的權重並不共享。 即當深度變為3後,權重也跟著擴增到了三組,如式子(3)所示,不同channels用的是自己的權重。 式子中增加的角標r,g,b分別表示red channel, green channel, blue channel的權重。

left[ egin{matrix} w_{r1}w_{r2}\ w_{r3}w_{r4}\ end{matrix} 
ight], left[ egin{matrix} w_{g1}w_{g2}\ w_{g3}w_{g4}\ end{matrix} 
ight], left[ egin{matrix} w_{b1}w_{b2}\ w_{b3}w_{b4}\ end{matrix} 
ight] (3)

計算例子:用x_{r0}表示red channel的編號為0的輸入節點,x_{g5}表示green channel編號為5個輸入節點。x_{b1}表示blue channel。如式子(4)所表達,這時的一個輸出節點實際上是12個輸入節點的線性組合。

egin{split} y_0 = x_{r0}*w_{r1} + x_{r1}*w_{r2}+ x_{r4}*w_{r3}+ x_{r5}*w_{r4}+ x_{g0}*w_{g1} + x_{g1}*w_{g2}+ x_{g4}*w_{g3}+ x_{g5}*w_{g4}+ x_{b0}*w_{b1} + x_{b1}*w_{b2}+ x_{b4}*w_{b3}+ x_{b5}*w_{b4}+b_0\y_0 = left[ egin{matrix} w_{r1}w_{r2} w_{r3}w_{r4} end{matrix} 
ight] cdot left[ egin{matrix} x_{r0}\ x_{r1}\ x_{r4}\ x_{r5}\ end{matrix} 
ight] +left[ egin{matrix} w_{g1}w_{g2} w_{g3}w_{g4} end{matrix} 
ight] cdot left[ egin{matrix} x_{g0}\ x_{g1}\ x_{g4}\ x_{g5}\ end{matrix} 
ight]+left[ egin{matrix} w_{b1}w_{b2} w_{b3}w_{b4} end{matrix} 
ight] cdot left[ egin{matrix} x_{b0}\ x_{b1}\ x_{b4}\ x_{b5}\ end{matrix} 
ight]+b_0end{split}(4)

當filter掃到其他位置計算輸出節點y_i時,那12個權重在不同位置是共用的,如下面的動態圖所展示。 透明黑框圈中的12個節點會連接到被白色邊框選中的黃色節點上。

每個filter會在width維, height維上,以局部連接和空間共享,並貫串整個depth維的方式得到一個Feature Map。

Zero padding

細心的讀者應該早就注意到了,4x4的圖片被2x2的filter卷積後變成了3x3的圖片,每次卷積後都會小一圈的話,經過若干層後豈不是變的越來越小? Zero padding就可以在這時幫助控制Feature Map的輸出尺寸,同時避免了邊緣信息被一步步捨棄的問題。

例如:下面4x4的圖片在邊緣Zero padding一圈後,再用3x3的filter卷積後,得到的Feature Map尺寸依然是4x4不變。

通常大家都想要在卷積時保持圖片的原始尺寸。 選擇3x3的filter和1的zero padding,或5x5的filter和2的zero padding可以保持圖片的原始尺寸。 這也是為什麼大家多選擇3x3和5x5的filter的原因。 另一個原因是3x3的filter考慮到了像素與其距離為1以內的所有其他像素的關係,而5x5則是考慮像素與其距離為2以內的所有其他像素的關係。

尺寸:Feature Map的尺寸等於(input_size + 2 * padding_size ? filter_size)/stride+1。

注意:上面的式子是計算width或height一維的。padding_size也表示的是單邊補零的個數。例如(4+2-3)/1+1 = 4,保持原尺寸。

不用去背這個式子。其中(input_size + 2 * padding_size)是經過Zero padding擴充後真正要卷積的尺寸。 減去 filter_size後表示可以滑動的範圍。 再除以可以一次滑動(stride)多少後得到滑動了多少次,也就意味著得到了多少個輸出節點。 再加上第一個不需要滑動也存在的輸出節點後就是最後的尺寸。

形狀、概念抓取

知道了每個filter在做什麼之後,我們再來思考這樣的一個filter會抓取到什麼樣的信息。

我們知道不同的形狀都可由細小的「零件」組合而成的。比如下圖中,用2x2的範圍所形成的16種形狀可以組合成格式各樣的「更大」形狀。

卷積的每個filter可以探測特定的形狀。又由於Feature Map保持了抓取後的空間結構。若將探測到細小圖形的Feature Map作為新的輸入再次卷積後,則可以由此探測到「更大」的形狀概念。 比如下圖的第一個「大」形狀可由2,3,4,5基礎形狀拼成。第二個可由2,4,5,6組成。第三個可由6,1組成。

除了基礎形狀之外,顏色、對比度等概念對畫面的識別結果也有影響。卷積層也會根據需要去探測特定的概念。

可以從下面這張圖中感受到不同數值的filters所卷積過後的Feature Map可以探測邊緣,稜角,模糊,突出等概念。

[from]

如我們先前所提,圖片被識別成什麼不僅僅取決於圖片本身,還取決於圖片是如何被觀察的。

而filter內的權重矩陣W是網路根據數據學習得到的,也就是說,我們讓神經網路自己學習以什麼樣的方式去觀察圖片。

拿老婦與少女的那幅圖片舉例,當標籤是少女時,卷積網路就會學習抓取可以成少女的形狀、概念。 當標籤是老婦時,卷積網路就會學習抓取可以成老婦的形狀、概念。

下圖展現了在人臉識別中經過層層的卷積後,所能夠探測的形狀、概念也變得越來越抽象和複雜。

卷積神經網路會儘可能尋找最能解釋訓練數據的抓取方式。

多filters

每個filter可以抓取探測特定的形狀的存在。 假如我們要探測下圖的長方框形狀時,可以用4個filters去探測4個基礎「零件」。

因此我們自然而然的會選擇用多個不同的filters對同一個圖片進行多次抓取。 如下圖(動態圖過大,如果顯示不出,請看到該鏈接觀看),同一個圖片,經過兩個(紅色、綠色)不同的filters掃描過後可得到不同特點的Feature Maps。 每增加一個filter,就意味著你想讓網路多抓取一個特徵。

[from]

這樣卷積層的輸出也不再是depth為1的一個平面,而是和輸入一樣是depth為複數的長方體。

如下圖所示,當我們增加一個filter(紫色表示)後,就又可以得到一個Feature Map。 將不同filters所卷積得到的Feature Maps按順序堆疊後,就得到了一個卷積層的最終輸出。

卷積層的輸入是長方體,輸出也是長方體。

這樣卷積後輸出的長方體可以作為新的輸入送入另一個卷積層中處理。

加入非線性

和前饋神經網路一樣,經過線性組合和偏移後,會加入非線性增強模型的擬合能力。

將卷積所得的Feature Map經過ReLU變換(elementwise)後所得到的output就如下圖所展示。

[from]

輸出長方體

現在我們知道了一個卷積層的輸出也是一個長方體。 那麼這個輸出長方體的(width, height, depth)由哪些因素決定和控制。

這裡直接用CS231n的Summary:

計算例子:請體會CS231n的Convolution Demo部分的演示。

矩陣乘法執行卷積

如果按常規以掃描的方式一步步計算局部節點和filter的權重的點乘,則不能高效的利用GPU的並行能力。 所以更普遍的方法是用兩個大矩陣的乘法來一次性囊括所有計算。

因為卷積層的每個輸出節點都是由若干個輸入節點的線性組合所計算。 因為輸出的節點個數是W_2 	imes H_2	imes D_2,所以就有W_2 	imes H_2	imes D_2個線性組合。

讀過我寫的線性代數教程的讀者請回憶,矩陣乘矩陣的意義可以理解為批量的線性組合按順序排列。 其中一個矩陣所表示的信息是多組權重,另一個矩陣所表示的信息是需要進行組合的向量。 大家習慣性的把組成成分放在矩陣乘法的右邊,而把權重放在矩陣乘法的左邊。 所以這個大型矩陣乘法可以用W_{row}cdot X_{col}表示,其中W_{row}X_{col}都是矩陣。

卷積的每個輸出是由局部的輸入節點和對應的filter權重展成向量後所計算的,如式子(2)。 那麼W_{row}中的每一行則是每個filter的權重,有Fcdot F cdot D_1個; 而X_{col}的每一列是所有需要進行組合的節點(上面的動態圖中被黑色透明框圈中的節點),也有Fcdot F cdot D_1個。 X_{col}的列的個數則表示每個filter要滑動多少次才可以把整個圖片掃描完,有W_2cdot H_2次。 因為我們有多個filters,W_{row}的行的個數則是filter的個數K

最後我們得到:

W_{row} in R^{K 	imes Fcdot F cdot D_1}

X_{col} in R^{Fcdot F cdot D_1 	imes W_2cdot H_2}

W_{row}cdot X_{col} in R^{K 	imes W_2cdot H_2}

當然矩陣乘法後需要將W_{row}cdot X_{col}整理成形狀為W_2 	imes H_2	imes D_2的三維張量以供後續處理(如再送入另一個卷積層)。 X_{col}則也需要逐步的局部滑動圖片,最後堆疊構成用於計算矩陣乘法的形式。

Max pooling

在卷積後還會有一個pooling的操作,儘管有其他的比如average pooling等,這裡只提max pooling。

max pooling的操作如下圖所示:整個圖片被不重疊的分割成若干個同樣大小的小塊(pooling size)。每個小塊內只取最大的數字,再捨棄其他節點後,保持原有的平面結構得出output。

[from]

max pooling在不同的depth上是分開執行的,且不需要參數控制。 那麼問題就max pooling有什麼作用?部分信息被捨棄後難道沒有影響嗎?

[from]

Max pooling的主要功能是downsampling,卻不會損壞識別結果。 這意味著卷積後的Feature Map中有對於識別物體不必要的冗餘信息。 那麼我們就反過來思考,這些「冗餘」信息是如何產生的。

直覺上,我們為了探測到某個特定形狀的存在,用一個filter對整個圖片進行逐步掃描。但只有出現了該特定形狀的區域所卷積獲得的輸出才是真正有用的,用該filter卷積其他區域得出的數值就可能對該形狀是否存在的判定影響較小。 比如下圖中,我們還是考慮探測「橫折」這個形狀。 卷積後得到3x3的Feature Map中,真正有用的就是數字為3的那個節點,其餘數值對於這個任務而言都是無關的。 所以用3x3的Max pooling後,並沒有對「橫折」的探測產生影響。 試想在這裡例子中如果不使用Max pooling,而讓網路自己去學習。 網路也會去學習與Max pooling近似效果的權重。因為是近似效果,增加了更多的parameters的代價,卻還不如直接進行Max pooling。

Max pooling還有類似「選擇句」的功能。假如有兩個節點,其中第一個節點會在某些輸入情況下最大,那麼網路就只在這個節點上流通信息;而另一些輸入又會讓第二個節點的值最大,那麼網路就轉而走這個節點的分支。

但是Max pooling也有不好的地方。因為並非所有的抓取都像上圖的極端例子。有些周邊信息對某個概念是否存在的判定也有影響。 並且Max pooling是對所有的Feature Maps進行等價的操作。就好比用相同網孔的漁網打魚,一定會有漏網之魚。

全連接層

當抓取到足以用來識別圖片的特徵後,接下來的就是如何進行分類。 全連接層(也叫前饋層)就可以用來將最後的輸出映射到線性可分的空間。 通常卷積網路的最後會將末端得到的長方體平攤(flatten)成一個長長的向量,並送入全連接層配合輸出層進行分類。

卷積神經網路大致就是covolutional layer, pooling layer, ReLu layer, fully-connected layer的組合,例如下圖所示的結構。

[from]

這裡也體現了深層神經網路或deep learning之所以稱deep的一個原因:模型將特徵抓取層和分類層合在了一起。 負責特徵抓取的卷積層主要是用來學習「如何觀察」。

下圖簡述了機器學習的發展,從最初的人工定義特徵再放入分類器的方法,到讓機器自己學習特徵,再到如今盡量減少人為干涉的deep learning。

[from]

結構發展

以上介紹了卷積神經網路的基本概念。 以下是幾個比較有名的卷積神經網路結構,詳細的請看CS231n。

  • LeNet:第一個成功的卷積神經網路應用
  • AlexNet:類似LeNet,但更深更大。使用了層疊的卷積層來抓取特徵(通常是一個卷積層馬上一個max pooling層)
  • ZF Net:增加了中間卷積層的尺寸,讓第一層的stride和filter size更小。
  • GoogLeNet:減少parameters數量,最後一層用max pooling層代替了全連接層,更重要的是Inception-v4模塊的使用。
  • VGGNet:只使用3x3 卷積層和2x2 pooling層從頭到尾堆疊。
  • ResNet:引入了跨層連接和batch normalization。
  • DenseNet:將跨層連接從頭進行到尾。

總結一下:這些結構的發展趨勢有:

  • 使用small filter size的卷積層和pooling
  • 去掉parameters過多的全連接層
  • Inception(稍後會對其中的細節進行說明)
  • 跳層連接

不變性的滿足

接下來會談談我個人的,對於畫面不變性是如何被卷積神經網路滿足的想法。 同時結合不變性,對上面提到的結構發展的重要變動進行直覺上的解讀。

需要明白的是為什麼加入不變性可以提高網路表現。 並不是因為我們用了更炫酷的處理方式,而是加入了先驗知識,無需從零開始用數據學習,節省了訓練所需數據量。 思考表現提高的原因一定要從訓練所需要的數據量切入。 提出滿足新的不變性特點的神經網路是計算機視覺的一個主要研究方向。

平移不變性

可以說卷積神經網路最初引入局部連接和空間共享,就是為了滿足平移不變性。

因為空間共享,在不同位置的同一形狀就可以被等價識別,所以不需要對每個位置都進行學習。

旋轉和視角不變性

個人覺得卷積神經網路克服這一不變性的主要手段還是靠大量的數據。 並沒有明確加入「旋轉和視角不變性」的先驗特性。

Deformable Convolutional Networks似乎是對此變性進行了進行增強。

尺寸不變性

與平移不變性不同,最初的卷積網路並沒有明確照顧尺寸不變性這一特點。

我們知道filter的size是事先選擇的,而不同的尺寸所尋找的形狀(概念)範圍不同。

從直觀上思考,如果選擇小範圍,再一步步通過組合,仍然是可以得到大範圍的形狀。 如3x3尺寸的形狀都是可以由2x2形狀的圖形組合而成。所以形狀的尺寸不變性對卷積神經網路而言並不算問題。 這恐怕ZF Net讓第一層的stride和filter size更小,VGGNet將所有filter size都設置成3x3仍可以得到優秀結果的一個原因。

但是,除了形狀之外,很多概念的抓取通常需要考慮一個像素與周邊更多像素之間的關係後得出。 也就是說5x5的filter也是有它的優點。 同時,小尺寸的堆疊需要很多個filters來共同完成,如果需要抓取的形狀恰巧在5x5的範圍,那麼5x5會比3x3來的更有效率。 所以一次性使用多個不同filter size來抓取多個範圍不同的概念是一種順理成章的想法,而這個也就是Inception。 可以說Inception是為了尺寸不變性而引入的一個先驗知識。

Inception

下圖是Inception的結構,儘管也有不同的版本,但是其動機都是一樣的:消除尺寸對於識別結果的影響,一次性使用多個不同filter size來抓取多個範圍不同的概念,並讓網路自己選擇需要的特徵。

你也一定注意到了藍色的1x1卷積,撇開它,先看左邊的這個結構。

輸入(可以是被卷積完的長方體輸出作為該層的輸入)進來後,通常我們可以選擇直接使用像素信息(1x1卷積)傳遞到下一層,可以選擇3x3卷積,可以選擇5x5卷積,還可以選擇max pooling的方式downsample剛被卷積後的feature maps。 但在實際的網路設計中,究竟該如何選擇需要大量的實驗和經驗的。 Inception就不用我們來選擇,而是將4個選項給神經網路,讓網路自己去選擇最合適的解決方案。

接下來我們再看右邊的這個結構,多了很多藍色的1x1卷積。 這些1x1卷積的作用是為了讓網路根據需要能夠更靈活的控制數據的depth的。

1x1卷積核

如果卷積的輸出輸入都只是一個平面,那麼1x1卷積核並沒有什麼意義,它是完全不考慮像素與周邊其他像素關係。 但卷積的輸出輸入是長方體,所以1x1卷積實際上是對每個像素點,在不同的channels上進行線性組合(信息整合),且保留了圖片的原有平面結構,調控depth,從而完成升維或降維的功能。

如下圖所示,如果選擇2個filters的1x1卷積層,那麼數據就從原本的depth 3 降到了2。若用4個filters,則起到了升維的作用。

這就是為什麼上面Inception的4個選擇中都混合一個1x1卷積,如右側所展示的那樣。 其中,綠色的1x1卷積本身就1x1卷積,所以不需要再用另一個1x1卷積。 而max pooling用來去掉卷積得到的Feature Map中的冗餘信息,所以出現在1x1卷積之前,緊隨剛被卷積後的feature maps。(由於沒做過實驗,不清楚調換順序會有什麼影響。)

跳層連接

前饋神經網路也好,卷積神經網路也好,都是一層一層逐步變換的,不允許跳層組合。 但現實中是否有跳層組合的現象?

比如說我們在判斷一個人的時候,很多時候我們並不是觀察它的全部,或者給你的圖片本身就是殘缺的。 這時我們會靠單個五官,外加這個人的著裝,再加他的身形來綜合判斷這個人,如下圖所示。 這樣,即便圖片本身是殘缺的也可以很好的判斷它是什麼。 這和前饋神經網路的先驗知識不同,它允許不同層級之間的因素進行信息交互、綜合判斷。

殘差網路就是擁有這種特點的神經網路。大家喜歡用identity mappings去解釋為什麼殘差網路更優秀。 這裡我只是提供了一個以先驗知識的角度去理解的方式。 需要注意的是每一層並不會像我這裡所展示的那樣,會形成明確的五官層。 只是有這樣的組合趨勢,實際無法保證神經網路到底學到了什麼內容。

用下圖舉一個更易思考的例子。 圖形1,2,3,4,5,6是第一層卷積層抓取到的概念。 圖形7,8,9是第二層卷積層抓取到的概念。 圖形7,8,9是由1,2,3,4,5,6的基礎上組合而成的。

但當我們想要探測的圖形10並不是單純的靠圖形7,8,9組成,而是第一個卷積層的圖形6和第二個卷積層的8,9組成的話,不允許跨層連接的卷積網路不得不用更多的filter來保持第一層已經抓取到的圖形信息。並且每次傳遞到下一層都需要學習那個用於保留前一層圖形概念的filter的權重。 當層數變深後,會越來越難以保持,還需要max pooling將冗餘信息去掉。

一個合理的做法就是直接將上一層所抓取的概念也跳層傳遞給下下一層,不用讓其每次都重新學習。 就好比在編程時構建了不同規模的functions。 每個function我們都是保留,而不是重新再寫一遍。提高了重用性。

同時,因為ResNet使用了跳層連接的方式。也不需要max pooling對保留低層信息時所產生的冗餘信息進行去除。

Inception中的第一個1x1的卷積通道也有類似的作用,但是1x1的卷積仍有權重需要學習。 並且Inception所使用的結合方式是concatenate的合併成一個更大的向量的方式,而ResNet的結合方式是sum。 兩個結合方式各有優點。 concatenate當需要用不同的維度去組合成新觀念的時候更有益。 而sum則更適用於並存的判斷。比如既有油頭髮,又有胖身軀,同時穿著常年不洗的牛仔褲,三個不同層面的概念並存時,該人會被判定為程序員的情況。 又比如雙向LSTM中正向和逆向序列抓取的結合常用相加的方式結合。在語音識別中,這表示既可以正向抓取某種特徵,又可以反向抓取另一種特徵。當兩種特徵同時存在時才會被識別成某個特定聲音。

在下圖的ResNet中,前一層的輸入會跳過部分卷積層,將底層信息傳遞到高層。

在下圖的DenseNet中,底層信息會被傳遞到所有的後續高層。

後續

隨著時間推移,各個ResNet,GoogLeNet等框架也都在原有的基礎上進行了發展和改進。 但基本都是上文描述的概念的組合使用加上其他的tricks。

如下圖所展示的,加入跳層連接的Inception-ResNet。

但對我而言,

真正重要的是這些技巧對於各種不變性的滿足。

深度學習通俗易懂教程專欄超智能體 - 知乎專欄

閱讀列表:

  1. 深層神經網路:深層學習為何要「Deep」(上)(由於下篇寫的並不通俗,不推薦閱讀,用公開課代替)
  2. 反向傳播演算法實例:未編寫
  3. 深度學習總覽:公開課:深層神經網路設計理念
  4. 深度學習入門誤區:知乎Live(公開課涵蓋了Live的內容,若覺得作者辛苦也可參加。算了,還是不要參加了!)
  5. Tensorflow :TensorFlow整體把握
  6. 前饋神經網路(1):前饋神經網路--代碼LV1
  7. 前饋神經網路(2):前饋神經網路--代碼LV2
  8. 前饋神經網路(3):前饋神經網路--代碼LV3
  9. 循環神經網路(1):循環神經網路--介紹
  10. 循環神經網路(2):循環神經網路--實現LSTM
  11. 循環神經網路(3):循環神經網路--scan實現LSTM
  12. 循環神經網路(4):循環神經網路--雙向GRU
  13. 卷積神經網路(1):卷積神經網路--介紹

po一組我的博客, 從全連接網路開始, 到CNN, 詳細介紹了每種模型的原理, 所有模型均使用Python/Numpy實現, 不需要任何深度學習框架。

歡迎關注轉發。

CNN卷積網路的Python實現(一):FCN全連接網路 - Nick"s Tech Blog

CNN卷積網路的Python實現(二):Regularization正則化實現 - Nick"s Tech Blog

CNN卷積網路的Python實現(三):卷積網路實現 - Nick"s Tech Blog

CNN卷積網路的Python實現(四):池化和BN層的實現 - Nick"s Tech Blog

CNN卷積網路的Python實現(五):卷積網路實現 - Nick"s Tech Blog

附贈一篇RNN/LSTM哦~~

RNN, LSTM與ImageCaptioning原理及Python實現


卷積神經網路(Convolutional Neural Network,CNN)新手指南

引言

卷積神經網路:聽起來像是生物與數學還有少量計算機科學的奇怪結合,但是這些網路在計算機視覺領域已經造就了一些最有影響力的創新。2012年神經網路開始嶄露頭角,那一年Alex Krizhevskyj在ImageNet競賽上(ImageNet可以算是競賽計算機視覺領域一年一度的「奧運會」競賽)將分類錯誤記錄從26%降低到15%,這在當時是一個相當驚人的進步。從那時起許多公司開始將深度學習應用在他們的核心服務上,如Facebook將神經網路應用到他們的自動標註演算法中,Google(谷歌)將其應用到圖片搜索里,Amazon(亞馬遜)將其應用到產品推薦服務,Pinterest將其應用到主頁個性化信息流中,Instagram也將深度學習應用到它們的圖像搜索架構中。

然而最經典的,或者說最流行的神經網路使用範例是將其用於圖像處理領域。提到圖像處理,本文主要介紹的是如何使用卷積神經網路來進行圖像分類。

更多人工智慧:知乎專欄--硬創公開課

-------------------------------------------------------------------------------------------

問題空間

圖像分類是將輸入圖像(貓、狗等)進行分類輸出或者將其分類成最能描述圖像特徵的類別的任務。對於人類來說,認知是我們出生之後就學會的第一個技能,也是作為成年人來說非常自然和輕鬆的技能。我們可以毫不猶豫迅速識別出我們周圍的環境以及物體,當我們看到一張圖片或者觀察周遭環境時,大部分時間我們都能馬上對場景做出判斷並且給每個物體都打上標識,這些甚至都不需要刻意去觀察。這些技能能夠迅速識別其模式,從我們以前的經驗中做出推論,然後將其運用至不同的圖片或者環境中——這些都是我們與機器不同的地方。

輸入與輸出

當計算機看到一張圖片時(即輸入一張圖片),它所看到的是一系列的像素值。根據圖片的解析度與大小,計算機將看到的是一個32×32×3的數字陣列(3指代的是RGB—顏色值)。我們稍微將一下這個,假設我們有一張480 x 480的JPG格式圖片,它的表達陣列即為480 x 480 x 3。這些數字中的每一個值都可以從0取到255,它描述了在這一點上的像素強度。這些數字雖然對於我們進行圖像分類時沒有任何意義,但其卻是計算機在圖像輸入時唯一獲取的數據。這個理念就是你給電腦指定相關數據排列,它將圖像是一個特定的類別的可能性進行輸出(如80—貓,15—狗,05—鳥等)。

我們希望電腦做什麼

現在我們了解到問題是在輸入和輸出上,讓我們來考慮如何解決這個問題。我們希望電腦能做到的是在所有的給定圖像中分辨出不同的類別,它能找到那些「狗之所以是狗」或者「貓之所以是貓」的特性。這個就是在我們的頭腦中潛意識裡進行認知識別的過程,當我們看到一張狗的圖像時,我們能夠將其分類因為圖像上有爪子或者四條腿等明顯的特徵。以類似的方式計算機能夠進行圖像分類任務,通過尋找低層次的特徵如邊緣和曲線,然後運用一系列的卷積層建立一個更抽象的概念。這是卷積神經網路應用的一個總體概述,接下來我們來探討下細節。

生物聯繫

首先要稍微普及下一點背景知識,當你第一次聽到卷積神經網路這個詞時,你也許會想這是是不與神經科學或者生物學有關?恭喜你,猜對了一部分。卷積神經網路的確從生物學上的視覺皮層得到啟發,視覺皮層有微小區域的細胞對於特定區域的視野是十分敏感的。

1962年,Hubel和 Wiesel發現大腦中的部分神經元只對一定的方向的邊緣做出回應。例如,當暴露在垂直邊緣或者一些當水平或對角線邊緣時,一些神經元才會做出回應。Hubel和 Wiesel發現,所有這些神經元都被架構在一個柱狀結構中,這樣的架構使它們能夠產生視覺感知。系統中的特定成員可以完成特定任務這種理念(神經細胞在視覺皮層中尋找特定的特徵)也能很好地應用在機器學習上,這也是卷積神經網路的基礎。

架構

對於捲曲神經網路更詳細的介紹是將圖片通過一系列的卷積、非線性、池(採樣)、全連接層,然後得到一個輸出。正如我們前面所說的,輸出是一個類或者一個圖像類別的可能性概率。現在,困難的部分是了解每一層的任務。

第一層—數學

卷積神經網路的第一層是卷積層,第一件事是你要記住捲曲層的輸入時什麼。像我們之前提到的,輸入的是一個32×32×3的系列像素值。解釋卷積層的最好方式是想像一個手電筒正在圖像的左上方進行照射,假設手電筒照射的區域是5 x 5的範圍。再想像下這個手電筒在輸入圖像的各個區域進行滑動。在機器學習術語中,這個手電筒叫做過濾器(有時候也稱為神經元或者核心),它照射著的區域被稱為接受場。這個過濾器也是一系列的數據(這些數據被稱為權重或者參數)。必須提到的是這個過濾器的深度必須是和輸入的深度相同(這樣才能保證數學正常工作),所以這個過濾器的尺寸是5×5×3。現在,讓我們先拿第一個位置的過濾器為例。由於過濾器在輸入圖像上是滑動或卷積的,它是相乘的值在濾波器的原始圖像的像素值(又名計算元素的乘法),這些乘法全部相加(從數學上講,這將是75次乘法總和)。所以現在你有一個數字。請記住,這個數字只是當過濾器在圖像的左上角時才有代表性,現在我們在每一個位置上重複這個過程。(下一步將過濾器移動到右邊的1個單位,然後再向右移動1個單位,等等),每一個輸入層上獨特的位置都會產生一個數字。將過濾器滑動完所有位置的,你會發現剩下的是一個28×28×1的系列數字,我們稱之為激活圖或者特徵圖。你得到一個28×28陣列的原因是有784個不同的位置,一個5×5的過濾器可以適配一個32×32的輸入圖像,這組784個數字可以被映射到一個28×28陣列。

目前我們使用兩個5 x 5 x 3的過濾器,我們的輸出量將是28×28×2。通過使用更多的過濾器,我們能夠更好地維持空間尺寸。在數學層面上來說,這些是在一個卷積層中進行的任務。

第一層—高階視角

讓我們從高階角度來談談這個卷積層的任務,這些過濾器中每個都可以被認為是特徵標識符。當我說特徵時,我說的是如直邊、簡單的顏色和曲線等。思考一下,所有的圖像都有同樣的最簡單的特徵。我們的第一個過濾器是7×7×3,而且是一個曲線探測器。(在這一部分讓我們忽略一個事實,過濾器是3個單位深的,只考慮頂部過濾器的深度和圖像。)作為一個曲線檢測器,過濾器將有一個更高的數值且有曲線的形狀的像素結構(記住關於這些過濾器,我們考慮的只是數字)。

現在,讓我們回到數學可視化部分。當我們在輸入的左上角有了這種濾波器後,它會在哪個區域的過濾器和像素值之間計算乘積。現在讓我們以一個我們要分類的圖像為例,把我們的過濾器放在左上角。

記住,我們需要做的是使用圖像中的原始像素值在過濾器中進行乘積。

基本上在輸入圖像中,如果有一個形狀是類似於這種濾波器的代表曲線,那麼所有的乘積累加在一起會導致較大的值!現在讓我們看看當我們移動我們的過濾器時會發生什麼。

檢測值竟然要低得多!這是因為在圖像中沒有任何部分響應曲線檢測過濾器。記住,這個卷積層的輸出是一個激活圖。因此,在簡單的情況下一個過濾器的卷積(如果該過濾器是一個曲線檢測器),激活圖將顯示其中大部分可能是在圖片中的曲線區域。在這個例子中,我們的28×28×1激活圖左上方的值將是6600,這種高值意味著很可能是在輸入中有某種曲線導致了過濾器的激活。因為沒有任何東西在輸入使過濾器激活(或更簡單地說,在該地區的原始圖像沒有一個曲線),其在我們的激活圖右上方的值將是0。記住,這僅僅只是一個過濾器。這個過濾器將檢測線向外和右邊的曲線,我們可以有其他的曲線向左或直接到邊緣的過濾器線條。過濾器越多,激活圖越深,我們從於輸入中獲取的信息也就越多。

聲明:在這一節中描述的過濾器是簡化的,其主要目的是描述在一個卷積過程中的數學過程。在下圖中你會看到一些對訓練過的網路中第一個卷積層的過濾器的實際顯示示例,儘管如此,主要的論據仍然是相同的。

進一步深入網路

現在展示一個傳統的卷積神經網路結構,還有其他層在這些層之間穿插轉換。強烈建議那些有興趣的讀者去了解他們的功能和作用,但一般來說他們提供的非線性和尺寸留存有助於提高網路的魯棒性,同時還能控制過度擬合。一個經典的卷積神經網路架構看起來是這樣的:

然而,最後一層是非常重要的內容,不過我們將在後面提到。讓我們退後一步,回顧一下我們目前提到的東西。我們談到了第一個卷積層的過濾器被設計用來探測。他們檢測到低階的特徵如邊緣和曲線。正如想像的那樣,為了預測圖像的類型,我們需要神經網路能夠識別更高階的特徵,如手、爪子、耳朵。讓我們考慮經過第一層卷積層後網路的輸出是什麼,這將是一個28×28×3的體量(假設我們使用三個5×5×3過濾器)。當穿過另一個卷積層時,卷積層的第一輸出成為第二卷積層的輸入,這有難以視覺化想像。當我們談論第一層時,輸入的只是原始圖像。然而,當我們談論第二個卷積層時,輸入是第一層的結果激活圖(S)。因此,每一層的輸入基本上是描述某些低階特徵在原始圖像中的位置。現在當你應用一組過濾器(通過第二卷積層),輸出將被激活且代表更高階的特徵。這些特徵的類型可能是半圓(曲線和直線邊緣的組合)或方形(幾個直邊的組合)。當通過網路、更多的卷積層,可以激活地圖,代表更多和更複雜的特徵。在神經網路的結束,可能有一些激活的過濾器,表示其在圖像中看到手寫字跡或者粉紅色的物體時等等。另一個有趣的事情是當你在網路往更深的地方探索時,過濾器開始有越來越大的接受場,這意味著他們能夠從一個更大的區域或者更多的原始輸入量接收信息。

全連接層

現在我們可以檢測到這些高階特徵,錦上添花的是在神經網路的末端連接一個全連接層。這層基本上將一個輸入量(無論輸出是卷積或ReLU或池層)和輸出一個N是程序選擇類別的N維向量,具體過程如下圖所示。這個全連接層的工作方式是,它著眼於前一層的輸出(代表高階特徵的激活圖),並確定哪些功能是最相關特定的類。例如如果該程序預測,一些圖像是一隻狗,它在激活圖中會有高的值,代表高階特徵如一個爪子或4條腿等。類似地,如果該程序是預測一些圖像是鳥的功能,它在激活圖中會有高階值,代表高階特徵如如翅膀或喙等。

訓練過程

訓練工程作為神經網路的一個部分,我之前故意沒有提到,因為它有可能是最重要的一部分。閱讀時你可能會遇到有很多問題,例如第一個卷積層中過濾器如何知道尋找邊緣和曲線?全連接層如何知道激活圖在哪裡?每一層的過濾器如何知道有什麼樣的值?計算機能夠調整其過濾值(或權重)的方式是通過一個稱為反向傳播的訓練過程。

在我們介紹反向傳播之前,我們必須先回顧下談談神經網路運行所需要的是什麼。在我們出生的那一刻,我們的思想是全新的,我們不知道什麼是貓,什麼是鳥。類似地,在卷積神經網路開始之前,權重或過濾器的值是隨機的,過濾器並不知道去尋找邊緣和曲線,在更高階的層過濾器不知道去尋找爪子和喙。然而當我們稍微大了一點之後,我們的父母和老師給我們展示了不同的圖片和圖像,並給了我們一個相應的標籤。給圖像以標籤這個想法既是卷積神經網路(CNNs)的訓練過程。在講到它之前,讓我們稍微介紹下我們有一個訓練集,其中有成千上萬的狗,貓和鳥類的圖像,每一個圖像有一個標籤對應它是什麼動物的圖片。

反向傳播可以分為4個不同的部分:前向傳播、損失計算、反向傳播、權重更新。在前向傳播的過程中,你需要一個數字陣列為32×32×3的訓練圖像,並將其傳遞通過整個網路。在我們的第一個訓練例子中,所有的權重或過濾器的值被隨機初始化,輸出可能是類似[.1 .1 .1 .1 .1 .1 .1 .1 .1 .1]的東西,基本上是一個不能優先考慮任何數字的輸出。目前權重的網路是無法尋找那些低階的功能,因此也無法對分類可能性作出任何合理的結論。這就到了反向傳播中的損失計算部分。我們現在使用的是訓練數據,此數據有一個圖像和一個標籤。比方說,第一個輸入的訓練圖像是一個3,則該圖像的標籤將是[ 0 0 1 0 0 0 0 0 ]。損失計算可以按許多不同的方式定義,但常見的是MSE(均方差)—?倍(實際預測)的平方。

假設變數L等於這個值,正如你想像的,對於第一組訓練圖像來說損失將是非常高的。現在,讓我們更直觀地來進行思考。我們想得到一個點的預測標籤(ConvNet的輸出)作為訓練相同的訓練標籤(這意味著我們的網路預測正確)。為了實現則這個,我們要盡量減少我損失量。可視化在微積分上只是一個優化問題,我們需要找出哪些輸入是(在我們的例子中的權重)最直接導致網路的損失(或錯誤)所在。

這是一個dL/DW的數學等價,其中W是在一個特定層的權重。現在我們要做的通過網路是執行一個反向傳播過程,檢測哪個權重損失最大並且尋找方法來調整它們使損失降低。一旦我們將這個計算過程進行完,就可以到最後一步—權重更新。把所有的過濾器的權重進行更新,使它們在梯度方向上進行改變。

學習速率是由程序員選擇的一個參數。一個高的學習率意味著更多步驟是在權重更新部分,因此它可能需要更少的時間為最佳的權重在模型上進行收斂。然而學習率太高,可能會導致跨越太大而不夠精準達到最佳點。

前向傳播、損失計算、反向傳播、參數更新的過程也稱為一個epoch。程序會對於每一個固定數量的epoch、每個訓練圖像重複這一過程。在最後一個訓練例子中完成了參數更新後,網路應該都訓練的足夠好了,各層的權重也應該調參正確了。

測試

最後要來測試我們的卷積神經網路是否工作,將不同的圖片和標籤集通過卷積神經網路,將輸出結果與真實值進行對比,即可測試出其是否正常運行。

業界如何使用卷積神經網路

數據,數據,數據。給一個卷積神經網路的更多的訓練數據,可以做的更多的訓練迭代,也就能實現更多的權重更新,對神經網路進行更好的調參。Facebook(還有Instagram)可以使用數以億計的用戶目前的所有照片,Pinterest可以使用在其網站上的500億的信息,谷歌可以使用搜索數據,亞馬遜可以使用每天數以百萬計的產品購買數據。

現在你知道他們是如何使用這些的魔法了,有興趣的話可以自己嘗試一下。

PS : 本文由雷鋒網獨家編譯,未經許可拒絕轉載!

via Adit Deshpande

雷鋒網原創文章,未經授權禁止轉載。詳情見轉載須知。


Convolution Neural Networks卷積神經網路

卷積神經網路是人工神經網路的一種,已成為當前語音分析和圖像識別領域的研究熱點。它的權值共享網路結構使之更類似於生物神經網路,降低了網路模型的複雜度,減少了權值的數量。該優點在網路的輸入是多維圖像時表現的更為明顯,使圖像可以直接作為網路的輸入,避免了傳統識別演算法中複雜的特徵提取和數據重建過程。卷積網路是為識別二維形狀而特殊設計的一個多層感知器,這種網路結構對平移、比例縮放、傾斜或者共他形式的變形具有高度不變性。

2.2.1 網路結構

卷積神經網路是一個多層的神經網路,其基本運算單元包括:卷積運算、池化運算、全連接運算和識別運算。

圖4 卷積神經網路結構

l 卷積運算:前一層的特徵圖與一個可學習的卷積核進行卷積運算,卷積的結果經過激活函數後的輸出形成這一層的神經元,從而構成該層特徵圖,也稱特徵提取層,每個神經元的輸入與前一層的局部感受野相連接,並提取該局部的特徵,一旦該局部特徵被提取,它與其它特徵之間的位置關係就被確定。

l 池化運算:它把輸入信號分割成不重疊的區域,對於每個區域通過池化(下採樣)運算來降低網路的空間解析度,比如最大值池化是選擇區域內的最大值,均值池化是計算區域內的平均值。通過該運算來消除信號的偏移和扭曲。

l 全連接運算:輸入信號經過多次卷積核池化運算後,輸出為多組信號,經過全連接運算,將多組信號依次組合為一組信號。

l 識別運算:上述運算過程為特徵學習運算,需在上述運算基礎上根據業務需求(分類或回歸問題)增加一層網路用於分類或回歸計算。

2.2.2 訓練過程

卷積網路在本質上是一種輸入到輸出的映射,它能夠學習大量的輸入與輸出之間的映射關係,而不需要任何輸入和輸出之間的精確的數學表達式,只要用已知的模式對卷積網路加以訓練,網路就具有輸入輸出對之間的映射能力。卷積網路執行的是有監督訓練,所以其樣本集是由形如:(輸入信號,標籤值)的向量對構成的。

2.2.3 典型改進

卷積神經網路因為其在各個領域中取得了好的效果,是近幾年來研究和應用最為廣泛的深度神經網路。比較有名的卷積神經網路模型主要包括1986年Lenet,2012年的Alexnet,2014年的GoogleNet,2014年的VGG,2015年的Deep Residual Learning。這些卷積神經網路的改進版本或者模型的深度,或者模型的組織結構有一定的差異,但是組成模型的機構構建是相同的,基本都包含了卷積運算、池化運算、全連接運算和識別運算。

2.2.4 模型優缺點

(1)優點:

(1)、權重共享策略減少了需要訓練的參數,相同的權重可以讓濾波器不受信號位置的影響來檢測信號的特性,使得訓練出來的模型的泛化能力更強;

(2)、池化運算可以降低網路的空間解析度,從而消除信號的微小偏移和扭曲,從而對輸入數據的平移不變性要求不高。

(2)缺點:

(1)、深度模型容易出現梯度消散問題。


推薦一個英文的文檔,名字叫:
A guide to convolution arithmetic for deep learning

此外,Li FeiFei的一個關於開放課程裡面,也有相關的介紹
CS231n Convolutional Neural Networks for Visual Recognition


CNN的入門可以參考今年斯坦福剛開的一門課,slides和一些資料可以從課程主頁下載到:
Stanford University CS231n: Convolutional Neural Networks for Visual Recognition


這篇博客不錯, 可以參考:
Pycon 2016 tensorflow 研討會總結 -- tensorflow 手把手入門 #第一講
還有第二講:
Pycon 2016 tensorflow 研討會總結 -- tensorflow 手把手入門, 用"人話"解釋CNN #第三講 CNN


這是高票答案翻譯的那篇文章的原作者博客,有些地方翻譯的不是太準確,可以中英文對照來看,現在已經出了第三部分了。

CS Undergrad at UCLA (#x27;19)


最高票答案很好啦,我補充一下。引入卷積操作,相比較於全連接操作的區別。

如果採用全連接:那麼會造成神經網路參數極為龐大。導致訓練困難。所以現在神經網路結構的設計開始慢慢嘗試丟棄全連接層,只要卷積,池化

如果採用卷積:CNN是有兩個關鍵點,那就是局部鏈接以及權重共享。這兩點可以大大減少參數的數量。題主不妨自己比較一下。當然,這兩個關鍵點也是有神經生物學原理支撐的。此外,CNN裡面有pooling(池化)操作。池化操作目的是為了減少神經元的數量。如果對圖像一直卷積卷積,不用池化,然後接全鏈接層,這樣會導致神經元個數極為龐大。

最後推薦關於CNN的資料。

有神經網路基礎:看UFLDL(百度搜一下就知道了),或者CS231n

沒有神經網路基礎:看Coursera上Andrew ng的機器學習第四,第五單元有關神經網路的內容。然後再看上面提及的資料。

如果只是想了解一下這個東西的話:簡單理解為一個機器學習演算法(黑盒子),不過這個演算法模擬人類神經元之間的信息傳遞,學習過程。


1. 卷積神經網路本身就是神經網路的一種 只不過權重採用了卷積核的形式。細說的話還有許多但對於cnn是什麼這個問題沒必要展開。
2. 建議先了解基本的線性回歸、logistic回歸後,然後閱讀UFLDL及學習CS231n。如果英文有壓力,可以搜搜中文博客的介紹。


看到很多回答都是從頭開始闡述CNN的,這裡推薦一篇文章,它假設讀者已經了解傳統的神經網路結構,並且講解了CNN與傳神經網路的區別:CS231n Convolutional Neural Networks for Visual Recognition。

如果讀者想了解傳統的神經網路,請參見下面的電子書:

Neural networks and deep learning


可以參考下面的文章,應該是簡單易懂吧~

Deep Learning: Convolutional Neural Networks


A Beginner#x27;s Guide To Understanding Convolutional Neural Networks


我最近在寫一系列關於CNN的基礎講解,大開腦洞來講解最基本的問題,有興趣可以關注我的文章或者專欄。哈哈哈


高票答案寫的真是太好了


學習了很多。。。。


有沒有高手講講如何針對需要設計一個演算法?或者如何設計一個學習方法。


推薦閱讀:

Yoshua Bengio為什麼能跟Hinton、LeCun相提並論??
寒武紀神經網路處理器效能如何 ?
word2vec算出的詞向量怎麼衡量好壞?
梯度下降法是萬能的模型訓練演算法嗎?
人腦有海量的神經元(參數),那麼人腦有沒有「過擬合」行為?

TAG:機器學習 | 神經網路 | 深度學習(Deep Learning) |