1. 程式人生 > >動圖形象理解深度學習卷積

動圖形象理解深度學習卷積

動圖形象理解深度學習卷積

 

https://www.toutiao.com/a6615770434111537667/

 

 

理解卷積神經網路CNN,特別是對第一次接觸卷積神經網路的人來說,經常會對諸如卷積核、濾波器、通道等概念和他們的堆疊架構感到困惑。然而卷積是強大且高度可擴充套件的概念,在本文中,我們將逐步分解卷積操作的原理,將他與標準的全連線網路聯絡起來,並且探索如何構建一個強大的視覺層次,使其成為高效能的影象特徵提取器。

 

二維卷積:操作

二維卷積是一個相當簡單的操作:從卷積核開始,這是一個小的權值矩陣。這個卷積核在 2 維輸入資料上「滑動」,對當前輸入的部分元素進行矩陣乘法,然後將結果匯為單個輸出畫素。

 

一個標準的卷積

 

卷積核重複這個過程知道遍歷了整張圖片,將一個二維矩陣轉換為另一個二維矩陣。輸出特徵實質上是在輸入資料相同位置上的加權和(權值是卷積核本身的值)。

輸入資料是否落入這個「大致相似區域」,直接決定了資料經過卷積核後的輸出。這意味著卷積核的尺寸直接決定了生成新的特徵時匯合了多少(或幾個)輸入特徵。

這與全連線層完全相反。在上面的例子中,我們的輸入特徵為 5*5=25,輸出資料為 3*3=9. 如果我們使用標準的全連線層,就會產生一個 25*9=225 個引數的權值矩陣,每個輸出都是所有輸入資料的加權求和。卷積操作允許我們只用 9 個引數來實現這個變換,每個輸出特性不用「檢視」每個輸入特徵,而是隻是「檢視」來自大致相同位置的輸入特徵。請注意這一點,因為這對我們後面的討論至關重要。

 

Padding 和 Strides

在我們繼續介紹卷積神經網路之前,介紹兩種卷積層中常用的技術:Padding 和 Strides

  • Padding:如果你看到上面的動畫,那麼會注意到在卷積核滑動的過程中,邊緣基本會被「裁剪」掉,將 5*5 特徵矩陣轉換為 3*3 的特徵矩陣。邊緣上的畫素永遠不在卷積核的中心,因為核心沒有任何東西可以擴充套件到邊緣之外。這並不理想,因為我們經常希望輸出的尺寸等於輸入。

 

 

一些 padding 操作

Padding 做了一些非常機智的辦法來解決這個問題:用額外的「假」畫素(通常值為 0, 因此經常使用的術語「零填充」)填充邊緣。這樣,在滑動時的卷積核可以允許原始邊緣畫素位於其中心,同時延伸到邊緣之外的假畫素,從而產生與輸入相同大小的輸出。

  • Striding:運行卷積層時,我們通常希望輸出的尺寸是比輸入更低。這在卷積神經網路中是常見的,在增加通道數量的同時空間尺寸減小。其中一種方法是使用池化層(例如,取每 2×2 網格的平均值/最大值將空間維度減半)。還有一種方法是使用 Striding:

 

 

一個步長為 2 的卷積操作

 

Stride 的想法是改變卷積核的移動步長跳過一些畫素。Stride 是 1 表示卷積核滑過每一個相距是 1 的畫素,是最基本的單步滑動,作為標準卷積模式。Stride 是 2 表示卷積核的移動步長是 2,跳過相鄰畫素,影象縮小為原來的 1/2。Stride 是 3 表示卷積核的移動步長是 3,跳過 2 個相鄰畫素,影象縮小為原來的 1/3。

多通道版本

當然,上圖僅涉及具有單個輸入通道的影象。實際上,大多數輸入影象都是 3 通道的,通道數只會增加你的網路深度。通常會將影象的通道視作一個整體,強調其整體的一面而不關注各自的差異。

 

大部分時候,我們都處理 RBG 的三通道影象 (Credit: Andre Mouton)

濾波器:卷積核的集合

這兩個術語之間有著本質的區別:僅在 1 通道的情況下,濾波器和核心這兩個術語等價,在一般情況下,它們是不同的。每個過濾器實際上是卷積核的集合,圖層的每個輸入通道都有一個卷積核,並且是唯一的。

