該系列文章為,觀看“吳恩達(dá)機(jī)器學(xué)習(xí)”系列視頻的學(xué)習(xí)筆記。雖然每個(gè)視頻都很簡單,但不得不說每一句都非常的簡潔扼要,淺顯易懂。非常適合我這樣的小白入門。
本章含蓋
- 10.1 代價(jià)函數(shù)
- 10.2 反向傳播算法
- 10.3 理解反向傳播
- 10.4 梯度檢測(cè)
- 10.5 隨機(jī)初始化
- 10.6 組合到一起
- 10.7 無人駕駛
10.1 代價(jià)函數(shù)
為神經(jīng)網(wǎng)絡(luò)擬合參數(shù)的算法

假設(shè)神經(jīng)網(wǎng)絡(luò)的訓(xùn)練樣本有m個(gè),每個(gè)包含一組輸入x和一組輸出信號(hào)y;
L表示神經(jīng)網(wǎng)絡(luò)總層數(shù);(?? L = 4)
S_I表示每層的neuron個(gè)數(shù)(S_l表示輸出層神經(jīng)元個(gè)數(shù)),S_L代表最后一層中處理單元的個(gè)數(shù)。
左邊為“二元分類”問題,這種情況下,我們會(huì)有一個(gè)輸出單元。
右邊為“多類別分類”問題,也就是說會(huì)有K個(gè)不同的類。輸出為 K維向量。其中,K >= 3
擬合神經(jīng)網(wǎng)絡(luò)參數(shù)的代價(jià)函數(shù):
在神經(jīng)網(wǎng)絡(luò)中,我們使用的代價(jià)函數(shù)是邏輯回歸中我們使用的代價(jià)函數(shù)的一般形式
??邏輯回歸代價(jià)函數(shù)僅有一個(gè)輸出單元,即,y^(i)

??表示第 i 個(gè)輸出。即,K 維向量中的第 i 個(gè)元素。

這個(gè)求和項(xiàng),主要是 K 個(gè)輸出單元之和。比如,我們有4個(gè)輸出單元,那么代碼函數(shù),就是依次將每個(gè)輸出單元的代價(jià)
“正則項(xiàng)”就是(所有 θ 的平方和)* λ
10.2 反向傳播算法
讓代價(jià)函數(shù)最小化的方法,即,“反向傳播算法”


??實(shí)現(xiàn)了,把向前傳播向量化。
為了計(jì)算“導(dǎo)數(shù)項(xiàng)”,我們將采用一種叫做“反向傳播(backpropagation)”的算法


我們用δ來表示誤差,則:δ^(4) = a^(4)-y
j 表示輸出向量的第 j 個(gè)元素。
如,δ^(3) = (Θ(3))T * δ^(4) * g’(z^(3)) 可以理解為:δ^(3) / ((Θ(3))T * δ^(4)) = g’(z^(3))。即,輸出的誤差/輸入的誤差 = 斜率 (注意,這里輸入的誤差,是反向傳播的輸入誤差)

如果你把,δ、a、y 都看成向量,你可以這么寫,那么你就會(huì)得到一個(gè)向量化的表達(dá)式。這個(gè)時(shí)候,δ、a、y 分別表示一個(gè)向量,且維度相同,都等于輸出單元的個(gè)數(shù)。
『. *』向量乘法。MATLAB中的寫法。
注意,沒有 δ^(1),因?yàn)椋簩?duì)于輸入層,那只是表示我們?cè)谟?xùn)練集觀察到的,所以不會(huì)存在誤差。也就是說,我們是不想改變這些值的。
“反向傳播”名字的由來,是因?yàn)槲覀儚妮敵鰪拈_始計(jì)算δ,然后是倒數(shù)第二層(隱藏層),以此類推。。。我們類似于把輸出層的誤差,反向傳播給了第3層(即,倒數(shù)第二層),然后再傳到第二層,,,
然而,這個(gè)推導(dǎo)過程是出奇的麻煩和出奇的復(fù)雜。。。
在不太嚴(yán)謹(jǐn)?shù)那闆r下:
??忽略了標(biāo)準(zhǔn)化項(xiàng),或者 λ = 0;
m 個(gè)訓(xùn)練集的情況下:

△ 表示 大寫的 δ


在得到每個(gè) ij 的偏導(dǎo)項(xiàng)之后,你就可以使用梯度下降或者另一種高級(jí)優(yōu)化算法
10.3 理解反向傳播

z2^(1)、 z2^(2)是輸入單元的加權(quán)和。
反向傳播的過程和前向傳播非常相似。只是這兩個(gè)算法計(jì)算的方向不一樣而已。

