1.代價(jià)函數(shù)
神經(jīng)網(wǎng)絡(luò)在分類問題中的應(yīng)用:
兩種分類問題:
第一種是二元分類;這里的y只能是0或1,在這種情況下,我們會(huì)有且僅有一個(gè)輸出單元。K:輸出層的單元數(shù)目。
第二種是多類別分類問題:即會(huì)有K個(gè)不同的類,有K個(gè)輸出單元,假設(shè)輸出K維向量。

接下來為神經(jīng)網(wǎng)絡(luò)單元定義代價(jià)函數(shù):
這時(shí)我們有K個(gè)輸出單元,神經(jīng)網(wǎng)絡(luò)現(xiàn)在輸出了R^K的向量:

這個(gè)看起來復(fù)雜很多的代價(jià)函數(shù)背后的思想還是一樣的,我們希望通過代價(jià)函數(shù)來觀察算法預(yù)測(cè)的結(jié)果與真實(shí)情況的誤差有多大,唯一不同的是,對(duì)于每一行特征,我們都會(huì)給出K個(gè)預(yù)測(cè),基本上我們可以利用循環(huán),對(duì)每一行特征都預(yù)測(cè)K個(gè)不同結(jié)果,然后在利用循環(huán)在K個(gè)預(yù)測(cè)中選擇可能性最高的一個(gè),將其與 y 中的實(shí)際數(shù)據(jù)進(jìn)行比較。
正則化的那一項(xiàng)只是排除了每一層θ0后,每一層的θ矩陣的和。最里層的循環(huán) j? 循環(huán)所有的行(由s_l? +1 層的激活單元數(shù)決定),循環(huán)i?則循環(huán)所有的列,由該層(s_l?層)的激活單元數(shù)所決定。即:hθ(x)?與真實(shí)值之間的距離為每個(gè)樣本-每個(gè)類輸出的加和,對(duì)參數(shù)進(jìn)行regularization的bias項(xiàng)處理所有參數(shù)的平方和。
2.反向傳播算法
如何讓代價(jià)函數(shù)最小化?反向傳播算法!
之前我們?cè)谟?jì)算神經(jīng)網(wǎng)絡(luò)預(yù)測(cè)結(jié)果的時(shí)候我們采用了一種正向傳播方法,我們從第一層開始正向一層一層進(jìn)行計(jì)算,直到最后一層的hθ(x)?。
現(xiàn)在,為了計(jì)算代價(jià)函數(shù)的偏導(dǎo)數(shù):

我們需要采用一種反向傳播算法,也就是首先計(jì)算最后一層的誤差,然后再一層一層反向求出各層的誤差,直到倒數(shù)第二層。 以一個(gè)例子來說明反向傳播算法。
前向傳播算法:



重要的是清楚地知道上面式子中上下標(biāo)的含義:

如果我們考慮正則化處理,并且我們的訓(xùn)練集是一個(gè)特征矩陣而非向量。在上面的特殊情況中,我們需要計(jì)算每一層的誤差單元來計(jì)算代價(jià)函數(shù)的偏導(dǎo)數(shù)。在更為一般的情況中,我們同樣需要計(jì)算每一層的誤差單元,但是我們需要為整個(gè)訓(xùn)練集計(jì)算誤差單元,此時(shí)的誤差單元也是一個(gè)矩陣,我們用

來表示這個(gè)誤差矩陣。第 l 層的第 i 個(gè)激活單元受到第 j 個(gè)參數(shù)影響而導(dǎo)致的誤差。

如何實(shí)現(xiàn)反向傳播算法來計(jì)算這些參數(shù)的偏導(dǎo)數(shù)?

