刷臉背後,卷積神經網絡的數學原理原來是這樣的

選自towardsdatascience,做者:Piotr Skalski,機器之心編譯,參與:Nurhachu Null、張倩算法

計算機視覺技術在平常生活中有着很是廣泛的應用:發朋友圈以前自動修圖、網上購物時刷臉支付……在這一系列成功的應用背後,卷積神經網絡功不可沒。本文將介紹卷積神經網絡背後的數學原理。

自動駕駛、醫療以及零售這些領域,計算機視覺讓咱們完成了一些直到最近都被認爲是不可能的事情。今天,自動駕駛汽車和無人商店聽起來再也不那麼夢幻。事實上,咱們天天都在使用計算機視覺技術——咱們用本身的面孔解鎖手機,將圖片上傳到社交網絡以前進行自動修圖……卷積神經網絡多是這一巨大成功背後的關鍵組成模塊。此次,咱們將要使用卷積神經網絡的思想來拓寬咱們對神經網絡工做原理的理解。打個預防針,本文包含至關複雜的數學方程,可是,你也沒必要爲本身不喜歡線性代數和微積分而沮喪。個人目標並非讓你記住這些公式,而是爲你提供一些關於底層原理的直覺認知。網絡

簡介

過去咱們接觸到了密集鏈接的神經網絡。那些神經網絡中,全部的神經元被分紅了若干組,造成了連續的層。每一個這樣的單元都與相鄰層的每個單獨的神經元相鏈接。下圖所示的是這樣一個架構。數據結構

圖 1:
密集鏈接的神經網絡架構

當咱們基於一個有限的固定特徵集合解決分類問題的時候,這種方法是很奏效的——例如,咱們根據足球運動員在比賽中記錄的統計數據來預測他的位置。可是,當處理照片的時候,問題變得更加複雜。固然,咱們能夠把每一個像素的亮度視做一個單獨的特徵,而後將它做爲密集網絡的輸入傳遞進去。不幸的是,爲了讓它可以應付一張典型的智能手機照片,咱們的網絡必須包含數千萬甚至上億的神經元。另外一方面,雖然咱們能夠將照片縮小,可是咱們也會在這個過程當中損失有價值的信息。因此咱們立刻就會發現,傳統的策略是沒有用的——咱們須要一種新的聰明的方法,來儘量多的利用數據,但同時還要減小必需的計算量和參數。這就是 CNN 發揮做用的時候了。架構

數字照片的數據結構app

讓咱們先花少量時間解釋一下數字圖像的存儲方式。大多數人可能意識到了,圖像實際上就是巨大的數字矩陣。每一個數字表明的是一個單獨像素的亮度。在 RGB 模型中,彩色圖片是由 3 個這樣的矩陣組成的,每一個矩陣對應着 3 個顏色通道(紅、綠、藍)中的一個。在黑白圖像中,咱們僅使用一個矩陣。每一個矩陣都存儲着 0 到 255 的數值。這個數值範圍是圖像存儲信息的效率(256 個數值恰好對應一個字節)和人眼敏感度之間的折中(咱們僅能區分同種顏色的幾種有限色度)。框架

圖 2. 數字圖像的數據結構

卷積函數

核卷積並不只僅用在卷積神經經網絡中,它也是不少其餘計算機視覺算法的關鍵元素。這個過程是這樣的:咱們有一個小的數字矩陣(稱做卷積核或濾波器),咱們將它傳遞到咱們的圖像上,而後基於濾波器的數值進行變換。後續的特徵圖的值要經過下面的公式計算,其中輸入圖像被記做 f,咱們的卷積核爲 h。計算結果的行列索引分別記爲 m 和 n。學習

圖 3. 核卷積的例子

在將咱們的濾波器放在選中的像素上以後,咱們將卷積核中的每個數值和圖像中對應的數值成對相乘。最後將乘積的結果相加,而後把結果放在輸出特徵圖的正確位置上。咱們在上邊的動畫中能夠以一個微觀的形式看到這個運算的過程,可是更有趣的是咱們在整幅圖像上執行這個運算獲得的結果。圖 4 展現了用數個濾波器作卷積的結果。優化