比起這個(gè)復(fù)雜的表達(dá)式,你可以把cost(i)近似地當(dāng)成是“神經(jīng)網(wǎng)絡(luò)輸出值”與“實(shí)際值”的方差

就像邏輯回歸中,實(shí)際中會(huì)偏向于選擇比較復(fù)雜的、帶對(duì)數(shù)形式的代價(jià)函數(shù),但為了方便理解,可以把這個(gè)代價(jià)函數(shù)看作是某種方差函數(shù)。因此,cost(i)表示了神經(jīng)網(wǎng)絡(luò)樣本值的準(zhǔn)確程度,也就是,神經(jīng)網(wǎng)絡(luò)的輸出值 和 實(shí)際觀測(cè)值y(i) 的接近程度。

反向傳播算法,一種直觀的理解是:反向傳播算法就是在計(jì)算這些 δ_j^(l) 項(xiàng),我們可以把它看做是我們?cè)诘?l 層中 第 j 個(gè)單元中得到的激活項(xiàng)的“誤差”。
它們(這些 δ^(l)_j )衡量的是,為了影響這些中間值,我們想要改變神經(jīng)網(wǎng)絡(luò)中的權(quán)重的程度,進(jìn)而影響整個(gè)神經(jīng)網(wǎng)絡(luò)的輸出h(x),并影響所有的代價(jià)函數(shù)
注意,?? δ 是不包括偏置單元的(bias unit)。這取決于你對(duì)“反向傳播”的定義,以及實(shí)現(xiàn)算法的方式,你也可以用其他的方式,來計(jì)算包含偏置單元的 δ 值。偏置單元的輸出總是“+1”,并且始終如此,我們無法改變。這都取決于你對(duì)反向傳播的實(shí)現(xiàn)。我經(jīng)常用的方式是,在最終的計(jì)算中,我會(huì)丟掉它們(即,δ^(j)_0),因?yàn)樗鼈儾粫?huì)對(duì)偏導(dǎo)數(shù)造成影響。
10.4 梯度檢測(cè)
反向傳播算法有一個(gè)不好的特性:很容易產(chǎn)生一些微妙的bug,當(dāng)它與梯度下降或是其他算法一同工作時(shí),看起來它確實(shí)能正常運(yùn)行,并且代價(jià)函數(shù)J(θ)在每次梯度下降的迭代中,也在不斷的減小。雖然在反向傳播的實(shí)現(xiàn)中,存在一些bug,但運(yùn)行情況確實(shí)不錯(cuò)。雖然J(θ)在不斷減小,但是到了最后,你得到的神經(jīng)網(wǎng)絡(luò)其實(shí)誤差將會(huì)比無bug的情況下高出一個(gè)量級(jí),并且你很可能不知道你得到的結(jié)果,是由bug所導(dǎo)致的。那我們應(yīng)該如何應(yīng)對(duì)了?(←這個(gè)bug幾乎都是由于你的錯(cuò)誤實(shí)現(xiàn)導(dǎo)致的)
有一種思想叫做“梯度檢驗(yàn)”,它能解決幾乎所有這種問題。這種方法的思想是通過估計(jì)梯度值來檢驗(yàn)我們計(jì)算的導(dǎo)數(shù)值是否真的是我們要求的。
“紅色的線”就是我們所求的“θ偏導(dǎo)數(shù)(藍(lán)色切線的斜率)”的近似值。注意,ε 是離 θ 很近的一個(gè)點(diǎn),如果離的太遠(yuǎn),這個(gè)算出來的近似值誤差就會(huì)很大了。。。
ε 一般取值為:10^(-4) ;一般不會(huì)取更小的值了,雖然 ε 足夠小時(shí),就可以看做是 θ點(diǎn)的偏導(dǎo)數(shù),因?yàn)榭赡軙?huì)引發(fā)很多數(shù)值問題。。
當(dāng) θ ∈ R(即,θ 是實(shí)數(shù) 時(shí))


??單測(cè)差分。另一種估計(jì)偏導(dǎo)數(shù)的公式。

當(dāng) θ 為 向量參數(shù)的時(shí)候,θ ∈ R^n (E.g. θ is "unrolled" version of Θ(1),Θ(2),Θ^(3))

逐個(gè)元素的求偏導(dǎo)數(shù)。