3.反向傳播算法的直觀理解
在上一段視頻中,我們介紹了反向傳播算法,對(duì)很多人來說,當(dāng)?shù)谝淮慰吹竭@種算法時(shí),第一印象通常是,這個(gè)算法需要那么多繁雜的步驟,簡(jiǎn)直是太復(fù)雜了,實(shí)在不知道這些步驟,到底應(yīng)該如何合在一起使用。就好像一個(gè)黑箱,里面充滿了復(fù)雜的步驟。如果你對(duì)反向傳播算法也有這種感受的話,這其實(shí)是正常的,相比于線性回歸算法和邏輯回歸算法而言,從數(shù)學(xué)的角度上講,反向傳播算法似乎并不簡(jiǎn)潔,對(duì)于反向傳播這種算法,其實(shí)我已經(jīng)使用了很多年了,但即便如此,即使是現(xiàn)在,我也經(jīng)常感覺自己對(duì)反向傳播算法的理解并不是十分深入,對(duì)于反向傳播算法究竟是如何執(zhí)行的,并沒有一個(gè)很直觀的理解。做過編程練習(xí)的同學(xué)應(yīng)該可以感受到這些練習(xí)或多或少能幫助你,將這些復(fù)雜的步驟梳理了一遍,鞏固了反向傳播算法具體是如何實(shí)現(xiàn)的,這樣你才能自己掌握這種算法。
在這段視頻中,我想更加深入地討論一下反向傳播算法的這些復(fù)雜的步驟,并且希望給你一個(gè)更加全面直觀的感受,理解這些步驟究竟是在做什么,也希望通過這段視頻,你能理解,它至少還是一個(gè)合理的算法。但可能你即使看了這段視頻,你還是覺得反向傳播依然很復(fù)雜,依然像一個(gè)黑箱,太多復(fù)雜的步驟,依然感到有點(diǎn)神奇,這也是沒關(guān)系的。即使是我接觸反向傳播這么多年了,有時(shí)候仍然覺得這是一個(gè)難以理解的算法,但還是希望這段視頻能有些許幫助,為了更好地理解反向傳播算法,我們?cè)賮碜屑?xì)研究一下前向傳播的原理:
前向傳播算法:


反向傳播算法做的是:


看了幾個(gè)講解反向傳播的博客,我現(xiàn)在的理解就是,反向傳播就是將神經(jīng)細(xì)胞的輸出誤差反向傳播到輸入端,通過梯度下降來更新神經(jīng)細(xì)胞輸入端的權(quán)重。即首先用正向傳播方法計(jì)算出每一層的激活單元,利用訓(xùn)練集的結(jié)果與神經(jīng)網(wǎng)絡(luò)預(yù)測(cè)的結(jié)果求出最后一層的誤差,然后利用該誤差運(yùn)用反向傳播法計(jì)算出直至第二層的所有誤差。求出誤差值以后,通過偏導(dǎo)數(shù)和鏈?zhǔn)椒▌t將誤差值轉(zhuǎn)換為權(quán)重矩陣。
4.實(shí)現(xiàn)注意:展開參數(shù)
在上一段視頻中,我們談到了怎樣使用反向傳播算法計(jì)算代價(jià)函數(shù)的導(dǎo)數(shù)。在這段視頻中,我想快速地向你介紹一個(gè)細(xì)節(jié)的實(shí)現(xiàn)過程,怎樣把你的參數(shù)從矩陣展開成向量,以便我們?cè)诟呒?jí)最優(yōu)化步驟中的使用需要。



5.梯度檢驗(yàn)
當(dāng)我們對(duì)一個(gè)較為復(fù)雜的模型(例如神經(jīng)網(wǎng)絡(luò))使用梯度下降算法時(shí),可能會(huì)存在一些不容易察覺的錯(cuò)誤,意味著,雖然代價(jià)看上去在不斷減小,但最終的結(jié)果可能并不是最優(yōu)解。
為了避免這樣的問題,我們采取一種叫做梯度的數(shù)值檢驗(yàn)(Numerical Gradient Checking)方法。這種方法的思想是通過估計(jì)梯度值來檢驗(yàn)我們計(jì)算的導(dǎo)數(shù)值是否真的是我們要求的。


從數(shù)值上去估算代價(jià)函數(shù)J關(guān)于任何參數(shù)的偏導(dǎo)數(shù):


在神經(jīng)網(wǎng)絡(luò)中使用這種方法時(shí),使用了for循環(huán),來完成對(duì)神經(jīng)網(wǎng)絡(luò)中代價(jià)函數(shù)的所有參數(shù)的偏導(dǎo)數(shù)的計(jì)算,然后與反向傳播中得到的梯度進(jìn)行比較,以驗(yàn)證反向傳播的實(shí)現(xiàn)是正確的。