圖 4. 用卷積核尋找邊緣

Valid 和 Same 的卷積動畫

如圖 3 所示,當咱們在用 3x3 的卷積核在 6x6 的圖像上執行卷積時,咱們獲得了 4x4 的特徵圖。這是由於在咱們的圖像裏面,只有 16 個獨特的位置來放置卷積核。因爲咱們的圖像的尺寸在每次卷積的時候都會收縮,在圖像徹底消失以前,咱們只能作有限次的卷積。此外,若是咱們注意一下卷積核是如何在圖像上移動的,咱們會發現,邊緣的像素會比中央的像素影響更小。這樣的話咱們會損失圖片中包含的一些信息,你能夠在下圖看到,像素的位置是如何改變它對特徵圖的影響的。

圖 5. 像素位置的影響

爲了解決這兩個問題,咱們可使用一個額外的邊界來填充圖像。例如,若是咱們使用 1 像素的填充,咱們將圖像的尺寸增大到了 8x8,這樣,3x3 的濾波器的輸出將會成爲 6x6。一般在實際中咱們用 0 來作額外的填充。根據咱們是否使用填充,咱們會進行兩種類型的卷積——Valid 和 Same。命名至關使人費解,因此在這裏解釋一下:valid 表明咱們使用的是原始圖像,same 表明咱們在圖像周圍使用了邊界,所以輸入和輸出的圖像大小相同。在第二種狀況下,擴充的寬度應該知足下面的方程,其中 p 是 padding(填充),f 是濾波器的維度(一般是奇數)。


跨步卷積

圖 6. 跨步卷積的例子

在以前的例子中,咱們老是將卷積核移動一個像素。可是,步長也能夠看作是卷積層的一個參數。在圖 6 中,咱們能夠看到,若是咱們使用更大的步長,卷積會成爲何樣子。在設計 CNN 結構時,若是咱們想讓接受域有更少的重疊或者想讓特徵圖有更小的空間維度,那麼咱們能夠決定增大步長。考慮到擴充和跨步,輸出矩陣的維度可使用下面的公式計算:



轉換到第三個維度

立體卷積是一個很是重要的概念,它不只讓咱們可以處理彩色圖像,並且更重要的是,能夠在一個單獨的層上使用多個濾波器。最重要的規則是,濾波器和你想在其上應用濾波器的圖像必須擁有相同的通道數。基本上,咱們繼續使用和圖 3 相似的示例,儘管咱們此次從第三個維度讓矩陣中的數值對相乘。若是咱們想在同一張圖像上應用多個濾波器,咱們會爲每一個濾波器獨立地計算卷積,而後將計算結果逐個堆疊,最後將他們組合成一個總體。獲得的張量(3D 矩陣能夠被稱做張量)知足下面的方程,其中:n 是圖像的大小,f 是濾波器的大小,n_c 是圖像中的通道數,p 是所用的填充,s 是所用的步長,n_f 是濾波器的數量。

圖 7. 立體卷積

卷積層

使用咱們今天所學內容構造一個卷積層的時間到了。咱們的方法幾乎與用在密集鏈接神經網絡上的方法相同,惟一的差異就是不使用簡單的矩陣相乘,這一次咱們將會使用卷積。前向傳播包含兩個步驟。第一步是計算中間結果 Z,它是由前一層的輸入數據與張量 W(包含濾波器)的卷積結果,加上偏置項 b 獲得的。第二步是給咱們的中間結果應用一個非線性的激活函數(咱們的激活函數記做 g)。矩陣方程的愛好者將在下面找到合適的數學公式。在下面的插圖中,你能夠看見一個小型的可視化,它描述了咱們方程中用到的張量的維度。

圖 8. 張量維度

鏈接剪切和參數共享

在本文開始,因爲須要學習的參數數量巨大,我提到密集鏈接神經網絡在處理圖像方面是很弱的。既然咱們已經瞭解了關於卷積的全部內容,讓咱們來考慮一下它是如何優化計算的吧。在下圖中,2D 卷積以一種稍微不一樣的方式進行了可視化——用數字 1-9 標記的神經元組成接收後續像素亮度的輸入層,A-D 這 4 個單元表明的是計算獲得的特徵圖元素。最後但同等重要的是,I-IV 是卷積核中的數值——它們必須被學習到。

