作者:Piotr Skalski 機(jī)器之心編譯 參與:Nurhachu Null、張倩
在自動(dòng)駕駛、醫(yī)療以及零售這些領(lǐng)域,計(jì)算機(jī)視覺(jué)讓我們完成了一些直到最近都被認(rèn)為是不可能的事情。今天,自動(dòng)駕駛汽車和無(wú)人商店聽(tīng)起來(lái)不再那么夢(mèng)幻。事實(shí)上,我們每天都在使用計(jì)算機(jī)視覺(jué)技術(shù)——我們用自己的面孔解鎖手機(jī),將圖片上傳到社交網(wǎng)絡(luò)之前進(jìn)行自動(dòng)修圖……卷積神經(jīng)網(wǎng)絡(luò)可能是這一巨大成功背后的關(guān)鍵組成模塊。這次,我們將要使用卷積神經(jīng)網(wǎng)絡(luò)的思想來(lái)拓寬我們對(duì)神經(jīng)網(wǎng)絡(luò)工作原理的理解。打個(gè)預(yù)防針,本文包含相當(dāng)復(fù)雜的數(shù)學(xué)方程,但是,你也不必為自己不喜歡線性代數(shù)和微積分而沮喪。我的目標(biāo)并不是讓你記住這些公式,而是為你提供一些關(guān)于底層原理的直覺(jué)認(rèn)知。 簡(jiǎn)介 過(guò)去我們接觸到了密集連接的神經(jīng)網(wǎng)絡(luò)。那些神經(jīng)網(wǎng)絡(luò)中,所有的神經(jīng)元被分成了若干組,形成了連續(xù)的層。每個(gè)這樣的單元都與相鄰層的每一個(gè)單獨(dú)的神經(jīng)元相連接。下圖所示的是這樣一個(gè)架構(gòu)。 圖 1:密集連接的神經(jīng)網(wǎng)絡(luò)架構(gòu) 當(dāng)我們基于一個(gè)有限的固定特征集合解決分類問(wèn)題的時(shí)候,這種方法是很奏效的——例如,我們根據(jù)足球運(yùn)動(dòng)員在比賽中記錄的統(tǒng)計(jì)數(shù)據(jù)來(lái)預(yù)測(cè)他的位置。但是,當(dāng)處理照片的時(shí)候,問(wèn)題變得更加復(fù)雜。當(dāng)然,我們可以把每個(gè)像素的亮度視作一個(gè)單獨(dú)的特征,然后將它作為密集網(wǎng)絡(luò)的輸入傳遞進(jìn)去。不幸的是,為了讓它能夠應(yīng)付一張典型的智能手機(jī)照片,我們的網(wǎng)絡(luò)必須包含數(shù)千萬(wàn)甚至上億的神經(jīng)元。另一方面,雖然我們可以將照片縮小,但是我們也會(huì)在這個(gè)過(guò)程中損失有價(jià)值的信息。所以我們馬上就會(huì)發(fā)現(xiàn),傳統(tǒng)的策略是沒(méi)有用的——我們需要一種新的聰明的方法,來(lái)盡可能多的利用數(shù)據(jù),但同時(shí)還要減少必需的計(jì)算量和參數(shù)。這就是 CNN 發(fā)揮作用的時(shí)候了。 數(shù)字照片的數(shù)據(jù)結(jié)構(gòu) 讓我們先花少許時(shí)間解釋一下數(shù)字圖像的存儲(chǔ)方式。大多數(shù)人可能意識(shí)到了,圖像實(shí)際上就是巨大的數(shù)字矩陣。每個(gè)數(shù)字代表的是一個(gè)單獨(dú)像素的亮度。在 RGB 模型中,彩色圖片是由 3 個(gè)這樣的矩陣組成的,每個(gè)矩陣對(duì)應(yīng)著 3 個(gè)顏色通道(紅、綠、藍(lán))中的一個(gè)。在黑白圖像中,我們僅使用一個(gè)矩陣。每個(gè)矩陣都存儲(chǔ)著 0 到 255 的數(shù)值。這個(gè)數(shù)值范圍是圖像存儲(chǔ)信息的效率(256 個(gè)數(shù)值剛好對(duì)應(yīng)一個(gè)字節(jié))和人眼敏感度之間的折中(我們僅能區(qū)分同種顏色的幾種有限色度)。 圖 2. 數(shù)字圖像的數(shù)據(jù)結(jié)構(gòu) 卷積 核卷積并不僅僅用在卷積神經(jīng)經(jīng)網(wǎng)絡(luò)中,它也是很多其他計(jì)算機(jī)視覺(jué)算法的關(guān)鍵元素。這個(gè)過(guò)程是這樣的:我們有一個(gè)小的數(shù)字矩陣(稱作卷積核或?yàn)V波器),我們將它傳遞到我們的圖像上,然后基于濾波器的數(shù)值進(jìn)行變換。后續(xù)的特征圖的值要通過(guò)下面的公式計(jì)算,其中輸入圖像被記作 f,我們的卷積核為 h。計(jì)算結(jié)果的行列索引分別記為 m 和 n。 圖 3. 核卷積的例子 在將我們的濾波器放在選中的像素上之后,我們將卷積核中的每一個(gè)數(shù)值和圖像中對(duì)應(yīng)的數(shù)值成對(duì)相乘。最后將乘積的結(jié)果相加,然后把結(jié)果放在輸出特征圖的正確位置上。我們?cè)谏线叺膭?dòng)畫(huà)中可以以一個(gè)微觀的形式看到這個(gè)運(yùn)算的過(guò)程,但是更有趣的是我們?cè)谡鶊D像上執(zhí)行這個(gè)運(yùn)算得到的結(jié)果。圖 4 展示了用數(shù)個(gè)濾波器做卷積的結(jié)果。 圖 4. 用卷積核尋找邊緣 Valid 和 Same 的卷積 如圖 3 所示,當(dāng)我們?cè)谟?3x3 的卷積核在 6x6 的圖像上執(zhí)行卷積時(shí),我們得到了 4x4 的特征圖。這是因?yàn)樵谖覀兊膱D像里面,只有 16 個(gè)獨(dú)特的位置來(lái)放置卷積核。由于我們的圖像的尺寸在每次卷積的時(shí)候都會(huì)收縮,在圖像完全消失之前,我們只能做有限次的卷積。此外,如果我們注意一下卷積核是如何在圖像上移動(dòng)的,我們會(huì)發(fā)現(xiàn),邊緣的像素會(huì)比中央的像素影響更小。這樣的話我們會(huì)損失圖片中包含的一些信息,你可以在下圖看到,像素的位置是如何改變它對(duì)特征圖的影響的。 圖 5. 像素位置的影響 為了解決這兩個(gè)問(wèn)題,我們可以使用一個(gè)額外的邊界來(lái)填充圖像。例如,如果我們使用 1 像素的填充,我們將圖像的尺寸增大到了 8x8,這樣,3x3 的濾波器的輸出將會(huì)成為 6x6。通常在實(shí)際中我們用 0 來(lái)做額外的填充。根據(jù)我們是否使用填充,我們會(huì)進(jìn)行兩種類型的卷積——Valid 和 Same。命名相當(dāng)令人費(fèi)解,所以在這里解釋一下:valid 代表我們使用的是原始圖像,same 代表我們?cè)趫D像周圍使用了邊界,因此輸入和輸出的圖像大小相同。在第二種情況下,擴(kuò)充的寬度應(yīng)該滿足下面的方程,其中 p 是 padding(填充),f 是濾波器的維度(通常是奇數(shù))。 跨步卷積 圖 6. 跨步卷積的例子 在之前的例子中,我們總是將卷積核移動(dòng)一個(gè)像素。但是,步長(zhǎng)也可以看做是卷積層的一個(gè)參數(shù)。在圖 6 中,我們可以看到,如果我們使用更大的步長(zhǎng),卷積會(huì)成為什么樣子。在設(shè)計(jì) CNN 結(jié)構(gòu)時(shí),如果我們想讓接受域有更少的重疊或者想讓特征圖有更小的空間維度,那么我們可以決定增大步長(zhǎng)。考慮到擴(kuò)充和跨步,輸出矩陣的維度可以使用下面的公式計(jì)算: 轉(zhuǎn)換到第三個(gè)維度 立體卷積是一個(gè)非常重要的概念,它不僅讓我們能夠處理彩色圖像,而且更重要的是,可以在一個(gè)單獨(dú)的層上使用多個(gè)濾波器。最重要的規(guī)則是,濾波器和你想在其上應(yīng)用濾波器的圖像必須擁有相同的通道數(shù)?;旧?,我們繼續(xù)使用和圖 3 類似的示例,盡管我們這次從第三個(gè)維度讓矩陣中的數(shù)值對(duì)相乘。如果我們想在同一張圖像上應(yīng)用多個(gè)濾波器,我們會(huì)為每個(gè)濾波器獨(dú)立地計(jì)算卷積,然后將計(jì)算結(jié)果逐個(gè)堆疊,最后將他們組合成一個(gè)整體。得到的張量(3D 矩陣可以被稱作張量)滿足下面的方程,其中:n 是圖像的大小,f 是濾波器的大小,n_c 是圖像中的通道數(shù),p 是所用的填充,s 是所用的步長(zhǎng),n_f 是濾波器的數(shù)量。 圖 7. 立體卷積 卷積層 使用我們今天所學(xué)內(nèi)容構(gòu)造一個(gè)卷積層的時(shí)間到了。我們的方法幾乎與用在密集連接神經(jīng)網(wǎng)絡(luò)上的方法相同,唯一的差別就是不使用簡(jiǎn)單的矩陣相乘,這一次我們將會(huì)使用卷積。前向傳播包含兩個(gè)步驟。第一步是計(jì)算中間結(jié)果 Z,它是由前一層的輸入數(shù)據(jù)與張量 W(包含濾波器)的卷積結(jié)果,加上偏置項(xiàng) b 得到的。第二步是給我們的中間結(jié)果應(yīng)用一個(gè)非線性的激活函數(shù)(我們的激活函數(shù)記作 g)。矩陣方程的愛(ài)好者將在下面找到合適的數(shù)學(xué)公式。在下面的插圖中,你可以看見(jiàn)一個(gè)小型的可視化,它描述了我們方程中用到的張量的維度。 圖 8. 張量維度 連接剪切和參數(shù)共享 在本文開(kāi)始,由于需要學(xué)習(xí)的參數(shù)數(shù)量巨大,我提到密集連接神經(jīng)網(wǎng)絡(luò)在處理圖像方面是很弱的。既然我們已經(jīng)了解了關(guān)于卷積的所有內(nèi)容,讓我們來(lái)考慮一下它是如何優(yōu)化計(jì)算的吧。在下圖中,2D 卷積以一種稍微不同的方式進(jìn)行了可視化——用數(shù)字 1-9 標(biāo)記的神經(jīng)元組成接收后續(xù)像素亮度的輸入層,A-D 這 4 個(gè)單元代表的是計(jì)算得到的特征圖元素。最后但同等重要的是,I-IV 是卷積核中的數(shù)值——它們必須被學(xué)習(xí)到。 圖 9. 連接剪切和參數(shù)共享 現(xiàn)在,讓我們聚焦于卷積層的兩個(gè)重要屬性。第一,你可以看到,連續(xù)兩層中,并不是所有的神經(jīng)元都是彼此相連的。例如,單元 1 僅僅會(huì)影響到 A 的值。第二,我們發(fā)現(xiàn),一些神經(jīng)元會(huì)共享相同的權(quán)重。這兩個(gè)屬性都意味著我們要學(xué)習(xí)的參數(shù)數(shù)量要少很多。順便說(shuō)一下,值得注意的是,濾波器中的每個(gè)值都會(huì)影響到特征圖中的每個(gè)元素——這在反向傳播中是特別重要的。 卷積層反向傳播 任何一個(gè)曾經(jīng)試圖從零編寫(xiě)自己的神經(jīng)網(wǎng)絡(luò)的人都知道,前向傳播遠(yuǎn)遠(yuǎn)不到成功的一半。真正有趣的是當(dāng)你開(kāi)始反向傳播的時(shí)候。現(xiàn)在,我們不必在反向傳播上花心思——深度學(xué)習(xí)框架都為我們做好了,但是我認(rèn)為,了解背后發(fā)生的東西是很值得的。就像在密集連接神經(jīng)網(wǎng)絡(luò)中一樣,我們的目標(biāo)是在一個(gè)叫做梯度下降的過(guò)程中計(jì)算導(dǎo)數(shù),然后使用它們來(lái)更新參數(shù)值。 在計(jì)算中我們會(huì)使用鏈?zhǔn)椒▌t——這個(gè)我在之前的文章中提到過(guò)。我們想要評(píng)估參數(shù)的變化對(duì)結(jié)果特征圖的影響,然后評(píng)估它對(duì)最終結(jié)果的影響。在開(kāi)始進(jìn)入細(xì)節(jié)之前,讓我們來(lái)統(tǒng)一一下將會(huì)用到的數(shù)學(xué)符號(hào)——為了讓事情變得容易一些,我會(huì)放棄偏導(dǎo)數(shù)的完整符號(hào),而會(huì)使用下面的簡(jiǎn)寫(xiě)符號(hào)。但是請(qǐng)記住,這個(gè)符號(hào)始終代表代價(jià)函數(shù)的偏導(dǎo)數(shù)。 圖 10. 一個(gè)卷積層在前向和反向傳播中的輸入和輸出數(shù)據(jù) 我們的任務(wù)是計(jì)算 dW^[l] 和 db^[l]——它們是與當(dāng)前層的參數(shù)相關(guān)的導(dǎo)數(shù),還要計(jì)算 dA^[ l -1],它們會(huì)被傳遞到之前的層。如圖 10 所示,我們以 dA^[ l ] 為輸入。當(dāng)然,這些對(duì)應(yīng)張量的維度都是相同的,dW 和 W,db 和 b,以及 dA 和 A。第一步就是通過(guò)在我們的輸入張量上應(yīng)用我們的激活函數(shù)的導(dǎo)數(shù),得到中間值 dZ^[l]。根據(jù)鏈?zhǔn)椒▌t,這個(gè)運(yùn)算的結(jié)果在后面會(huì)被用到。 現(xiàn)在,我們需要處理卷積神經(jīng)網(wǎng)絡(luò)自身的反向傳播,為了達(dá)到這個(gè)目的,我們會(huì)使用一個(gè)叫做全卷積的矩陣運(yùn)算——見(jiàn)下圖。請(qǐng)注意,我們?cè)谶@里使用的卷積核會(huì)提前旋轉(zhuǎn) 180°。這個(gè)運(yùn)算可以通過(guò)下面的公式描述,其中的濾波器記作 W,dZ[m,n] 是一個(gè)標(biāo)量,它屬于從前一層得到的偏導(dǎo)數(shù)。 圖 11. 全卷積 池化層 除了卷積層,CNN 通常會(huì)用到所謂的池化層。它們最早被用來(lái)減小張量的大小以及加速運(yùn)算。這些層是比較簡(jiǎn)單的——我們需要將我們的圖像分成不同的區(qū)域,然后在每一個(gè)部分上執(zhí)行一些運(yùn)算。例如,對(duì) Max Pool 層而言,我們會(huì)選擇每個(gè)區(qū)域的最大值,并將它放到對(duì)應(yīng)的輸出區(qū)域。與卷積層的情況一樣,我們有兩個(gè)可用的超參數(shù)——濾波器大小和步長(zhǎng)。最后但同樣重要的一點(diǎn)是,如果你對(duì)一個(gè)多通道的圖像執(zhí)行池化操作,那么每一個(gè)通道的池化應(yīng)該單獨(dú)完成。 圖 12. 最大池化(max pooling)的例子 池化層反向傳播 我們?cè)谶@篇文章中只討論最大池化反向傳播,但是我們學(xué)到的規(guī)則是適用于所有類型的池化層的——只需要做微小的調(diào)整即可。因?yàn)樵谶@種層中,我們沒(méi)有任何必須更新的參數(shù),所以我們的任務(wù)就是合適地分配梯度。我們記得,在最大池化的前向傳播中,我們選擇的是每個(gè)區(qū)域的最大值,并將它傳遞到了下一層。所以在反向傳播中也是很清晰的,梯度不應(yīng)該影響前向傳播中不包含的矩陣的元素。實(shí)際上,這是通過(guò)創(chuàng)建一個(gè)掩膜來(lái)完成的,這個(gè)掩膜記住了前一階段數(shù)值的位置,我們可以在后面轉(zhuǎn)移梯度的時(shí)候用到。 圖 13. 最大池化反向傳播 原文鏈接:https:///gentle-dive-into-math-behind-convolutional-neural-networks-79a07dd44cf9 |
|
來(lái)自: taotao_2016 > 《AI》