總結(jié):如何實(shí)現(xiàn)梯度檢驗(yàn)以及為什么要關(guān)掉梯度檢驗(yàn):
梯度檢驗(yàn)代碼是一個(gè)計(jì)算量非常大的,也是非常慢的計(jì)算導(dǎo)數(shù)的程序,相對(duì)地,我們之前講的反向傳播算法是一個(gè)高性能的計(jì)算導(dǎo)數(shù)的方法,所以一旦你通過梯度檢驗(yàn)反向傳播的算法是正確的,就應(yīng)該關(guān)掉梯度檢驗(yàn)。
重申一下:在運(yùn)行算法之前,比如多次迭代的梯度下降,或是多次迭代,或訓(xùn)練分類器的高級(jí)優(yōu)化算法,先禁用你的梯度檢驗(yàn)代碼。具體地,如果你在每次梯度下降迭代或者在每次代價(jià)函數(shù)的內(nèi)循環(huán)里,都進(jìn)行一次梯度檢驗(yàn),程序就會(huì)變得非常慢,因?yàn)樘荻葯z驗(yàn)代碼相比于反向傳播算法要慢很多。
6.隨機(jī)初始化
當(dāng)你執(zhí)行一個(gè)算法,例如梯度下降法或者高級(jí)優(yōu)化算法時(shí),我們需要為變量θ選取一些初始值。
高級(jí)優(yōu)化算法默認(rèn)你會(huì)給它一個(gè)初始值,在梯度下降法中,初始化完畢后,一步一步通過梯度下降來最小化代價(jià)函數(shù)J,那么應(yīng)該如何對(duì)θ設(shè)初始值呢?有一種想法是將θ值全部設(shè)為0。

但是對(duì)于神經(jīng)網(wǎng)絡(luò),不需要這么做:

這就意味著這個(gè)神經(jīng)網(wǎng)絡(luò)計(jì)算不出什么有趣的函數(shù)!所有的隱藏單元都在計(jì)算相同的特征,所有的隱藏單元都以相同的函數(shù)作為輸出,這是一種高度冗余現(xiàn)象,最后的邏輯回歸單元只能得到一個(gè)特征。為了避免這種情況的發(fā)生,要使用隨機(jī)初始化的思想!

總而言之,為了訓(xùn)練神經(jīng)網(wǎng)絡(luò),應(yīng)首先要將權(quán)重隨機(jī)初始化為一個(gè)接近0的,范圍在-ξ到ξ之間的數(shù),然后進(jìn)行反向傳播,再進(jìn)行梯度檢驗(yàn),最后使用梯度下降或者其他高級(jí)優(yōu)化算法來最小化代價(jià)函數(shù)J,這個(gè)關(guān)于參數(shù)θ的函數(shù)。
這是一種打破對(duì)稱性的操作!
7.綜合起來
神經(jīng)網(wǎng)絡(luò)相互之間有怎么樣的聯(lián)系?以及神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)算法的總體實(shí)現(xiàn)過程?
訓(xùn)練神經(jīng)網(wǎng)絡(luò)時(shí),我們要做的第一件事就是選擇一種網(wǎng)絡(luò)架構(gòu)(神經(jīng)元之間的連接模式),輸入單元,輸出單元,隱藏層!怎么做出選擇呢?
首先我們已經(jīng)定義了輸入單元的數(shù)量,一旦你確定了特征集x,輸入單元的數(shù)量就等于特征x^(i)的維度,輸入單元個(gè)數(shù)就確定下來了。
如果你正在進(jìn)行多類別分類,那么輸出層的數(shù)目將會(huì)由你分類問題中所要區(qū)分的類別個(gè)數(shù)確定,記得把y重新寫成向量的形式。
隱藏層常見的是選擇一層,即單隱藏層(較為合理的默認(rèn)結(jié)構(gòu))?;蛘呷绻闶褂貌恢挂粋€(gè)隱藏層的話,同樣也有一個(gè)合理的默認(rèn)選項(xiàng),那就是每一個(gè)隱藏層通常都應(yīng)有相同的單元數(shù)。通常情況下,隱藏單元越多越好,不過如果有大量的隱藏單元,計(jì)算量一般會(huì)比較大。并且每個(gè)隱藏層所包含的單元數(shù)量還應(yīng)該和輸入x的維度相匹配,即和特征的數(shù)目匹配。隱藏單元的數(shù)目可以和輸入特征的數(shù)量相同或者是它的二倍或者三四倍。