卷積層中的每個濾波器都只輸出一個通道,他們是這樣實現的:

濾波器的每個卷積核在各自的輸入通道上「滑動」,產生各自的計算結果。一些核心可能比其他核心具有更大的權重,以便比某些核心更強調某些輸入通道(例如,濾波器的紅色通道卷積核可能比其他通道的卷積核有更大的權重,因此,對紅色通道特徵的反應要強於其他通道)。

然後將每個通道處理的結果匯在一起形成一個通道。濾波器的卷積核各自產生一個對應通道的輸出,最後整個濾波器產生一個總的輸出通道。

 

最後一個術語:偏置。偏置在這裡的作用是對每個輸出濾波器增加偏置項以便產生最終輸出通道。

 

其他數量濾波器的生成都和單濾波器相同:每個濾波器使用不同的卷積核集合和具有上述過程的標量偏差項來處理輸入資料,最終產生一個輸出通道。然後將它們連線在一起以產生總輸出,其中輸出通道的數量是過濾器的數量。在輸出資料送入另一個卷積層之前,通常還要應用非線性啟用函式。重複上述操作即可完成網路的搭建。

2 維卷積:直覺

卷積仍然是線性變換

即使有了卷積層的機制,仍然很難將它與標準的前饋網路聯絡起來,而且它仍然不能解釋為什麼卷積會擴充套件到影象資料處理領域,並且在這方面表現的很好。

假設我們有一個 4×4 的輸入,我們需要將其轉換成 2×2 的陣列。如果我們使用前饋網路,我們會先將 4×4 的輸入轉換成長度為 16 的向量,然後輸入一個擁有 16 個輸入和 4 個輸出的密集連線層。可以為這一層想象一個權值矩陣 W :

有 64 個引數

儘管卷積核運算一開始看起來很奇怪,但它仍然是一個線性變換,有一個等價的變換矩陣。如果我們將大小為 3 的核 K 應用於變換後的 4×4 輸入,來得到 2×2 的輸出,等價的變換矩陣將是:

有 9 個引數

(注意:雖然上面的矩陣是一個等價的變換矩陣,但實際操作通常是作為一個非常不同的矩陣乘法來實現的 [2])

卷積,作為一個整體,仍然是一個線性變換,但同時,這也是一種與眾不同的變換。一個有 64 個元素的矩陣,只有 9 個引數被重複使用。每個輸出節點只能看到特定輸入的數量(核內部的輸入)。與其他輸入沒有任何互動,因為權值被設定為 0。

將卷積操作看作是權值矩陣的先驗是很有用的。在這篇文章中,我預先定義了網路引數。例如,當你使用預先訓練的模型做影象分類時,前提是使用預先訓練的網路引數,作為密集連結層的一個特徵提取器。

從這層意義上說,有一個直覺就是為什麼兩個都很有效呢(與他們的替代者比較)。遷移學習的效率比隨機初始化高出多個數量級,因為你只需要優化最終全連線層的引數,這意味著您可以擁有出色的效能,每個類只有幾十個影象。

這裡,你不需要優化所有 64 個引數,因為我們將其中的大部分設定為 0(而且始終保持這個值),剩餘的轉化成共享引數,這將導致實際上只需要優化 9 個引數。這個效率很重要,當從 MNIST 的 784 個輸入轉換成實際的 224×224×3 個影象時,將會有 150000 個輸入。密集層檢視將輸入減半為 75000 個,這仍然需要 100 億個引數。相比而言,ResNet-50 總共只有 2 千 500 萬個引數。

所以,將一些引數固定為 0,邦定引數提高效率,但與遷移學習不同,在遷移學習中,我們知道先驗是不是好的,因為它依賴於大量的影象,我們如何知道這個的好壞呢?

答案就在特徵組合中,前面的引數是要學習的引數。

區域性性

在這片文章的開始,我們討論了以下問題:

  • 卷積核只從一個小的區域性區域組合畫素來形成輸出。也就是說,輸出特性只從一個小的區域性區域「看到」輸入特性。
  • 卷積核被應用於整個影象,以產生輸出矩陣。

