1. 深層神經(jīng)網(wǎng)絡(luò)(Deep L-layer Neural network)
什么是深度神經(jīng)網(wǎng)絡(luò)呢隧土?
首先,我們之前已經(jīng)學(xué)習(xí)了Logistic回歸豆同、單隱層神經(jīng)網(wǎng)絡(luò)剩瓶,圖1中還給出了一個(gè)雙隱層神經(jīng)網(wǎng)絡(luò)和五隱層的神經(jīng)網(wǎng)絡(luò)驹溃。
Logistic回歸是最簡(jiǎn)單的一種神經(jīng)網(wǎng)絡(luò),是一個(gè)淺層模型儒搭,而圖1中的最后一個(gè)神經(jīng)網(wǎng)絡(luò)的模型深度要比Logistic回歸深得多吠架。淺層或深層是一個(gè)相對(duì)的程度概念。
一個(gè)神經(jīng)網(wǎng)絡(luò)的層數(shù)為除去輸入層以外的其他所有層數(shù)搂鲫,包含一個(gè)隱層的神經(jīng)網(wǎng)絡(luò)稱(chēng)為雙隱層神經(jīng)網(wǎng)絡(luò)傍药。按照這個(gè)思路,Logistic回歸從技術(shù)層面上說(shuō)魂仍,它是一個(gè)單層神經(jīng)網(wǎng)絡(luò)拐辽。但前幾年在人工智能或機(jī)器學(xué)習(xí)社區(qū)中,大家發(fā)覺(jué)有些函數(shù)只有非常深層的神經(jīng)網(wǎng)絡(luò)能夠?qū)W習(xí)擦酌,而淺一些的模型通常無(wú)法學(xué)習(xí)俱诸。
處理任何具體問(wèn)題的時(shí)候都會(huì)很難預(yù)先準(zhǔn)確的判斷需要多深的神經(jīng)網(wǎng)絡(luò),因此赊舶,先試試Logistic回歸的效果睁搭,然后再依次增加隱藏層的個(gè)數(shù),最后在保留交叉驗(yàn)證數(shù)據(jù)或開(kāi)發(fā)集上進(jìn)行評(píng)估的做法是比較合理的笼平。隱藏層的個(gè)數(shù)可以看做是一個(gè)可以自由選擇數(shù)值大小的超參數(shù)园骆。
圖2為一個(gè)四層神經(jīng)網(wǎng)絡(luò),它包含3個(gè)隱藏層寓调。每個(gè)隱藏層的隱藏單元個(gè)數(shù)為5锌唾、5、3夺英,有一個(gè)輸出單元晌涕。我們以這個(gè)神經(jīng)網(wǎng)絡(luò)為參照,介紹下用來(lái)描述深度神經(jīng)網(wǎng)絡(luò)的符號(hào):
- L表示神經(jīng)網(wǎng)絡(luò)的層數(shù)痛悯,圖2中的神經(jīng)網(wǎng)絡(luò)L=4余黎;
- n[l]表示l層上的節(jié)點(diǎn)(單元)數(shù)量,輸入層標(biāo)記為第0層载萌,則圖2中的神經(jīng)網(wǎng)絡(luò)各層節(jié)點(diǎn)數(shù)可表示為:n[1]=5驯耻,n[2]=5亲族,n[3]=3炒考,n[4]=n[L]=1可缚,輸入層表示為n[0]=nx=3;
- a[l]表示l層中的激活函數(shù)斋枢,a[l]=g[l](z[l])帘靡;
- w[l]表示在a[l]中計(jì)算z[l]值的權(quán)重;
- b[l]也是在a[l]方程中使用瓤帚。
輸入特征用x表示描姚,但同時(shí),x也是第0層的激活函數(shù)戈次,因此轩勘,a0=x。最后一層的激活函數(shù)a[L]=y帽怯邪,也就是說(shuō)a[L]等于這個(gè)神經(jīng)網(wǎng)絡(luò)的預(yù)測(cè)結(jié)果y帽绊寻。
2. 深層網(wǎng)絡(luò)中的前向傳播(Forward Propagation in a Deep Network)
本節(jié)課中主要講解了如何在深度網(wǎng)絡(luò)中靈活應(yīng)用正向和反向傳播。跟以前一樣悬秉,我們先來(lái)看看對(duì)其中一個(gè)訓(xùn)練樣本x該怎么應(yīng)用正向傳播澄步,然后再介紹對(duì)整個(gè)訓(xùn)練集應(yīng)用正向傳播的向量化過(guò)程。本節(jié)課我們以四層神經(jīng)網(wǎng)絡(luò)(圖3)為例和泌,對(duì)深層網(wǎng)絡(luò)的前向傳播進(jìn)行詳細(xì)講解村缸。
給定一個(gè)輸入特征x,計(jì)算第一層的激活單元:
- 首先需要計(jì)算z[1]:
其中武氓,w[1]和b[1]是會(huì)影響到第一層激活單元的參數(shù)梯皿,輸入特征x也可表示為a[0],因?yàn)檩斎胩卣飨蛄縳也是第0層的激活函數(shù)县恕。
- 然后計(jì)算第一層的激活函數(shù)东羹,激活函數(shù)g取決于它所在的層數(shù):
當(dāng)?shù)谝粚拥募せ詈瘮?shù)計(jì)算好了之后,第二層的該如何計(jì)算呢弱睦?與第一層激活函數(shù)計(jì)算過(guò)程相同百姓,首先需要計(jì)算z[2],就是第二層的權(quán)重矩陣w[2]乘以第一層的輸出值a[1]况木,再加上第二層的偏置向量b[2]垒拢。然后計(jì)算a[2],它為作用于z[2]的激活函數(shù)火惊。符號(hào)化第二層的兩個(gè)公式為:
第三層以此類(lèi)推求类,不再贅述。
第四層也就是輸出層的計(jì)算公式為:
第四層的輸出a[4]即為想要估算的y帽的值屹耐。
從上述第一層到第四層的推導(dǎo)過(guò)程可以總結(jié)出一個(gè)激活函數(shù)計(jì)算的通用公式:
剛剛我們已經(jīng)推導(dǎo)了一遍一個(gè)訓(xùn)練樣本的計(jì)算過(guò)程尸疆,那么接下來(lái)我們?cè)賮?lái)看一下,怎樣用向量化的方法訓(xùn)練整個(gè)訓(xùn)練集。
我們將所有樣本的每一步計(jì)算過(guò)程的矩陣進(jìn)行向量化寿弱,即可得到下列計(jì)算公式:
對(duì)上述公式進(jìn)行抽象化犯眠,得到下述深層網(wǎng)絡(luò)各層針對(duì)所有訓(xùn)練樣本計(jì)算的通用公式:
其中A[0]=X,即為所有訓(xùn)練集樣本的輸入特征向量症革。
我們可以看到深層網(wǎng)絡(luò)的正向傳播過(guò)程每層的激活函數(shù)計(jì)算過(guò)程都十分類(lèi)似筐咧,但目前并沒(méi)有太好的辦法能夠在不顯示調(diào)用for循環(huán)的情況下,對(duì)所有層的激活函數(shù)進(jìn)行計(jì)算噪矛。因此量蕊,在正向傳播過(guò)程中,計(jì)算每一層的激活函數(shù)艇挨,顯示調(diào)用for循環(huán)來(lái)執(zhí)行是可以接受的残炮。
此外,上述推導(dǎo)過(guò)程看起來(lái)可能是似曾相識(shí)缩滨,原因是這個(gè)推導(dǎo)過(guò)程與單隱層的神經(jīng)網(wǎng)絡(luò)計(jì)算步驟是相似的势就,區(qū)別在于深層網(wǎng)絡(luò)需要多重復(fù)幾遍這個(gè)過(guò)程。
事實(shí)上楷怒,我們?cè)趯?shí)現(xiàn)深度神經(jīng)網(wǎng)絡(luò)的過(guò)程中蛋勺,想增加得到?jīng)]有bug的程序的概率的其中一個(gè)方法就是非常仔細(xì)、系統(tǒng)化的去思考矩陣的維數(shù)鸠删。Andrew傳授了一個(gè)比較好的做法就是:在檢查代碼的時(shí)候抱完,拿出一張紙來(lái),邊檢查代碼刃泡,邊仔細(xì)思考每一步操作的矩陣的維數(shù)预厌, 具體做法將在下一節(jié)課中講解曼玩。
3. 核對(duì)矩陣的維數(shù)(Getting your matrix dimensions right)
本節(jié)課以五層神經(jīng)網(wǎng)絡(luò)(圖4)為例徐勃,對(duì)實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)算法過(guò)程中的矩陣維數(shù)的核對(duì)過(guò)程進(jìn)行詳細(xì)說(shuō)明败匹。
圖4中的各層神經(jīng)元個(gè)數(shù)分別為:
做這種運(yùn)算時(shí),一般要檢查的公式是:在實(shí)現(xiàn)第l層中矩陣的時(shí)候桨踪,矩陣w[l]的維度必須是(n[l],n[l-1])老翘,向量b[l]的維度必須是(n[l],1)。
反向傳播的dw[l]的維度應(yīng)與w[l]的維度相同锻离,同樣的db[l]的維度與b[l]的相同铺峭。
接下來(lái)要檢查的是z[l]、x和a[l]的維度汽纠。根據(jù)上一節(jié)中的a[l]計(jì)算公式可知卫键,a[l]與z[l]的維度相同。
按照一貫做法虱朵,上面分析了一個(gè)訓(xùn)練樣本各個(gè)矩陣的維度莉炉,下面我們來(lái)看一下向量化實(shí)現(xiàn)過(guò)程中钓账,這些矩陣維度的變化情況。
即使實(shí)現(xiàn)過(guò)程已經(jīng)向量化了絮宁,w[l]梆暮、b[l]、dw[l]和db[l]的維度都不會(huì)變化羞福,多樣本的向量化與單樣本計(jì)算是一致的惕蹄。但Z、A以及X的維度會(huì)在向量化后發(fā)生變化治专,下面我們來(lái)分析一下發(fā)生變化的原因:
首先,根據(jù)之前的分析遭顶,我們已知單個(gè)樣本的z[l]計(jì)算公式為:
其中张峰,z[l]的維度為(n[l],1),w[l]的維度為(n[l],n[l-1])棒旗,a[l-1]的維度為(n[l-1],1)喘批,b[l]的維度為(n[l],1)。
而向量化后铣揉,Z[l]的計(jì)算公式為:
Z[l]代表的是zl水平堆疊形成的矩陣饶深,具體表示為:
從上述公式可以看出,Z[l]的維度不再是(n[l],1)逛拱,維度變成(n[l],m)敌厘,其中,m是訓(xùn)練集的大小朽合,即訓(xùn)練集中樣本的個(gè)數(shù)俱两。
同樣的,A[l-1]是將m個(gè)樣本的al-1水平堆疊在一起形成曹步,因此它的維度變成(n[l-1],m)宪彩。
這里有一點(diǎn)需要注意,由于W[l]與A[l-1]的乘積得出的矩陣維度為(n[l],m)讲婚,根據(jù)線性代數(shù)矩陣加法的規(guī)則尿孔,另一個(gè)加數(shù)b[l]的維度也應(yīng)該是(n[l],m)。但我們剛剛說(shuō)b[l]的維度單樣本與多樣本向量化后沒(méi)有區(qū)別筹麸,這是為什么呢活合?
這主要還是依賴(lài)于Python的廣播技術(shù),它可以將(n[l],1)維向量自動(dòng)擴(kuò)展復(fù)制成一個(gè)(n[l],m)的矩陣竹捉。
在代碼實(shí)現(xiàn)深度神經(jīng)網(wǎng)絡(luò)的算法過(guò)程中芜辕,確保所有矩陣維度前后一致,能夠幫助我們排除一些可能的bug來(lái)源块差。
4. 為什么使用深層表示(Why deep representations?)
我們都知道侵续,深度神經(jīng)網(wǎng)絡(luò)能解決好多問(wèn)題倔丈,其實(shí)并不需要很大的神經(jīng)網(wǎng)絡(luò),但是得有深度状蜗,或者說(shuō)需要有很多隱藏層需五。為什么會(huì)有這樣的需求呢?下面通過(guò)幾個(gè)例子直觀的理解下為什么深度神經(jīng)網(wǎng)絡(luò)會(huì)很好用轧坎。
首先宏邮,深度網(wǎng)絡(luò)究竟在計(jì)算什么呢?我們通過(guò)人臉識(shí)別(人臉檢測(cè))系統(tǒng)為例來(lái)看一下缸血。在人臉識(shí)別系統(tǒng)中蜜氨,當(dāng)輸入一張人臉照片時(shí)(照片在計(jì)算機(jī)中存儲(chǔ)為RGB各自對(duì)應(yīng)的矩陣,即輸入特征向量)捎泻,深度神經(jīng)網(wǎng)絡(luò)的第一層可以看作是一個(gè)特征探測(cè)器(或者邊緣探測(cè)器)飒炎,假設(shè)第一層的隱藏單元共有24個(gè),接下來(lái)看一下笆豁,這些隱藏單元是怎么針對(duì)圖6中的人臉進(jìn)行計(jì)算的郎汪。
圖7中的每個(gè)小方格代表一個(gè)隱藏單元,不同的隱藏單元會(huì)去尋找圖片的不同邊緣位置闯狱。專(zhuān)門(mén)用來(lái)做圖像識(shí)別的卷積神經(jīng)網(wǎng)絡(luò)將在后面的課程中講解煞赢,到那時(shí)會(huì)詳細(xì)解釋為什么一個(gè)隱藏單元是用一個(gè)小方格表示的,這里先不作解釋哄孤。
可以先把神經(jīng)網(wǎng)絡(luò)的第一層當(dāng)作看圖找照片的各個(gè)邊緣照筑,然后將這些組成邊緣的像素放到一起,形成第一層的輸出录豺,即第二層的輸入朦肘。第二層將不同的邊緣像素進(jìn)行組合,形成面部的不同部分双饥,比如可能有一個(gè)神經(jīng)元專(zhuān)門(mén)負(fù)責(zé)找眼睛的部分媒抠,另一個(gè)神經(jīng)元在找鼻子的部分。通過(guò)把許多邊緣結(jié)合在一起咏花,就可以開(kāi)始檢測(cè)人臉的不同部分趴生。
第三層將第二層輸出的人臉的不同部分組合在一起,就可以識(shí)別或探測(cè)出不同的人臉昏翰。
總結(jié)下苍匆,在人臉識(shí)別過(guò)程中,可以直觀的將神經(jīng)網(wǎng)絡(luò)的前幾層看作是探測(cè)簡(jiǎn)單特征的函數(shù)棚菊,如邊緣浸踩。然后在之后的幾層中將前幾層識(shí)別出的特征進(jìn)行組合,以便神經(jīng)網(wǎng)絡(luò)的層次越深统求,能夠?qū)W習(xí)的函數(shù)越復(fù)雜检碗。圖7-圖9的更深層含義將在卷積神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)過(guò)程中做更深入的介紹据块。
還有一個(gè)技術(shù)性的細(xì)節(jié)需要理解的是:邊緣探測(cè)器其實(shí)相對(duì)來(lái)說(shuō)都是針對(duì)照片中非常小塊的面積,參照?qǐng)D6中的一個(gè)小方格折剃。而面部識(shí)別則會(huì)針對(duì)更大一些的區(qū)域另假,參照?qǐng)D9。但核心思想是:在做人臉識(shí)別時(shí)怕犁,一般都會(huì)從較小的細(xì)節(jié)入手边篮,比如邊緣,然后再一步步將上一步的特征進(jìn)行組合來(lái)識(shí)別更復(fù)雜的部位奏甫,如一只眼睛或一個(gè)鼻子戈轿;再將眼睛和鼻子組裝到一起,形成更復(fù)雜的部分扶檐。
這種從簡(jiǎn)單到復(fù)雜的金字塔狀表示法或組織方法也可以應(yīng)用在圖像或人臉識(shí)別以外的其他數(shù)據(jù)上凶杖。比如要建立一個(gè)語(yǔ)音識(shí)別系統(tǒng)的時(shí)候,需要解決的就是如何識(shí)別一個(gè)音頻片段中的語(yǔ)義款筑。那么,神經(jīng)網(wǎng)絡(luò)需要依次學(xué)習(xí)以下內(nèi)容:
第一步: 學(xué)習(xí)檢測(cè)比較低層次的音頻波形的一些特征腾么,比如音調(diào)是變高了還是變低了奈梳、分辨白噪音、咝咝的聲音解虱、音調(diào)等攘须。
第二步: 將上一步學(xué)習(xí)的音頻波形組合在一起,就可以去探測(cè)聲音的基本單元殴泰,在語(yǔ)言學(xué)中稱(chēng)為音位(phonemes)于宙。
第三步: 在具備基本聲音單元學(xué)習(xí)能力后,將這些音位進(jìn)行組合就能夠識(shí)別出音頻中的單詞悍汛。
第四步: 將這些單詞進(jìn)行組合就能夠識(shí)別出短語(yǔ)或句子捞魁。
所以,有多個(gè)隱藏層的深度神經(jīng)網(wǎng)絡(luò)可以在前幾層學(xué)習(xí)一些比較低層次的簡(jiǎn)單特征离咐,然后在后面幾層中谱俭,將這些簡(jiǎn)單特征組合起來(lái)去檢測(cè)更復(fù)雜的東西。