小結(jié)一下使用神經(jīng)網(wǎng)絡(luò)時(shí)的步驟:
網(wǎng)絡(luò)結(jié)構(gòu):第一件要做的事是選擇網(wǎng)絡(luò)結(jié)構(gòu),即決定選擇多少層以及決定每層分別有多少個(gè)單元。
第一層的單元數(shù)即我們訓(xùn)練集的特征數(shù)量。
最后一層的單元數(shù)是我們訓(xùn)練集的結(jié)果的類的數(shù)量。
如果隱藏層數(shù)大于1,確保每個(gè)隱藏層的單元個(gè)數(shù)相同,通常情況下隱藏層單元的個(gè)數(shù)越多越好。
我們真正要決定的是隱藏層的層數(shù)和每個(gè)中間層的單元數(shù)。
訓(xùn)練神經(jīng)網(wǎng)絡(luò):
參數(shù)的隨機(jī)初始化
利用正向傳播方法計(jì)算所有的hθ(x)
編寫計(jì)算代價(jià)函數(shù) J 的代碼
利用反向傳播方法計(jì)算所有偏導(dǎo)數(shù)
利用數(shù)值檢驗(yàn)方法檢驗(yàn)這些偏導(dǎo)數(shù)
使用優(yōu)化算法來最小化代價(jià)函數(shù)
對(duì)于神經(jīng)網(wǎng)絡(luò),J(θ)是一個(gè)非凸函數(shù),因此理論上可能停留在局部最小值的位置,實(shí)際上,梯度下降法和其他一些高級(jí)優(yōu)化算法理論上都可能收斂于局部最小值,但一般來講,在實(shí)際操作中,這些都不是大問題,盡管我們不能保證一定能得到全局最優(yōu)值,但一般而言,算法運(yùn)行的還是不錯(cuò)的,通常能夠得到一個(gè)很小的局部最小值,盡管這可能不是全局最優(yōu)值。

神經(jīng)網(wǎng)絡(luò)的梯度下降法和之前的線性回歸梯度下降法其實(shí)原理差不多!
原理:試圖找到某個(gè)最優(yōu)的參數(shù)值使得神經(jīng)網(wǎng)絡(luò)的輸出值與訓(xùn)練集觀測(cè)到的y^(i)的實(shí)際值盡可能地接近。
不懂!沒關(guān)系!如果你實(shí)現(xiàn)了反向傳播算法,你一定會(huì)發(fā)現(xiàn)這的確是一個(gè)很強(qiáng)大的學(xué)習(xí)算法,如果你執(zhí)行以下這個(gè)算法,執(zhí)行反向傳播,執(zhí)行其中的優(yōu)化算法,你一定會(huì)發(fā)現(xiàn),反向傳播算法能夠讓更復(fù)雜、強(qiáng)大、非線性的函數(shù)模型跟你的數(shù)據(jù)很好地?cái)M合。
8.自主駕駛
在這段視頻中,我想向你介紹一個(gè)具有歷史意義的神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)的重要例子。那就是使用神經(jīng)網(wǎng)絡(luò)來實(shí)現(xiàn)自動(dòng)駕駛,也就是說使汽車通過學(xué)習(xí)來自己駕駛。接下來我將演示的這段視頻是我從 Dean Pomerleau那里拿到的,他是我的同事,任職于美國(guó)東海岸的卡耐基梅隆大學(xué)。在這部分視頻中,你就會(huì)明白可視化技術(shù)到底是什么?在看這段視頻之前,我會(huì)告訴你可視化技術(shù)是什么。
在下面也就是左下方,就是汽車所看到的前方的路況圖像。

在圖中你依稀能看出一條道路,朝左延伸了一點(diǎn),又向右了一點(diǎn),然后上面的這幅圖,你可以看到一條水平的菜單欄顯示的是駕駛操作人選擇的方向。就是這里的這條白亮的區(qū)段顯示的就是人類駕駛者選擇的方向。比如:最左邊的區(qū)段,對(duì)應(yīng)的操作就是向左急轉(zhuǎn),而最右端則對(duì)應(yīng)向右急轉(zhuǎn)的操作。因此,稍微靠左的區(qū)段,也就是中心稍微向左一點(diǎn)的位置,則表示在這一點(diǎn)上人類駕駛者的操作是慢慢的向左拐。
這幅圖的第二部分對(duì)應(yīng)的就是學(xué)習(xí)算法選出的行駛方向。并且,類似的,這一條白亮的區(qū)段顯示的就是神經(jīng)網(wǎng)絡(luò)在這里選擇的行駛方向,是稍微的左轉(zhuǎn),并且實(shí)際上在神經(jīng)網(wǎng)絡(luò)開始學(xué)習(xí)之前,你會(huì)看到網(wǎng)絡(luò)的輸出是一條灰色的區(qū)段,就像這樣的一條灰色區(qū)段覆蓋著整個(gè)區(qū)域這些均稱的灰色區(qū)域,顯示出神經(jīng)網(wǎng)絡(luò)已經(jīng)隨機(jī)初始化了,并且初始化時(shí),我們并不知道汽車如何行駛,或者說我們并不知道所選行駛方向。只有在學(xué)習(xí)算法運(yùn)行了足夠長(zhǎng)的時(shí)間之后,才會(huì)有這條白色的區(qū)段出現(xiàn)在整條灰色區(qū)域之中。顯示出一個(gè)具體的行駛方向這就表示神經(jīng)網(wǎng)絡(luò)算法,在這時(shí)候已經(jīng)選出了一個(gè)明確的行駛方向,不像剛開始的時(shí)候,輸出一段模糊的淺灰色區(qū)域,而是輸出一條白亮的區(qū)段,表示已經(jīng)選出了明確的行駛方向。