所以隨著反向傳播從網路的分類節點一路過來,卷積核擁有一個有趣的任務,從區域性輸入中學習權值,生成特徵。此外,因為卷積核本身被應用於整個影象,卷積核學習的特徵必須足夠通用,可以來自於影象的任何部分。

如果這是任何其他種類的資料,例如,APP 安裝的分類資料,這將會是一場災難,因為你的應用程式安裝數量和應用型別是相鄰的,並不意味著它們有任何與應用安裝日期和使用時間一樣常見的「本地的、共享的特性」。當然,它們可能有一個可被發現的潛在高層次的特徵(例如。人們最需要的是哪些應用程式),但這並沒有給我們足夠的理由相信前兩個的引數和後兩個的引數完全相同。這四種可能是任意的(一致的)順序,並且仍然有效!

然而,畫素總是以一致的順序出現,而且附近的畫素互相影響。例如,如果某畫素附近所有畫素都是紅色的,那麼該畫素極有可能也是紅色的。如果有偏差,這是一個有趣的反常現象,可以轉化成一個特徵,所有這些偏差可以通過與周圍畫素的比較檢測出來。

這個想法實際上是很多早期的計算機視覺特徵提取方法的基礎。例如,對於邊緣檢測,你可以使用 Sobel 邊緣檢測濾波器,這是一個具有固定引數的核,運算過程和標準的單通道卷積一樣:

使用垂直邊緣檢測卷積核

對於沒有邊緣的陣列(例如天空背景),大部分畫素是一樣的值,所以卷積核在這些點輸出為 0。對於有垂直邊緣的陣列,邊緣左右兩側的畫素是不同的,卷積核的計算結果也是非零的,從而揭示邊緣。在檢測區域性範圍內異常時,卷積核一次只作用於 3 × 3 的陣列,但是當應用到整個影象時,也足以在全域性範圍內檢測到來自於在影象的任何位置的某個特定的特徵,!

所以我們在深度學習中所做的關鍵區別是問這個問題:有用的核能被學習嗎?對於以原始畫素為基礎的初始層,我們可以合理地期望具有相當低水平特徵的特徵檢測器,如邊、線等。

深度學習研究有一個專注於神經網路可解釋性的完整分支。這一分支最強大的工具之一是使用優化方法視覺化特徵 [3]。核心思想很簡單:優化影象(通常是使用隨機噪聲初始化)來啟用濾波器,使其儘可能強壯。這確實很直觀:如果經過優化的影象完全被邊緣填充,這就是過濾器本身所尋找並被啟用的強有力的證據。使用這個,我們可以窺視到學習的過濾器,結果是驚人的:

來自 GoogLeNet[3] 第一個卷積層的 3 個不同通道的特徵視覺化,注意,即便它們檢測到不同的邊緣型別時,它們仍然是很低階的邊緣檢測器。

 

來自第二和第三個卷積的通道 12 的特徵視覺化。

這裡需要注意的一個重要的事情是經過卷積的影象仍然是影象。來自影象左上角的小陣列畫素輸出依然位於左上角。所以你可以在另一個上面執行另一個卷積層(比如左邊的兩個)來提取更深層的特徵,這我們可以想象到。

然而,無論我們的特徵探測器能檢測到多深,沒有任何進一步的改變,它們仍然只能在非常小的影象上執行。無論你的探測器有多深,你都無法從 3×3 陣列中檢測到人臉。這就是感受域的概念。

感受野

任何 CNN 架構的一個基本的設計選擇是輸入的大小從開始到網路的末端變得越來越小,而通道的數量越來越深。如之前所述,這個經常是通過步長或池化層完成的。Locality 決定了輸出層看到的前一層的輸入。感受域決定了從輸出的角度看到的整個網路的原始輸入區域。

條紋卷積的概念是我們只處理一個固定的距離,而忽略中間的那些。從不同的視角,我們只保持固定距離的輸出,而移去剩餘部分 [1]。

3×3 卷積,步長 2

然後我們對輸出應用非線性,然後根據通常情況,在上面疊加另一個新的卷積層。這就是有趣的地方。即使我們將有相同大小和相同區域性區域的核(3×3),應用到條紋卷積的輸出,核將會擁有更大的感受域:

 

