卷積神經網路數學原理解析
過去我們已經知道被稱為緊密連線的神經網路。這些網路的神經元被分成若干組,形成連續的層。每一個這樣的神經元都與相鄰層的每一個神經元相連。下圖顯示了這種體系結構的一個示例。
圖1. 密集連線的神經網路結構
當我們根據一組有限的人工設計的特徵來解決分類問題時,這種方法很有效。例如,我們根據足球運動員在比賽期間的統計資料來預測他的位置。然而,當處理照片時,情況變得更加複雜。當然,我們可以將每個畫素的畫素值作為單獨的特徵,並將其作為輸入傳遞給我們的密集網路。不幸的是,為了讓該網路適用於一張特定的智慧手機照片,我們的網路必須包含數千萬甚至數億個神經元。另一方面,我們可以縮小我們的照片,但在這個過程中,我們會丟失一些有用的資訊。我們立馬意識到傳統的策略對我們沒有任何作用,我們需要一個新的有效的方法,以充分利用盡可能多的資料,但同時減少必要的計算和引數量。這就是CNNs發揮作用的時候了。
數字影像的資料結構
讓我們先花一些時間來解釋數字影像是如何儲存的。你們大多數人可能知道它們實際上是由很多數字組成的矩陣。每一個這樣的數字對應一個畫素的亮度。在RGB模型中,彩色影像實際上是由三個對應於紅、綠、藍三種顏色通道的矩陣組成的。在黑白影像中,我們只需要一個矩陣。每個矩陣都儲存0到255之間的值。這個範圍是儲存影像資訊的效率(256之內的值正好可以用一個位元組表達)和人眼的敏感度(我們區分有限數量的相同顏色灰度值)之間的折衷。
圖2. 數字影像的資料結構
卷 積
核卷積不僅用於神經網路,而且是許多其他計算機視覺演算法的關鍵一環。在這個過程中,我們採用一個形狀較小的矩陣(稱為核或濾波器),我們輸入影像,並根據濾波器的值變換影像。後續的特徵map值根據下式來計算,其中輸入影像用f表示,我們的kernel用h表示,結果矩陣的行和列的索引分別用m和n表示。
圖3. 核卷積的例子
將過濾器放置在選定的畫素上之後,我們從kernel中提取每個相應位置的值,並將它們與影像中相應的值成對相乘。最後,我們總結了所有內容,並將結果放在輸出特性圖的對應位置。上面我們可以看到這樣的操作在細節上是怎麼實現的,但是更讓人關注的是,我們透過在一個完整的影像上執行核卷積可以實現什麼應用。圖4顯示了幾種不同濾波器的卷積結果。
圖4. 透過核卷積得到邊緣[原影像:]
有效卷積和相同卷積
如圖3所示,當我們用3x3核對6x6的影像進行卷積時,我們得到了4x4特徵圖。這是因為只有16個不同的位置可以讓我們把濾波器放在這個圖片裡。因為每次卷積操作,影像都會縮小,所以我們只能做有限次數的卷積,直到影像完全消失。更重要的是,如果我們觀察卷積核如何在影像中移動,我們會發現位於影像邊緣的畫素的影響要比位於影像中心的畫素小得多。這樣我們就丟失了圖片中包含的一些資訊。透過下圖,您可以知道畫素的位置如何改變其對特徵圖的影響。
圖5. 畫素位置的影響
為了解決這兩個問題,我們可以用額外的邊框填充影像。例如,如果我們使用1px填充,我們將照片的大小增加到8x8,那麼與3x3濾波器卷積的輸出將是6x6。在實踐中,我們一般用0填充額外的填充區域。這取決於我們是否使用填充,我們要根據兩種卷積來判斷-有效卷積和相同卷積。這樣命名並不是很合適,所以為了清晰起見:Valid表示我們僅使用原始影像,Same表示我們同時也考慮原影像的周圍邊框,這樣輸入和輸出的影像大小是相同的。在第二種情況下,填充寬度應該滿足以下方程,其中p為填充寬度和f是濾波器維度(一般為奇數)。
步幅卷積
圖6. 步幅卷積的例子
在前面的例子中,我們總是將卷積核每次移動一個畫素。但是,步幅也可以看作卷積層超引數之一。在圖6中,我們可以看到,如果我們使用更大的步幅,卷積看起來是什麼樣的。在設計CNN架構時,如果希望感知區域的重疊更少,或者希望feature map的空間維度更小,我們可以決定增加步幅。輸出矩陣的尺寸——考慮到填充寬度和步幅——可以使用以下公式計算。
過渡到三維
空間卷積是一個非常重要的概念,它不僅能讓我們處理彩色影像,更重要的是在單層中應用多個卷積核。第一個重要的原則是,過濾器和要應用它的影像必須具有相同通道數。基本上,這種方式與圖3中的示例非常相似,不過這次我們將三維空間中的值與卷積核對應相乘。如果我們想在同一幅影像上使用多個濾波器,我們分別對它們進行卷積,將結果一個疊在一起,並將它們組合成一個整體。接收張量的維數(即我們的三維矩陣)滿足如下方程:n-影像大小,f-濾波器大小,nc-影像中通道數,p-是否使用填充,s-使用的步幅,nf-濾波器個數。
圖7. 三維卷積
卷積層
現在是時候運用我們今天所學的知識來構建我們的CNN層了。我們的方法和我們在密集連線的神經網路中使用的方法幾乎是一樣的,唯一的不同是這次我們將使用卷積而不是簡單的矩陣乘法。正向傳播包括兩個步驟。第一步是計算中間值Z,這是利用輸入資料和上一層權重W張量(包括所有濾波器)獲得的卷積的結果,然後加上偏置b。第二步是將非線性啟用函式的應用到獲得的中間值上(我們的啟用函式表示為g)。對矩陣方程感興趣的讀者可以在下面找到對應的數學公式。如果您不清楚其中的操作細節,我強烈推薦我的前一篇文章,在那篇文章中,我詳細討論了緊密連線的神經網路的原理。順便說一下,在下圖中你可以看到一個簡單的視覺化,描述了方程中使用的張量的維數。
連線剪枝和引數共享
在文章的開頭,我提到密集連線的神經網路不擅長處理影像,這是因為需要學習大量的引數。既然我們已經理解了卷積是什麼,讓我們現在考慮一下它是如何最佳化計算的。在下面的圖中,以稍微不同的方式顯示了二維卷積,以數字1-9標記的神經元組成了輸入層,並接受影像畫素亮度值,而A - D單元表示計算出的特徵map元素。最後,I-IV是需要經過學習的卷積核的值。
圖9. 連線剪枝和引數共享
現在,讓我們關注卷積層的兩個非常重要的屬性。首先,你可以看到,並不是所有連續兩層的神經元都相互連線。例如,神經元1隻影響A的值。其次,我們看到一些神經元共享相同的權重。這兩個性質都意味著我們需要學習的引數要少得多。順便說一下,值得注意的是,濾波器中的一個值會影響特徵map中的每個元素——這在反向傳播過程中非常重要。
卷積層反向傳播
任何嘗試過從頭編寫自己的神經網路程式碼的人都知道,完成正向傳播還沒有完成整個演算法流程的一半。真正的樂趣在於你想要進行反向傳播得到時候。現在,我們不需要為反向傳播這個問題所困擾,我們可以利用深度學習框架來實現這一部分,但是我覺得了解底層是有價值的。就像在密集連線的神經網路中,我們的目標是計算導數,然後用它們來更新我們的引數值,這個過程叫做梯度下降。
在我們的計算中需要用到鏈式法則——我在前面的文章中提到過。我們想評估引數的變化對最終特徵map的影響,以及之後對最終結果的影響。在我們開始討論細節之前,讓我們就對使用的數學符號進行統一——為了讓過程更加簡化,我將放棄偏導的完整符號,而使用如下所示的更簡短的符號來表達。但記住,當我用這個符號時,我總是指的是損失函式的偏導數。
圖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. 全卷積
池化層
除了卷積層,CNNs還經常使用所謂的池化層。池化層主要用於減小張量的大小和加速計算。這種網路層很簡單——我們需要將影像分割成不同的區域,然後對每個部分執行一些操作。例如,對於最大值池化層,我們從每個區域中選擇一個最大值,並將其放在輸出中相應的位置。在卷積層的情況下,我們有兩個超引數——濾波器大小和步長。最後一個比較重要的一點是,如果要為多通道影像進行池化操作,則應該分別對每個通道進行池化。
圖12. 最大值池化的例子
池化層反向傳播
在本文中,我們將只討論最大值池化的反向傳播,但是我們將學習的規則只需要稍加調整就可以適用於所有型別的池化層。由於在這種型別的層中,我們沒有任何必須更新的引數,所以我們的任務只是適當地分佈梯度。正如我們所記得的,在最大值池化的正向傳播中,我們從每個區域中選擇最大值,並將它們傳輸到下一層。因此,很明顯,在反向傳播過程中,梯度不應該影響矩陣中沒有包含在正向傳播中的元素。實際上,這是透過建立一個掩碼來實現的,該掩碼可以記住第一階段中使用的值的位置,稍後我們可以使用該掩碼來傳播梯度。
圖13. 最大值池化的反向傳播
學習和關注人工智慧技術與諮詢,瞭解更多資訊!
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70021344/viewspace-2914960/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 卷積神經網路卷積神經網路
- 卷積神經網路-AlexNet卷積神經網路
- 5.2.1 卷積神經網路卷積神經網路
- 卷積神經網路CNN卷積神經網路CNN
- 卷積神經網路概述卷積神經網路
- 解密卷積神經網路!解密卷積神經網路
- 卷積神經網路-1卷積神經網路
- 卷積神經網路-2卷積神經網路
- 卷積神經網路-3卷積神經網路
- 【深度學習篇】--神經網路中的卷積神經網路深度學習神經網路卷積
- 深度學習三:卷積神經網路深度學習卷積神經網路
- 卷積神經網路的原理及Python實現卷積神經網路Python
- 刷臉背後,卷積神經網路的數學原理是這樣的卷積神經網路
- 卷積神經網路四種卷積型別卷積神經網路型別
- 全卷積神經網路FCN卷積神經網路
- 深度剖析卷積神經網路卷積神經網路
- 深度學習——LeNet卷積神經網路初探深度學習卷積神經網路
- 深度學習筆記------卷積神經網路深度學習筆記卷積神經網路
- 深度學習卷積神經網路筆記深度學習卷積神經網路筆記
- 卷積神經網路學習筆記——SENet卷積神經網路筆記SENet
- 卷積神經網路CNN-學習1卷積神經網路CNN
- 卷積神經網路學習筆記——Siamese networks(孿生神經網路)卷積神經網路筆記
- 【深度學習原理第4篇】卷積神經網路詳解(CNN)深度學習卷積神經網路CNN
- 深度學習經典卷積神經網路之AlexNet深度學習卷積神經網路
- 8-深度學習之神經網路核心原理與演算法-卷積神經網路深度學習神經網路演算法卷積
- 卷積神經網路鼻祖LeNet網路分析卷積神經網路
- 何為神經網路卷積層?神經網路卷積
- 卷積神經網路(CNN)詳解卷積神經網路CNN
- CNN神經網路之卷積操作CNN神經網路卷積
- 卷積神經網路 part2卷積神經網路
- 14 卷積神經網路(進階)卷積神經網路
- Tensorflow-卷積神經網路CNN卷積神經網路CNN
- 【卷積神經網路學習】(4)機器學習卷積神經網路機器學習
- 刷臉背後,卷積神經網路的數學原理原來是這樣的卷積神經網路
- 吳恩達《卷積神經網路》課程筆記(1)– 卷積神經網路基礎吳恩達卷積神經網路筆記
- 學習OpenCL與卷積神經網路 Day1卷積神經網路
- 深度學習革命的開端:卷積神經網路深度學習卷積神經網路
- 卷積神經網路-啟用函式卷積神經網路函式