ALVINN (Autonomous Land Vehicle In a Neural Network)是一個(gè)基于神經(jīng)網(wǎng)絡(luò)的智能系統(tǒng),通過觀察人類的駕駛來學(xué)習(xí)駕駛,ALVINN能夠控制NavLab,裝在一輛改裝版軍用悍馬,這輛悍馬裝載了傳感器、計(jì)算機(jī)和驅(qū)動(dòng)器用來進(jìn)行自動(dòng)駕駛的導(dǎo)航試驗(yàn)。實(shí)現(xiàn)ALVINN功能的第一步,是對(duì)它進(jìn)行訓(xùn)練,也就是訓(xùn)練一個(gè)人駕駛汽車。

然后讓ALVINN觀看,ALVINN每?jī)擅雽⑶胺降穆窙r圖生成一張數(shù)字化圖片,并且記錄駕駛者的駕駛方向,得到的訓(xùn)練集圖片被壓縮為30x32像素,并且作為輸入提供給ALVINN的三層神經(jīng)網(wǎng)絡(luò),通過使用反向傳播學(xué)習(xí)算法,ALVINN會(huì)訓(xùn)練得到一個(gè)與人類駕駛員操縱方向基本相近的結(jié)果。一開始,我們的網(wǎng)絡(luò)選擇出的方向是隨機(jī)的,大約經(jīng)過兩分鐘的訓(xùn)練后,我們的神經(jīng)網(wǎng)絡(luò)便能夠準(zhǔn)確地模擬人類駕駛者的駕駛方向,對(duì)其他道路類型,也重復(fù)進(jìn)行這個(gè)訓(xùn)練過程,當(dāng)網(wǎng)絡(luò)被訓(xùn)練完成后,操作者就可按下運(yùn)行按鈕,車輛便開始行駛了。

每秒鐘ALVINN生成12次數(shù)字化圖片,并且將圖像傳送給神經(jīng)網(wǎng)絡(luò)進(jìn)行訓(xùn)練,多個(gè)神經(jīng)網(wǎng)絡(luò)同時(shí)工作,每一個(gè)網(wǎng)絡(luò)都生成一個(gè)行駛方向,以及一個(gè)預(yù)測(cè)自信度的參數(shù),預(yù)測(cè)自信度最高的那個(gè)神經(jīng)網(wǎng)絡(luò)得到的行駛方向。比如這里,在這條單行道上訓(xùn)練出的網(wǎng)絡(luò)將被最終用于控制車輛方向,車輛前方突然出現(xiàn)了一個(gè)交叉十字路口,當(dāng)車輛到達(dá)這個(gè)十字路口時(shí),我們單行道網(wǎng)絡(luò)對(duì)應(yīng)的自信度驟減,當(dāng)它穿過這個(gè)十字路口時(shí),前方的雙車道將進(jìn)入其視線,雙車道網(wǎng)絡(luò)的自信度便開始上升,當(dāng)它的自信度上升時(shí),雙車道的網(wǎng)絡(luò),將被選擇來控制行駛方向,車輛將被安全地引導(dǎo)進(jìn)入雙車道路。
這就是基于神經(jīng)網(wǎng)絡(luò)的自動(dòng)駕駛技術(shù)。當(dāng)然,我們還有很多更加先進(jìn)的試驗(yàn)來實(shí)現(xiàn)自動(dòng)駕駛技術(shù)。在美國(guó),歐洲等一些國(guó)家和地區(qū),他們提供了一些比這個(gè)方法更加穩(wěn)定的駕駛控制技術(shù)。但我認(rèn)為,使用這樣一個(gè)簡(jiǎn)單的基于反向傳播的神經(jīng)網(wǎng)絡(luò),訓(xùn)練出如此強(qiáng)大的自動(dòng)駕駛汽車,的確是一次令人驚訝的成就。