圖 9. 鏈接剪切和參數共享

如今,讓咱們聚焦於卷積層的兩個重要屬性。第一,你能夠看到,連續兩層中,並非全部的神經元都是彼此相連的。例如,單元 1 僅僅會影響到 A 的值。第二,咱們發現,一些神經元會共享相同的權重。這兩個屬性都意味着咱們要學習的參數數量要少不少。順便說一下,值得注意的是,濾波器中的每一個值都會影響到特徵圖中的每一個元素——這在反向傳播中是特別重要的。

卷積層反向傳播

任何一個曾經試圖從零編寫本身的神經網絡的人都知道,前向傳播遠遠不到成功的一半。真正有趣的是當你開始反向傳播的時候。如今,咱們沒必要在反向傳播上花心思——深度學習框架都爲咱們作好了,可是我認爲,瞭解背後發生的東西是很值得的。就像在密集鏈接神經網絡中同樣,咱們的目標是在一個叫作梯度降低的過程當中計算導數,而後使用它們來更新參數值。

在計算中咱們會使用鏈式法則——這個我在以前的文章中提到過。咱們想要評估參數的變化對結果特徵圖的影響,而後評估它對最終結果的影響。在開始進入細節以前,讓咱們來統一一下將會用到的數學符號——爲了讓事情變得容易一些,我會放棄偏導數的完整符號,而會使用下面的簡寫符號。可是請記住,這個符號始終表明代價函數的偏導數。

圖 10. 一個卷積層在前向和反向傳播中的輸入和輸出數據

咱們的任務是計算 dW^[l] 和 db^[l]——它們是與當前層的參數相關的導數,還要計算 dA^[ l -1],它們會被傳遞到以前的層。如圖 10 所示,咱們以 dA^[ l ] 爲輸入。固然,這些對應張量的維度都是相同的,dW 和 W,db 和 b,以及 dA 和 A。第一步就是經過在咱們的輸入張量上應用咱們的激活函數的導數,獲得中間值 dZ^[l]。根據鏈式法則,這個運算的結果在後面會被用到。

如今,咱們須要處理卷積神經網絡自身的反向傳播,爲了達到這個目的,咱們會使用一個叫作全卷積的矩陣運算——見下圖。請注意,咱們在這裏使用的卷積核會提早旋轉 180°。這個運算能夠經過下面的公式描述,其中的濾波器記做 W,dZ[m,n] 是一個標量,它屬於從前一層獲得的偏導數。

圖 11. 全卷積

池化層

除了卷積層,CNN 一般會用到所謂的池化層。它們最先被用來減少張量的大小以及加速運算。這些層是比較簡單的——咱們須要將咱們的圖像分紅不一樣的區域,而後在每個部分上執行一些運算。例如,對 Max Pool 層而言,咱們會選擇每一個區域的最大值,並將它放到對應的輸出區域。與卷積層的狀況同樣,咱們有兩個可用的超參數——濾波器大小和步長。最後但一樣重要的一點是,若是你對一個多通道的圖像執行池化操做,那麼每個通道的池化應該單獨完成。

圖 12. 最大池化(max pooling)的例子

池化層反向傳播

咱們在這篇文章中只討論最大池化反向傳播,可是咱們學到的規則是適用於全部類型的池化層的——只須要作微小的調整便可。由於在這種層中,咱們沒有任何須須更新的參數,因此咱們的任務就是合適地分配梯度。咱們記得,在最大池化的前向傳播中,咱們選擇的是每一個區域的最大值,並將它傳遞到了下一層。因此在反向傳播中也是很清晰的,梯度不該該影響前向傳播中不包含的矩陣的元素。實際上,這是經過建立一個掩膜來完成的,這個掩膜記住了前一階段數值的位置,咱們能夠在後面轉移梯度的時候用到。


圖 13. 最大池化反向傳播

相關文章
相關標籤/搜索