最后,記得關(guān)閉“梯度檢測(cè)”,因?yàn)?,它是一個(gè)計(jì)算量非常大的,也是非常慢的計(jì)算導(dǎo)數(shù)程序。相對(duì)地,反向傳播算法,它是一個(gè)高性能的計(jì)算導(dǎo)數(shù)的方法。因此,一旦通過測(cè)試,反向傳播的實(shí)現(xiàn)是正確的,就應(yīng)該關(guān)閉掉梯度檢驗(yàn)。
當(dāng)我們實(shí)現(xiàn)反向傳播,或類似梯度下降的算法來計(jì)算復(fù)雜模型時(shí),我經(jīng)常使用梯度檢驗(yàn)來幫助我確保我的代碼是正確的。
10.5 隨機(jī)初始化
關(guān)于梯度下降,我們?cè)撊绾螌?duì) θ 設(shè)置初始值呢?

有一種想法是將 θ 的初始值全部設(shè)為0。盡管在邏輯回歸中,這么做是被允許的,但實(shí)際上在訓(xùn)練網(wǎng)絡(luò)時(shí),將所有的參數(shù)初始化為0,起不到任何作用
-
舉例:
如果我們將 θ 的初始值全部設(shè)為 0 的話,會(huì)導(dǎo)致同一層的a^(l)_j都是相同的(即 i 相同時(shí),即,藍(lán)色線的權(quán)重總是相同,紅色線的權(quán)重總是相同,綠色線的權(quán)重總是相同),而且它們還有相同的輸入。也因?yàn)閍^(l)_j都是相同,所有 δ^(l)_j 也都是一樣的了。
這意味著,即時(shí)在每一次的梯度下降更新中,以為δ(l)_j是一樣的,導(dǎo)致更新后的a(l)_j還是相同的(即 i 相同時(shí),即,藍(lán)色線的權(quán)重總是相同,紅色線的權(quán)重總是相同,綠色線的權(quán)重總是相同,雖然它們都不再等于0)。
又因?yàn)椋??圖中 兩個(gè)隱藏單元的輸入?yún)?shù)都是相同的,而藍(lán)色線的權(quán)重總是相同,紅色線的權(quán)重總是相同,綠色線的權(quán)重總是相同。這意味著,即時(shí)進(jìn)行了一次迭代,但這兩個(gè)隱藏單元依然是相同的函數(shù)。這意味著,這個(gè)神經(jīng)網(wǎng)絡(luò)計(jì)算不出什么有趣的函數(shù)。因?yàn)?,若每層的隱藏單元都有一樣的輸入時(shí),那么每層的神經(jīng)單元總是相同的函數(shù)。。。這是一種高度冗余的現(xiàn)象,所有的單元都在計(jì)算相同的特征,這也導(dǎo)致最后的輸出單元也只計(jì)算了一種特征。這種做法是阻止了神經(jīng)網(wǎng)絡(luò)去學(xué)習(xí)有趣的東西。
為了解決這個(gè)問題(??也叫做,對(duì)稱權(quán)重問題),在神經(jīng)網(wǎng)絡(luò)中,對(duì)參數(shù)進(jìn)行初始化時(shí),要使用隨機(jī)初始化的思想。
因此對(duì)于每一個(gè) θ 值,我們將其初始化為一個(gè)范圍在 -ε 到 ε 之間的隨機(jī)值。
注意,這里的 ε 和前面所說的“梯度檢測(cè)”的 ε 沒有任何關(guān)系。
總而言之,為了訓(xùn)練神經(jīng)網(wǎng)絡(luò),我們首先要將權(quán)重隨機(jī)初始化為一個(gè)接近 0 的,范圍在 -ε 到 ε 之間的數(shù)。然后進(jìn)行反向傳播,再進(jìn)行梯度檢驗(yàn),最后使用梯度下降或者其他高級(jí)優(yōu)化算法來最小化代價(jià)函數(shù)J,以計(jì)算出 θ 的最優(yōu)值。
10.6 組合到一起
小結(jié)一下使用神經(jīng)網(wǎng)絡(luò)時(shí)的步驟:

