卷積神經(jīng)網(wǎng)絡(luò):聽(tīng)起來(lái)像是生物與數(shù)學(xué)還有少量計(jì)算機(jī)科學(xué)的奇怪結(jié)合,但是這些網(wǎng)絡(luò)在計(jì)算機(jī)視覺(jué)領(lǐng)域已經(jīng)造就了一些最有影響力的創(chuàng)新。2012年神經(jīng)網(wǎng)絡(luò)開(kāi)始嶄露頭角,那一年Alex Krizhevskyj在ImageNet競(jìng)賽上(ImageNet可以算是競(jìng)賽計(jì)算機(jī)視覺(jué)領(lǐng)域一年一度的“奧運(yùn)會(huì)”競(jìng)賽)將分類錯(cuò)誤記錄從26%降低到15%,這在當(dāng)時(shí)是一個(gè)相當(dāng)驚人的進(jìn)步。從那時(shí)起許多公司開(kāi)始將深度學(xué)習(xí)應(yīng)用在他們的核心服務(wù)上,如Facebook將神經(jīng)網(wǎng)絡(luò)應(yīng)用到他們的自動(dòng)標(biāo)注算法中,Google(谷歌)將其應(yīng)用到圖片搜索里,Amazon(亞馬遜)將其應(yīng)用到產(chǎn)品推薦服務(wù),Pinterest將其應(yīng)用到主頁(yè)個(gè)性化信息流中,Instagram也將深度學(xué)習(xí)應(yīng)用到它們的圖像搜索架構(gòu)中。然而最經(jīng)典的,或者說(shuō)最流行的神經(jīng)網(wǎng)絡(luò)使用范例是將其用于圖像處理領(lǐng)域。提到圖像處理,本文主要介紹的是如何使用卷積神經(jīng)網(wǎng)絡(luò)來(lái)進(jìn)行圖像分類。
?
?
問(wèn)題空間
圖像分類是將輸入圖像(貓、狗等)進(jìn)行分類輸出或者將其分類成最能描述圖像特征的類別的任務(wù)。對(duì)于人類來(lái)說(shuō),認(rèn)知是我們出生之后就學(xué)會(huì)的第一個(gè)技能,也是作為成年人來(lái)說(shuō)非常自然和輕松的技能。我們可以毫不猶豫迅速識(shí)別出我們周圍的環(huán)境以及物體,當(dāng)我們看到一張圖片或者觀察周遭環(huán)境時(shí),大部分時(shí)間我們都能馬上對(duì)場(chǎng)景做出判斷并且給每個(gè)物體都打上標(biāo)識(shí),這些甚至都不需要刻意去觀察。這些技能能夠迅速識(shí)別其模式,從我們以前的經(jīng)驗(yàn)中做出推論,然后將其運(yùn)用至不同的圖片或者環(huán)境中——這些都是我們與機(jī)器不同的地方。
輸入與輸出
當(dāng)計(jì)算機(jī)看到一張圖片時(shí)(即輸入一張圖片),它所看到的是一系列的像素值。根據(jù)圖片的分辨率與大小,計(jì)算機(jī)將看到的是一個(gè)32×32×3的數(shù)字陣列(3指代的是RGB—顏色值)。我們稍微將一下這個(gè),假設(shè)我們有一張480 x 480的JPG格式圖片,它的表達(dá)陣列即為480 x 480 x 3。這些數(shù)字中的每一個(gè)值都可以從0取到255,它描述了在這一點(diǎn)上的像素強(qiáng)度。這些數(shù)字雖然對(duì)于我們進(jìn)行圖像分類時(shí)沒(méi)有任何意義,但其卻是計(jì)算機(jī)在圖像輸入時(shí)唯一獲取的數(shù)據(jù)。這個(gè)理念就是你給電腦指定相關(guān)數(shù)據(jù)排列,它將圖像是一個(gè)特定的類別的可能性進(jìn)行輸出(如80—貓,15—狗,05—鳥(niǎo)等)。
我們希望電腦做什么
現(xiàn)在我們了解到問(wèn)題是在輸入和輸出上,讓我們來(lái)考慮如何解決這個(gè)問(wèn)題。我們希望電腦能做到的是在所有的給定圖像中分辨出不同的類別,它能找到那些“狗之所以是狗”或者“貓之所以是貓”的特性。這個(gè)就是在我們的頭腦中潛意識(shí)里進(jìn)行認(rèn)知識(shí)別的過(guò)程,當(dāng)我們看到一張狗的圖像時(shí),我們能夠?qū)⑵浞诸愐驗(yàn)閳D像上有爪子或者四條腿等明顯的特征。以類似的方式計(jì)算機(jī)能夠進(jìn)行圖像分類任務(wù),通過(guò)尋找低層次的特征如邊緣和曲線,然后運(yùn)用一系列的卷積層建立一個(gè)更抽象的概念。這是卷積神經(jīng)網(wǎng)絡(luò)應(yīng)用的一個(gè)總體概述,接下來(lái)我們來(lái)探討下細(xì)節(jié)。
生物聯(lián)系
首先要稍微普及下一點(diǎn)背景知識(shí),當(dāng)你第一次聽(tīng)到卷積神經(jīng)網(wǎng)絡(luò)這個(gè)詞時(shí),你也許會(huì)想這是是不與神經(jīng)科學(xué)或者生物學(xué)有關(guān)?恭喜你,猜對(duì)了一部分。卷積神經(jīng)網(wǎng)絡(luò)的確從生物學(xué)上的視覺(jué)皮層得到啟發(fā),視覺(jué)皮層有微小區(qū)域的細(xì)胞對(duì)于特定區(qū)域的視野是十分敏感的。
1962年,Hubel和 Wiesel發(fā)現(xiàn)大腦中的部分神經(jīng)元只對(duì)一定的方向的邊緣做出回應(yīng)。例如,當(dāng)暴露在垂直邊緣或者一些當(dāng)水平或?qū)蔷€邊緣時(shí),一些神經(jīng)元才會(huì)做出回應(yīng)。Hubel和 Wiesel發(fā)現(xiàn),所有這些神經(jīng)元都被架構(gòu)在一個(gè)柱狀結(jié)構(gòu)中,這樣的架構(gòu)使它們能夠產(chǎn)生視覺(jué)感知。系統(tǒng)中的特定成員可以完成特定任務(wù)這種理念(神經(jīng)細(xì)胞在視覺(jué)皮層中尋找特定的特征)也能很好地應(yīng)用在機(jī)器學(xué)習(xí)上,這也是卷積神經(jīng)網(wǎng)絡(luò)的基礎(chǔ)。
架構(gòu)
對(duì)于卷曲神經(jīng)網(wǎng)絡(luò)更詳細(xì)的介紹是將圖片通過(guò)一系列的卷積、非線性、池(采樣)、全連接層,然后得到一個(gè)輸出。正如我們前面所說(shuō)的,輸出是一個(gè)類或者一個(gè)圖像類別的可能性概率。現(xiàn)在,困難的部分是了解每一層的任務(wù)。
第一層—數(shù)學(xué)
卷積神經(jīng)網(wǎng)絡(luò)的第一層是卷積層,第一件事是你要記住卷曲層的輸入時(shí)什么。像我們之前提到的,輸入的是一個(gè)32×32×3的系列像素值。解釋卷積層的最好方式是想象一個(gè)手電筒正在圖像的左上方進(jìn)行照射,假設(shè)手電照射的區(qū)域是5 x 5的范圍。再想象下這個(gè)手電筒在輸入圖像的各個(gè)區(qū)域進(jìn)行滑動(dòng)。在機(jī)器學(xué)習(xí)術(shù)語(yǔ)中,這個(gè)手電筒叫做過(guò)濾器(有時(shí)候也稱為神經(jīng)元或者核心),它照射著的區(qū)域被稱為接受場(chǎng)。這個(gè)過(guò)濾器也是一系列的數(shù)據(jù)(這些數(shù)據(jù)被稱為權(quán)重或者參數(shù))。必須提到的是這個(gè)過(guò)濾器的深度必須是和輸入的深度相同(這樣才能保證數(shù)學(xué)正常工作),所以這個(gè)過(guò)濾器的尺寸是5×5×3。現(xiàn)在,讓我們先拿第一個(gè)位置的過(guò)濾器為例。由于過(guò)濾器在輸入圖像上是滑動(dòng)或卷積的,它是相乘的值在濾波器的原始圖像的像素值(又名計(jì)算元素的乘法),這些乘法全部相加(從數(shù)學(xué)上講,這將是75次乘法總和)。所以現(xiàn)在你有一個(gè)數(shù)字。請(qǐng)記住,這個(gè)數(shù)字只是當(dāng)過(guò)濾器在圖像的左上角時(shí)才有代表性,現(xiàn)在我們?cè)诿恳粋€(gè)位置上重復(fù)這個(gè)過(guò)程。(下一步將過(guò)濾器移動(dòng)到右邊的1個(gè)單位,然后再向右移動(dòng)1個(gè)單位,等等),每一個(gè)輸入層上獨(dú)特的位置都會(huì)產(chǎn)生一個(gè)數(shù)字。將過(guò)濾器滑動(dòng)完所有位置的,你會(huì)發(fā)現(xiàn)剩下的是一個(gè)28×28×1的系列數(shù)字,我們稱之為激活圖或者特征圖。你得到一個(gè)28×28陣列的原因是有784個(gè)不同的位置,一個(gè)5×5的過(guò)濾器可以適配一個(gè)32×32的輸入圖像,這組784個(gè)數(shù)字可以被映射到一個(gè)28×28陣列。
目前我們使用兩個(gè)5 x 5 x 3的過(guò)濾器,我們的輸出量將是28×28×2。通過(guò)使用更多的過(guò)濾器,我們能夠更好地維持空間尺寸。在數(shù)學(xué)層面上來(lái)說(shuō),這些是在一個(gè)卷積層中進(jìn)行的任務(wù)。
第一層—高階視角
讓我們從高階角度來(lái)談?wù)勥@個(gè)卷積層的任務(wù),這些過(guò)濾器中每個(gè)都可以被認(rèn)為是特征標(biāo)識(shí)符。當(dāng)我說(shuō)特征時(shí),我說(shuō)的是如直邊、簡(jiǎn)單的顏色和曲線等。思考一下,所有的圖像都有同樣的最簡(jiǎn)單的特征。我們的第一個(gè)過(guò)濾器是7×7×3,而且是一個(gè)曲線探測(cè)器。(在這一部分讓我們忽略一個(gè)事實(shí),過(guò)濾器是3個(gè)單位深的,只考慮頂部過(guò)濾器的深度和圖像。)作為一個(gè)曲線檢測(cè)器,過(guò)濾器將有一個(gè)更高的數(shù)值且有曲線的形狀的像素結(jié)構(gòu)(記住關(guān)于這些過(guò)濾器,我們考慮的只是數(shù)字)。
現(xiàn)在,讓我們回到數(shù)學(xué)可視化部分。當(dāng)我們?cè)谳斎氲淖笊辖怯辛诉@種濾波器后,它會(huì)在哪個(gè)區(qū)域的過(guò)濾器和像素值之間計(jì)算乘積。現(xiàn)在讓我們以一個(gè)我們要分類的圖像為例,把我們的過(guò)濾器放在左上角。
記住,我們需要做的是使用圖像中的原始像素值在過(guò)濾器中進(jìn)行乘積。
基本上在輸入圖像中,如果有一個(gè)形狀是類似于這種濾波器的代表曲線,那么所有的乘積累加在一起會(huì)導(dǎo)致較大的值!現(xiàn)在讓我們看看當(dāng)我們移動(dòng)我們的過(guò)濾器時(shí)會(huì)發(fā)生什么。
檢測(cè)值竟然要低得多!這是因?yàn)樵趫D像中沒(méi)有任何部分響應(yīng)曲線檢測(cè)過(guò)濾器。記住,這個(gè)卷積層的輸出是一個(gè)激活圖。因此,在簡(jiǎn)單的情況下一個(gè)過(guò)濾器的卷積(如果該過(guò)濾器是一個(gè)曲線檢測(cè)器),激活圖將顯示其中大部分可能是在圖片中的曲線區(qū)域。在這個(gè)例子中,我們的28×28×1激活圖左上方的值將是6600,這種高值意味著很可能是在輸入中有某種曲線導(dǎo)致了過(guò)濾器的激活。因?yàn)闆](méi)有任何東西在輸入使過(guò)濾器激活(或更簡(jiǎn)單地說(shuō),在該地區(qū)的原始圖像沒(méi)有一個(gè)曲線),其在我們的激活圖右上方的值將是0。記住,這僅僅只是一個(gè)過(guò)濾器。這個(gè)過(guò)濾器將檢測(cè)線向外和右邊的曲線,我們可以有其他的曲線向左或直接到邊緣的過(guò)濾器線條。過(guò)濾器越多,激活圖越深,我們從于輸入中獲取的信息也就越多。
聲明:在這一節(jié)中描述的過(guò)濾器是簡(jiǎn)化的,其主要目的是描述在一個(gè)卷積過(guò)程中的數(shù)學(xué)過(guò)程。在下圖中你會(huì)看到一些對(duì)訓(xùn)練過(guò)的網(wǎng)絡(luò)中第一個(gè)卷積層的過(guò)濾器的實(shí)際顯示示例,盡管如此,主要的論據(jù)仍然是相同的。
進(jìn)一步深入網(wǎng)絡(luò)
現(xiàn)在展示一個(gè)傳統(tǒng)的卷積神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),還有其他層在這些層之間穿插轉(zhuǎn)換。強(qiáng)烈建議那些有興趣的讀者去了解他們的功能和作用,但一般來(lái)說(shuō)他們提供的非線性和尺寸留存有助于提高網(wǎng)絡(luò)的魯棒性,同時(shí)還能控制過(guò)度擬合。一個(gè)經(jīng)典的卷積神經(jīng)網(wǎng)絡(luò)架構(gòu)看起來(lái)是這樣的:
然而,最后一層是非常重要的內(nèi)容,不過(guò)我們將在后面提到。讓我們退后一步,回顧一下我們目前提到的東西。我們談到了第一個(gè)卷積層的過(guò)濾器被設(shè)計(jì)用來(lái)探測(cè)。他們檢測(cè)到低階的特征如邊緣和曲線。正如想象的那樣,為了預(yù)測(cè)圖像的類型,我們需要神經(jīng)網(wǎng)絡(luò)能夠識(shí)別更高階的特征,如手、爪子、耳朵。讓我們考慮經(jīng)過(guò)第一層卷積層后網(wǎng)絡(luò)的輸出是什么,這將是一個(gè)28×28×3的體量(假設(shè)我們使用三個(gè)5×5×3過(guò)濾器)。當(dāng)穿過(guò)另一個(gè)卷積層時(shí),卷積層的第一輸出成為第二卷積層的輸入,這有難以視覺(jué)化想象。當(dāng)我們談?wù)摰谝粚訒r(shí),輸入的只是原始圖像。然而,當(dāng)我們談?wù)摰诙€(gè)卷積層時(shí),輸入是第一層的結(jié)果激活圖(S)。因此,每一層的輸入基本上是描述某些低階特征在原始圖像中的位置。現(xiàn)在當(dāng)你應(yīng)用一組過(guò)濾器(通過(guò)第二卷積層),輸出將被激活且代表更高階的特征。這些特征的類型可能是半圓(曲線和直線邊緣的組合)或方形(幾個(gè)直邊的組合)。當(dāng)通過(guò)網(wǎng)絡(luò)、更多的卷積層,可以激活地圖,代表更多和更復(fù)雜的特征。在神經(jīng)網(wǎng)絡(luò)的結(jié)束,可能有一些激活的過(guò)濾器,表示其在圖像中看到手寫字跡或者粉紅色的物體時(shí)等等。另一個(gè)有趣的事情是當(dāng)你在網(wǎng)絡(luò)往更深的地方探索時(shí),過(guò)濾器開(kāi)始有越來(lái)越大的接受場(chǎng),這意味著他們能夠從一個(gè)更大的區(qū)域或者更多的原始輸入量接收信息。
全連接層
現(xiàn)在我們可以檢測(cè)到這些高階特征,錦上添花的是在神經(jīng)網(wǎng)絡(luò)的末端連接一個(gè)全連接層。這層基本上將一個(gè)輸入量(無(wú)論輸出是卷積或ReLU或池層)和輸出一個(gè)N是程序選擇類別的N維向量,具體過(guò)程如下圖所示。這個(gè)全連接層的工作方式是,它著眼于前一層的輸出(代表高階特征的激活圖),并確定哪些功能是最相關(guān)特定的類。例如如果該程序預(yù)測(cè),一些圖像是一只狗,它在激活圖中會(huì)有高的值,代表高階特征如一個(gè)爪子或4條腿等。類似地,如果該程序是預(yù)測(cè)一些圖像是鳥(niǎo)的功能,它在激活圖中會(huì)有高階值,代表高階特征如如翅膀或喙等。
訓(xùn)練過(guò)程
訓(xùn)練工程作為神經(jīng)網(wǎng)絡(luò)的一個(gè)部分,我之前故意沒(méi)有提到,因?yàn)樗锌赡苁亲钪匾囊徊糠帧i喿x時(shí)你可能會(huì)遇到有很多問(wèn)題,例如第一個(gè)卷積層中過(guò)濾器如何知道尋找邊緣和曲線?全連接層如何知道激活圖在哪里?每一層的過(guò)濾器如何知道有什么樣的值?計(jì)算機(jī)能夠調(diào)整其過(guò)濾值(或權(quán)重)的方式是通過(guò)一個(gè)稱為反向傳播的訓(xùn)練過(guò)程。
在我們介紹反向傳播之前,我們必須先回顧下談?wù)勆窠?jīng)網(wǎng)絡(luò)運(yùn)行所需要的是什么。在我們出生的那一刻,我們的思想是全新的,我們不知道什么是貓,什么是鳥(niǎo)。類似地,在卷積神經(jīng)網(wǎng)絡(luò)開(kāi)始之前,權(quán)重或過(guò)濾器的值是隨機(jī)的,過(guò)濾器并不知道去尋找邊緣和曲線,在更高階的層過(guò)濾器不知道去尋找爪子和喙。然而當(dāng)我們稍微大了一點(diǎn)之后,我們的父母和老師給我們展示了不同的圖片和圖像,并給了我們一個(gè)相應(yīng)的標(biāo)簽。給圖像以標(biāo)簽這個(gè)想法既是卷積神經(jīng)網(wǎng)絡(luò)(CNNs)的訓(xùn)練過(guò)程。在講到它之前,讓我們稍微介紹下我們有一個(gè)訓(xùn)練集,其中有成千上萬(wàn)的狗,貓和鳥(niǎo)類的圖像,每一個(gè)圖像有一個(gè)標(biāo)簽對(duì)應(yīng)它是什么動(dòng)物的圖片。
反向傳播可以分為4個(gè)不同的部分:前向傳播、損失計(jì)算、反向傳播、權(quán)重更新。在前向傳播的過(guò)程中,你需要一個(gè)數(shù)字陣列為32×32×3的訓(xùn)練圖像,并將其傳遞通過(guò)整個(gè)網(wǎng)絡(luò)。在我們的第一個(gè)訓(xùn)練例子中,所有的權(quán)重或過(guò)濾器的值被隨機(jī)初始化,輸出可能是類似[.1 .1 .1 .1 .1 .1 .1 .1 .1 .1]的東西,基本上是一個(gè)不能優(yōu)先考慮任何數(shù)字的輸出。目前權(quán)重的網(wǎng)絡(luò)是無(wú)法尋找那些低階的功能,因此也無(wú)法對(duì)分類可能性作出任何合理的結(jié)論。這就到了反向傳播中的損失計(jì)算部分。我們現(xiàn)在使用的是訓(xùn)練數(shù)據(jù),此數(shù)據(jù)有一個(gè)圖像和一個(gè)標(biāo)簽。比方說(shuō),第一個(gè)輸入的訓(xùn)練圖像是一個(gè)3,則該圖像的標(biāo)簽將是[ 0 0 1 0 0 0 0 0 ]。損失計(jì)算可以按許多不同的方式定義,但常見(jiàn)的是MSE(均方差)—?倍(實(shí)際預(yù)測(cè))的平方。
假設(shè)變量L等于這個(gè)值,正如你想象的,對(duì)于第一組訓(xùn)練圖像來(lái)說(shuō)損失將是非常高的。現(xiàn)在,讓我們更直觀地來(lái)進(jìn)行思考。我們想得到一個(gè)點(diǎn)的預(yù)測(cè)標(biāo)簽(ConvNet的輸出)作為訓(xùn)練相同的訓(xùn)練標(biāo)簽(這意味著我們的網(wǎng)絡(luò)預(yù)測(cè)正確)。為了實(shí)現(xiàn)則這個(gè),我們要盡量減少我損失量。可視化在微積分上只是一個(gè)優(yōu)化問(wèn)題,我們需要找出哪些輸入是(在我們的例子中的權(quán)重)最直接導(dǎo)致網(wǎng)絡(luò)的損失(或錯(cuò)誤)所在。
這是一個(gè)dL/DW的數(shù)學(xué)等價(jià),其中W是在一個(gè)特定層的權(quán)重。現(xiàn)在我們要做的通過(guò)網(wǎng)絡(luò)是執(zhí)行一個(gè)反向傳播過(guò)程,檢測(cè)哪個(gè)權(quán)重?fù)p失最大并且尋找方法來(lái)調(diào)整它們使損失降低。一旦我們將這個(gè)計(jì)算過(guò)程進(jìn)行完,就可以到最后一步—權(quán)重更新。把所有的過(guò)濾器的權(quán)重進(jìn)行更新,使它們?cè)谔荻确较蛏线M(jìn)行改變。
學(xué)習(xí)速率是由程序員選擇的一個(gè)參數(shù)。一個(gè)高的學(xué)習(xí)率意味著更多步驟是在權(quán)重更新部分,因此它可能需要更少的時(shí)間為最佳的權(quán)重在模型上進(jìn)行收斂。然而學(xué)習(xí)率太高,可能會(huì)導(dǎo)致跨越太大而不夠精準(zhǔn)達(dá)到最佳點(diǎn)。
前向傳播、損失計(jì)算、反向傳播、參數(shù)更新的過(guò)程也稱為一個(gè)epoch。程序會(huì)對(duì)于每一個(gè)固定數(shù)量的epoch、每個(gè)訓(xùn)練圖像重復(fù)這一過(guò)程。在最后一個(gè)訓(xùn)練例子中完成了參數(shù)更新后,網(wǎng)絡(luò)應(yīng)該都訓(xùn)練的足夠好了,各層的權(quán)重也應(yīng)該調(diào)參正確了。
測(cè)試
最后要來(lái)測(cè)試我們的卷積神經(jīng)網(wǎng)絡(luò)是否工作,將不同的圖片和標(biāo)簽集通過(guò)卷積神經(jīng)網(wǎng)絡(luò),將輸出結(jié)果與真實(shí)值進(jìn)行對(duì)比,即可測(cè)試出其是否正常運(yùn)行。
業(yè)界如何使用卷積神經(jīng)網(wǎng)絡(luò)
數(shù)據(jù),數(shù)據(jù),數(shù)據(jù)。給一個(gè)卷積神經(jīng)網(wǎng)絡(luò)的更多的訓(xùn)練數(shù)據(jù),可以做的更多的訓(xùn)練迭代,也就能實(shí)現(xiàn)更多的權(quán)重更新,對(duì)神經(jīng)網(wǎng)絡(luò)進(jìn)行更好的調(diào)參。Facebook(還有Instagram)可以使用數(shù)以億計(jì)的用戶目前的所有照片,Pinterest可以使用在其網(wǎng)站上的500億的信息,谷歌可以使用搜索數(shù)據(jù),亞馬遜可以使用每天數(shù)以百萬(wàn)計(jì)的產(chǎn)品購(gòu)買數(shù)據(jù)。
現(xiàn)在你知道他們是如何使用這些的魔法了,有興趣的話可以自己嘗試一下。
評(píng)論