這是因為條紋層的輸出仍然代表相同影象。它不像調整大小那樣裁剪,唯一的問題是,輸出中的每個畫素都是一個較大區域(其他畫素被丟棄)的「代表性」,從原始輸入的相同的粗糙位置。因此,當下一層的核在輸出上執行時,它實際運行於從更大的區域收集的畫素上。

(注意:如果你熟悉擴張卷積,注意上面的不是擴張卷積。兩個都是增加感受域的方法,擴張卷積是一個單獨層,而這是發生在一個正規卷積上,之後是條紋卷積,中間幀是非線性)

對每個主要的卷積塊集合的通道進行視覺化,顯示覆雜性的逐步增加 [3]

這個感受域的擴充套件允許卷積層將低層次的特性(線,邊)與更高層次的特徵(曲線,紋理)組合,就像我們在 mixed3a 層中看到的那樣。

緊接著是池化/ 跨越層 , 網路繼續為更高級別的特性(部件、模式)建立檢測器。如我們在 mixed4a 所看到的。

網路中,影象尺寸的重複減小,導致在卷積的第五個塊中,其輸入大小僅 7×7,與 224×224 的輸入相比。從這點來看,每個單獨畫素代表了 32×32 畫素陣列,這是相當大的。

與前面的層相比,對前面的層來說,一個啟用意味著檢測一個邊界,而這裡,7×7 上的啟用就是一個高階的特徵,例如鳥類。

整個網路從少量的濾波器(GoogLeNet 有 64 個),只能檢測低階的特徵,發展到擁有大量濾波器(在最終的卷積網路中有 1024 個),每個濾波器用於查詢特定的高階特徵。之後是池化層,將每個 7×7 陣列精簡成 1 個畫素,每個通道都是一個擁有一個與整個影象對應的感受域的特徵檢測器。

與前向傳播網路所完成的工作相比,這裡的輸出令人驚訝。一個標準前向傳播網路從影象的畫素集合中生成抽象的特徵向量,需要大量難以處理的資料進行訓練。

卷積神經網路,with the priors imposed on it, 通過學習低級別的特徵檢測器開始,它的感受域逐層擴充套件,學習將那些低階的特徵逐漸與高層的特徵融合;不是每個單個畫素的抽象結合,而是強大的視覺層次的概念。

通過檢測第級別的特徵,並使用它們檢測高級別特徵,隨著視覺層次的發展,最終能夠檢測整個視覺概念,例如人臉、鳥類、樹木等,這就是為什麼它們如此強大,但卻能有效地利用影象資料。

關於對抗攻擊的最後說明

有了視覺層次卷積神經網路的構建,我們可以很合理地假設他們的視覺系統與人類相似。他們在處理真實世界的影象時表現很棒,但是它們在某些方面也失敗了,這強烈地表明他們的視覺系統和人類的並不完全相似。最主要的問題:對抗樣本 [4],這些樣本被做了特別修改導致模型被愚弄。

 

對人類來說,兩張圖片明顯都是熊貓,但對模型來說,並不是這樣。[4]

如果人類能夠注意到那些導致模型失敗的被篡改的例子,那麼對抗樣本就不是問題了。問題是,這些模型容易受到樣本的攻擊,這些樣本只被稍微修改過,而且顯然不會欺騙任何人類。這為模型打開了一扇門,很小的失敗,對於從自動駕駛汽車到醫療保健的廣泛應用來說,是相當危險的。

對抗攻擊的魯棒性是目前高度活躍的研究領域,許多論文、甚至競賽和解決方案的課題肯定會改善 CNN 的架構,使其變得更安全、更可靠。

結論

卷積神經網路是允許計算機視覺從簡單的應用程式擴充套件到為複雜的產品和服務提供動力的模型,從你的照片庫中的人臉檢測到做出更好的醫學診斷。它可能會是計算機視覺向前發展的關鍵方法,或者一些新的突破可能就在眼前!

無論如何,有一件事是肯定的:它們都是令人驚歎的東西,是當今許多創新應用的核心,而且最值得深入理解。

原文連結:

https://towardsdatascience.com/intuitively-understanding-convolutions-for-deep-learning-1f6f42faee1