網(wǎng)絡(luò)結(jié)構(gòu):
第一件要做的事是選擇網(wǎng)絡(luò)結(jié)構(gòu),即決定選擇多少層以及決定每層分別有多少個(gè)單元。 你可以選擇每一層有多少個(gè)隱藏單元,以及有多個(gè)隱藏層
① 第一層的單元數(shù)即我們訓(xùn)練集的特征數(shù)量。
② 最后一層的單元數(shù)是我們訓(xùn)練集的結(jié)果的類的數(shù)量,即,要區(qū)分的類別個(gè)數(shù)。
③ 對(duì)于隱藏層的單元個(gè)數(shù),以及隱藏層的數(shù)目,一個(gè)合理的默認(rèn)選項(xiàng)是:只使用單個(gè)隱藏層
如果隱藏層數(shù)大于1,同樣也有一個(gè)合理的默認(rèn)選項(xiàng),那就是每一個(gè)隱藏層的單元個(gè)數(shù)相同。
通常情況下隱藏層單元的個(gè)數(shù)越多越好。 但需要注意,如果有多個(gè)隱藏層,計(jì)算量一般會(huì)比較大。當(dāng)然一般來說,隱藏單元還是越多越好。
并且一般來說,每個(gè)隱藏層所包含的單元數(shù)量還應(yīng)該和輸入的 x 維度相匹配,即和特征的數(shù)目匹配,隱藏單元的數(shù)目可以和輸入特征的數(shù)目相同,或者是它的2倍,或者是3、4倍。因此,隱藏單元的數(shù)目和輸入特征數(shù)目相匹配或者比特征數(shù)大幾倍都是有效的。
我們真正要決定的是隱藏層的層數(shù)和每個(gè)中間層的單元數(shù)。
訓(xùn)練神經(jīng)網(wǎng)絡(luò):
??更先進(jìn)的實(shí)現(xiàn),如,使用向量化方式。而不使用 for 循環(huán)。實(shí)際上有復(fù)雜的方法可以實(shí)現(xiàn),并不一定要使用for循環(huán),但我非常不推薦,在第一次實(shí)現(xiàn)反向傳播算法的時(shí)候使用更復(fù)雜更高級(jí)的方法

- 參數(shù)的隨機(jī)初始化 。通常,我們將參數(shù)初始化為很小的值,接近于零。
- 利用正向傳播方法,對(duì)任意的輸入 x^(i),計(jì)算出對(duì)應(yīng)的h_θ (x^(i)) ,也就是輸出 y 的向量
- 編寫計(jì)算代價(jià)函數(shù) J(θ) 的代碼
- 利用反向傳播方法計(jì)算所有偏導(dǎo)數(shù)
- 利用梯度檢驗(yàn)方法檢驗(yàn)這些偏導(dǎo)數(shù) ,在確認(rèn)偏導(dǎo)數(shù)的正確性后,將梯度檢驗(yàn)關(guān)閉。
- 使用梯度下降或高級(jí)的優(yōu)化算法來最小化代價(jià)函數(shù)
有兩個(gè)參數(shù)的代價(jià)函數(shù)圖:注意,對(duì)于神經(jīng)網(wǎng)絡(luò),代價(jià)函數(shù) J(θ) 是一個(gè)非凸函數(shù),就是說不是凸函數(shù),因此理論上可能停留在局部最小值的位置。實(shí)際上,梯度下降算法和其他一些高級(jí)優(yōu)化方法理論上都可能收斂于局部最小值。但一般來講,在實(shí)際操作中,這不是大問題。盡管我們不能保證,這些優(yōu)化算法一定會(huì)得到全局最優(yōu)值。但通常來說,像梯度下降這類的算法,在最小化代價(jià)函數(shù) J(θ) 的過程中,還是表現(xiàn)得很不錯(cuò)的。通常能夠得到一個(gè)很小的局部最小值,盡管這可能不一定是全局最優(yōu)值。

梯度下降的原理:我們從某個(gè)隨機(jī)的初始點(diǎn)開始,它將會(huì)不停的往下下降,那么反向傳播算法的目的就是算出梯度下降的方向,而梯度下降的作用就是沿著這個(gè)方向一點(diǎn)點(diǎn)的下降,一直到我們希望得到的點(diǎn)。??這個(gè)例子就是局部最優(yōu)點(diǎn)。所以當(dāng)你在執(zhí)行反向傳播算法和梯度下降或者其他更高級(jí)的優(yōu)化方法時(shí),這幅圖片解釋了基本的原理。
反向傳播算法能夠讓更復(fù)雜、強(qiáng)大、非線性的函數(shù)模型,跟你的數(shù)據(jù)很好的擬合。
10.7 無人駕駛
在這段視頻中,我想向你介紹一個(gè)具有歷史意義的神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)的重要例子。那就是使用神經(jīng)網(wǎng)絡(luò)來實(shí)現(xiàn)自動(dòng)駕駛,也就是說使汽車通過學(xué)習(xí)來自己駕駛。接下來我將演示的這段視頻是我從Dean Pomerleau那里拿到的,他是我的同事,任職于美國東海岸的卡耐基梅隆大學(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)行了足夠長的時(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每兩秒將前方的路況圖生成一張數(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ù)。在美國,歐洲等一些國家和地區(qū),他們提供了一些比這個(gè)方法更加穩(wěn)定的駕駛控制技術(shù)。但我認(rèn)為,使用這樣一個(gè)簡單的基于反向傳播的神經(jīng)網(wǎng)絡(luò),訓(xùn)練出如此強(qiáng)大的自動(dòng)駕駛汽車,的確是一次令人驚訝的成就。
