該系列文章為赏枚,觀看“吳恩達機器學(xué)習(xí)”系列視頻的學(xué)習(xí)筆記绕娘。雖然每個視頻都很簡單脓规,但不得不說每一句都非常的簡潔扼要,淺顯易懂险领。非常適合我這樣的小白入門侨舆。
本章含蓋
- 10.1 代價函數(shù)
- 10.2 反向傳播算法
- 10.3 理解反向傳播
- 10.4 梯度檢測
- 10.5 隨機初始化
- 10.6 組合到一起
- 10.7 無人駕駛
10.1 代價函數(shù)
為神經(jīng)網(wǎng)絡(luò)擬合參數(shù)的算法
假設(shè)神經(jīng)網(wǎng)絡(luò)的訓(xùn)練樣本有m個,每個包含一組輸入x和一組輸出信號y绢陌;
L表示神經(jīng)網(wǎng)絡(luò)總層數(shù)挨下;(?? L = 4)
S_I表示每層的neuron個數(shù)(S_l表示輸出層神經(jīng)元個數(shù)),S_L代表最后一層中處理單元的個數(shù)脐湾。
左邊為“二元分類”問題臭笆,這種情況下,我們會有一個輸出單元沥割。
右邊為“多類別分類”問題耗啦,也就是說會有K個不同的類。輸出為 K維向量机杜。其中帜讲,K >= 3
擬合神經(jīng)網(wǎng)絡(luò)參數(shù)的代價函數(shù):
在神經(jīng)網(wǎng)絡(luò)中,我們使用的代價函數(shù)是邏輯回歸中我們使用的代價函數(shù)的一般形式??邏輯回歸代價函數(shù)僅有一個輸出單元椒拗,即似将,y^(i)
??表示第 i 個輸出。即蚀苛,K 維向量中的第 i 個元素在验。
這個求和項,主要是 K 個輸出單元之和堵未。比如腋舌,我們有4個輸出單元,那么代碼函數(shù)渗蟹,就是依次將每個輸出單元的代價
“正則項”就是(所有 θ 的平方和)* λ
10.2 反向傳播算法
讓代價函數(shù)最小化的方法块饺,即赞辩,“反向傳播算法”
??實現(xiàn)了,把向前傳播向量化授艰。
為了計算“導(dǎo)數(shù)項”辨嗽,我們將采用一種叫做“反向傳播(backpropagation)”的算法
我們用δ來表示誤差淮腾,則:δ^(4) = a^(4)-y
j 表示輸出向量的第 j 個元素糟需。
如,δ^(3) = (Θ(3))T * δ^(4) * g’(z^(3)) 可以理解為:δ^(3) / ((Θ(3))T * δ^(4)) = g’(z^(3))谷朝。即洲押,輸出的誤差/輸入的誤差 = 斜率 (注意,這里輸入的誤差徘禁,是反向傳播的輸入誤差)
如果你把诅诱,δ髓堪、a送朱、y 都看成向量,你可以這么寫干旁,那么你就會得到一個向量化的表達式驶沼。這個時候,δ争群、a回怜、y 分別表示一個向量,且維度相同换薄,都等于輸出單元的個數(shù)玉雾。
『. *』向量乘法。MATLAB中的寫法轻要。
注意复旬,沒有 δ^(1),因為:對于輸入層冲泥,那只是表示我們在訓(xùn)練集觀察到的驹碍,所以不會存在誤差。也就是說凡恍,我們是不想改變這些值的志秃。
“反向傳播”名字的由來,是因為我們從輸出從開始計算δ嚼酝,然后是倒數(shù)第二層(隱藏層)浮还,以此類推。闽巩。钧舌。我們類似于把輸出層的誤差流码,反向傳播給了第3層(即,倒數(shù)第二層)延刘,然后再傳到第二層漫试,,碘赖,
然而驾荣,這個推導(dǎo)過程是出奇的麻煩和出奇的復(fù)雜。普泡。播掷。
在不太嚴(yán)謹?shù)那闆r下:??忽略了標(biāo)準(zhǔn)化項,或者 λ = 0撼班;
m 個訓(xùn)練集的情況下:
△ 表示 大寫的 δ
在得到每個 ij 的偏導(dǎo)項之后砰嘁,你就可以使用梯度下降或者另一種高級優(yōu)化算法
10.3 理解反向傳播
z2^(1)件炉、 z2^(2)是輸入單元的加權(quán)和。
反向傳播的過程和前向傳播非常相似矮湘。只是這兩個算法計算的方向不一樣而已斟冕。比起這個復(fù)雜的表達式,你可以把cost(i)近似地當(dāng)成是“神經(jīng)網(wǎng)絡(luò)輸出值”與“實際值”的方差
就像邏輯回歸中十办,實際中會偏向于選擇比較復(fù)雜的秀撇、帶對數(shù)形式的代價函數(shù),但為了方便理解向族,可以把這個代價函數(shù)看作是某種方差函數(shù)呵燕。因此,cost(i)表示了神經(jīng)網(wǎng)絡(luò)樣本值的準(zhǔn)確程度炸枣,也就是虏等,神經(jīng)網(wǎng)絡(luò)的輸出值 和 實際觀測值y(i) 的接近程度。
反向傳播算法适肠,一種直觀的理解是:反向傳播算法就是在計算這些 δ_j^(l) 項霍衫,我們可以把它看做是我們在第 l 層中 第 j 個單元中得到的激活項的“誤差”。
它們(這些 δ^(l)_j )衡量的是侯养,為了影響這些中間值敦跌,我們想要改變神經(jīng)網(wǎng)絡(luò)中的權(quán)重的程度,進而影響整個神經(jīng)網(wǎng)絡(luò)的輸出h(x),并影響所有的代價函數(shù)
注意柠傍,?? δ 是不包括偏置單元的(bias unit)麸俘。這取決于你對“反向傳播”的定義,以及實現(xiàn)算法的方式惧笛,你也可以用其他的方式从媚,來計算包含偏置單元的 δ 值。偏置單元的輸出總是“+1”患整,并且始終如此拜效,我們無法改變。這都取決于你對反向傳播的實現(xiàn)各谚。我經(jīng)常用的方式是紧憾,在最終的計算中,我會丟掉它們(即昌渤,δ^(j)_0)赴穗,因為它們不會對偏導(dǎo)數(shù)造成影響。
10.4 梯度檢測
反向傳播算法有一個不好的特性:很容易產(chǎn)生一些微妙的bug膀息,當(dāng)它與梯度下降或是其他算法一同工作時般眉,看起來它確實能正常運行,并且代價函數(shù)J(θ)在每次梯度下降的迭代中履婉,也在不斷的減小煤篙。雖然在反向傳播的實現(xiàn)中斟览,存在一些bug毁腿,但運行情況確實不錯。雖然J(θ)在不斷減小苛茂,但是到了最后已烤,你得到的神經(jīng)網(wǎng)絡(luò)其實誤差將會比無bug的情況下高出一個量級,并且你很可能不知道你得到的結(jié)果妓羊,是由bug所導(dǎo)致的胯究。那我們應(yīng)該如何應(yīng)對了?(←這個bug幾乎都是由于你的錯誤實現(xiàn)導(dǎo)致的)
有一種思想叫做“梯度檢驗”躁绸,它能解決幾乎所有這種問題裕循。這種方法的思想是通過估計梯度值來檢驗我們計算的導(dǎo)數(shù)值是否真的是我們要求的。
“紅色的線”就是我們所求的“θ偏導(dǎo)數(shù)(藍色切線的斜率)”的近似值净刮。注意剥哑,ε 是離 θ 很近的一個點,如果離的太遠淹父,這個算出來的近似值誤差就會很大了株婴。。暑认。
ε 一般取值為:10^(-4) 困介;一般不會取更小的值了大审,雖然 ε 足夠小時,就可以看做是 θ點的偏導(dǎo)數(shù)座哩,因為可能會引發(fā)很多數(shù)值問題徒扶。。
當(dāng) θ ∈ R(即根穷,θ 是實數(shù) 時)
??單測差分酷愧。另一種估計偏導(dǎo)數(shù)的公式。
當(dāng) θ 為 向量參數(shù)的時候溶浴,θ ∈ R^n (E.g. θ is "unrolled" version of Θ(1),Θ(2)管引,Θ^(3))
逐個元素的求偏導(dǎo)數(shù)士败。
最后,記得關(guān)閉“梯度檢測”褥伴,因為谅将,它是一個計算量非常大的,也是非常慢的計算導(dǎo)數(shù)程序重慢。相對地饥臂,反向傳播算法,它是一個高性能的計算導(dǎo)數(shù)的方法似踱。因此隅熙,一旦通過測試,反向傳播的實現(xiàn)是正確的核芽,就應(yīng)該關(guān)閉掉梯度檢驗囚戚。
當(dāng)我們實現(xiàn)反向傳播,或類似梯度下降的算法來計算復(fù)雜模型時轧简,我經(jīng)常使用梯度檢驗來幫助我確保我的代碼是正確的驰坊。
10.5 隨機初始化
關(guān)于梯度下降,我們該如何對 θ 設(shè)置初始值呢哮独?
有一種想法是將 θ 的初始值全部設(shè)為0拳芙。盡管在邏輯回歸中,這么做是被允許的皮璧,但實際上在訓(xùn)練網(wǎng)絡(luò)時舟扎,將所有的參數(shù)初始化為0,起不到任何作用
-
舉例:
如果我們將 θ 的初始值全部設(shè)為 0 的話恶导,會導(dǎo)致同一層的a^(l)_j都是相同的(即 i 相同時浆竭,即,藍色線的權(quán)重總是相同,紅色線的權(quán)重總是相同邦泄,綠色線的權(quán)重總是相同)删窒,而且它們還有相同的輸入。也因為a^(l)_j都是相同顺囊,所有 δ^(l)_j 也都是一樣的了肌索。
這意味著,即時在每一次的梯度下降更新中特碳,以為δ(l)_j是一樣的诚亚,導(dǎo)致更新后的a(l)_j還是相同的(即 i 相同時,即午乓,藍色線的權(quán)重總是相同站宗,紅色線的權(quán)重總是相同,綠色線的權(quán)重總是相同益愈,雖然它們都不再等于0)梢灭。
又因為,??圖中 兩個隱藏單元的輸入?yún)?shù)都是相同的蒸其,而藍色線的權(quán)重總是相同敏释,紅色線的權(quán)重總是相同,綠色線的權(quán)重總是相同摸袁。這意味著钥顽,即時進行了一次迭代,但這兩個隱藏單元依然是相同的函數(shù)靠汁。這意味著蜂大,這個神經(jīng)網(wǎng)絡(luò)計算不出什么有趣的函數(shù)。因為膀曾,若每層的隱藏單元都有一樣的輸入時县爬,那么每層的神經(jīng)單元總是相同的函數(shù)。添谊。。這是一種高度冗余的現(xiàn)象察迟,所有的單元都在計算相同的特征斩狱,這也導(dǎo)致最后的輸出單元也只計算了一種特征。這種做法是阻止了神經(jīng)網(wǎng)絡(luò)去學(xué)習(xí)有趣的東西扎瓶。
為了解決這個問題(??也叫做所踊,對稱權(quán)重問題),在神經(jīng)網(wǎng)絡(luò)中概荷,對參數(shù)進行初始化時秕岛,要使用隨機初始化的思想。因此對于每一個 θ 值,我們將其初始化為一個范圍在 -ε 到 ε 之間的隨機值继薛。
注意修壕,這里的 ε 和前面所說的“梯度檢測”的 ε 沒有任何關(guān)系。
總而言之遏考,為了訓(xùn)練神經(jīng)網(wǎng)絡(luò)慈鸠,我們首先要將權(quán)重隨機初始化為一個接近 0 的,范圍在 -ε 到 ε 之間的數(shù)灌具。然后進行反向傳播青团,再進行梯度檢驗,最后使用梯度下降或者其他高級優(yōu)化算法來最小化代價函數(shù)J咖楣,以計算出 θ 的最優(yōu)值督笆。
10.6 組合到一起
小結(jié)一下使用神經(jīng)網(wǎng)絡(luò)時的步驟:
網(wǎng)絡(luò)結(jié)構(gòu):
第一件要做的事是選擇網(wǎng)絡(luò)結(jié)構(gòu),即決定選擇多少層以及決定每層分別有多少個單元诱贿。 你可以選擇每一層有多少個隱藏單元胖腾,以及有多個隱藏層
① 第一層的單元數(shù)即我們訓(xùn)練集的特征數(shù)量。
② 最后一層的單元數(shù)是我們訓(xùn)練集的結(jié)果的類的數(shù)量瘪松,即咸作,要區(qū)分的類別個數(shù)。
③ 對于隱藏層的單元個數(shù)宵睦,以及隱藏層的數(shù)目记罚,一個合理的默認選項是:只使用單個隱藏層
如果隱藏層數(shù)大于1,同樣也有一個合理的默認選項壳嚎,那就是每一個隱藏層的單元個數(shù)相同桐智。
通常情況下隱藏層單元的個數(shù)越多越好。 但需要注意烟馅,如果有多個隱藏層说庭,計算量一般會比較大。當(dāng)然一般來說郑趁,隱藏單元還是越多越好刊驴。
并且一般來說,每個隱藏層所包含的單元數(shù)量還應(yīng)該和輸入的 x 維度相匹配寡润,即和特征的數(shù)目匹配捆憎,隱藏單元的數(shù)目可以和輸入特征的數(shù)目相同,或者是它的2倍梭纹,或者是3躲惰、4倍。因此变抽,隱藏單元的數(shù)目和輸入特征數(shù)目相匹配或者比特征數(shù)大幾倍都是有效的础拨。
我們真正要決定的是隱藏層的層數(shù)和每個中間層的單元數(shù)氮块。
訓(xùn)練神經(jīng)網(wǎng)絡(luò):??更先進的實現(xiàn),如诡宗,使用向量化方式滔蝉。而不使用 for 循環(huán)。實際上有復(fù)雜的方法可以實現(xiàn)僚焦,并不一定要使用for循環(huán)锰提,但我非常不推薦,在第一次實現(xiàn)反向傳播算法的時候使用更復(fù)雜更高級的方法
- 參數(shù)的隨機初始化 芳悲。通常立肘,我們將參數(shù)初始化為很小的值,接近于零名扛。
- 利用正向傳播方法谅年,對任意的輸入 x^(i),計算出對應(yīng)的h_θ (x^(i)) 肮韧,也就是輸出 y 的向量
- 編寫計算代價函數(shù) J(θ) 的代碼
- 利用反向傳播方法計算所有偏導(dǎo)數(shù)
- 利用梯度檢驗方法檢驗這些偏導(dǎo)數(shù) 融蹂,在確認偏導(dǎo)數(shù)的正確性后,將梯度檢驗關(guān)閉弄企。
- 使用梯度下降或高級的優(yōu)化算法來最小化代價函數(shù)
有兩個參數(shù)的代價函數(shù)圖:注意超燃,對于神經(jīng)網(wǎng)絡(luò),代價函數(shù) J(θ) 是一個非凸函數(shù)拘领,就是說不是凸函數(shù)意乓,因此理論上可能停留在局部最小值的位置。實際上约素,梯度下降算法和其他一些高級優(yōu)化方法理論上都可能收斂于局部最小值届良。但一般來講,在實際操作中圣猎,這不是大問題士葫。盡管我們不能保證,這些優(yōu)化算法一定會得到全局最優(yōu)值送悔。但通常來說慢显,像梯度下降這類的算法,在最小化代價函數(shù) J(θ) 的過程中放祟,還是表現(xiàn)得很不錯的鳍怨。通常能夠得到一個很小的局部最小值,盡管這可能不一定是全局最優(yōu)值跪妥。
梯度下降的原理:我們從某個隨機的初始點開始,它將會不停的往下下降声滥,那么反向傳播算法的目的就是算出梯度下降的方向眉撵,而梯度下降的作用就是沿著這個方向一點點的下降侦香,一直到我們希望得到的點。??這個例子就是局部最優(yōu)點纽疟。所以當(dāng)你在執(zhí)行反向傳播算法和梯度下降或者其他更高級的優(yōu)化方法時罐韩,這幅圖片解釋了基本的原理。
反向傳播算法能夠讓更復(fù)雜污朽、強大散吵、非線性的函數(shù)模型,跟你的數(shù)據(jù)很好的擬合蟆肆。
10.7 無人駕駛
在這段視頻中矾睦,我想向你介紹一個具有歷史意義的神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)的重要例子。那就是使用神經(jīng)網(wǎng)絡(luò)來實現(xiàn)自動駕駛炎功,也就是說使汽車通過學(xué)習(xí)來自己駕駛枚冗。接下來我將演示的這段視頻是我從Dean Pomerleau那里拿到的,他是我的同事蛇损,任職于美國東海岸的卡耐基梅隆大學(xué)赁温。在這部分視頻中,你就會明白可視化技術(shù)到底是什么淤齐?在看這段視頻之前股囊,我會告訴你可視化技術(shù)是什么。
在下面也就是左下方更啄,就是汽車所看到的前方的路況圖像稚疹。
在圖中你依稀能看出一條道路,朝左延伸了一點锈死,又向右了一點贫堰,然后上面的這幅圖,你可以看到一條水平的菜單欄(左上圖待牵,第一條)顯示的是駕駛操作人選擇的方向其屏。就是這里的這條白亮的區(qū)段顯示的就是人類駕駛者選擇的方向。比如:最左邊的區(qū)段缨该,對應(yīng)的操作就是向左急轉(zhuǎn)偎行,而最右端則對應(yīng)向右急轉(zhuǎn)的操作。因此贰拿,稍微靠左的區(qū)段蛤袒,也就是中心稍微向左一點的位置,則表示在這一點上人類駕駛者的操作是慢慢的向左拐膨更。
這幅圖的第二部分(左上圖妙真,第二條)對應(yīng)的就是學(xué)習(xí)算法選出的行駛方向。并且荚守,類似的珍德,這一條白亮的區(qū)段顯示的就是神經(jīng)網(wǎng)絡(luò)在這里選擇的行駛方向练般,是稍微的左轉(zhuǎn),并且實際上在神經(jīng)網(wǎng)絡(luò)開始學(xué)習(xí)之前锈候,你會看到網(wǎng)絡(luò)的輸出是一條灰色的區(qū)段薄料,就像這樣的一條灰色區(qū)段覆蓋著整個區(qū)域這些均稱的灰色區(qū)域,顯示出神經(jīng)網(wǎng)絡(luò)已經(jīng)隨機初始化了泵琳,并且初始化時摄职,我們并不知道汽車如何行駛,或者說我們并不知道所選行駛方向获列。只有在學(xué)習(xí)算法運行了足夠長的時間之后谷市,才會有這條白色的區(qū)段出現(xiàn)在整條灰色區(qū)域之中。顯示出一個具體的行駛方向這就表示神經(jīng)網(wǎng)絡(luò)算法蛛倦,在這時候已經(jīng)選出了一個明確的行駛方向歌懒,不像剛開始的時候,輸出一段模糊的淺灰色區(qū)域溯壶,而是輸出一條白亮的區(qū)段及皂,表示已經(jīng)選出了明確的行駛方向。
ALVINN (Autonomous Land Vehicle In a Neural Network)是一個基于神經(jīng)網(wǎng)絡(luò)的智能系統(tǒng)且改,通過觀察人類的駕駛來學(xué)習(xí)駕駛验烧,ALVINN能夠控制NavLab,裝在一輛改裝版軍用悍馬又跛,這輛悍馬裝載了傳感器碍拆、計算機和驅(qū)動器用來進行自動駕駛的導(dǎo)航試驗。實現(xiàn)ALVINN功能的第一步慨蓝,是對它進行訓(xùn)練感混,也就是訓(xùn)練一個人駕駛汽車。
然后讓ALVINN觀看礼烈,ALVINN每兩秒將前方的路況圖生成一張數(shù)字化圖片弧满,并且記錄駕駛者的駕駛方向,得到的訓(xùn)練集圖片被壓縮為30x32像素此熬,并且作為輸入提供給ALVINN的三層神經(jīng)網(wǎng)絡(luò)庭呜,通過使用反向傳播學(xué)習(xí)算法,ALVINN會訓(xùn)練得到一個與人類駕駛員操縱方向基本相近的結(jié)果犀忱。一開始募谎,我們的網(wǎng)絡(luò)選擇出的方向是隨機的,大約經(jīng)過兩分鐘的訓(xùn)練后阴汇,我們的神經(jīng)網(wǎng)絡(luò)便能夠準(zhǔn)確地模擬人類駕駛者的駕駛方向数冬,對其他道路類型,也重復(fù)進行這個訓(xùn)練過程搀庶,當(dāng)網(wǎng)絡(luò)被訓(xùn)練完成后吉执,操作者就可按下運行按鈕疯淫,車輛便開始行駛了地来。
每秒鐘ALVINN生成12次數(shù)字化圖片戳玫,并且將圖像傳送給神經(jīng)網(wǎng)絡(luò)進行訓(xùn)練,多個神經(jīng)網(wǎng)絡(luò)同時工作未斑,每一個網(wǎng)絡(luò)都生成一個行駛方向咕宿,以及一個預(yù)測自信度的參數(shù),預(yù)測自信度最高的那個神經(jīng)網(wǎng)絡(luò)得到的行駛方向蜡秽。比如這里府阀,在這條單行道上訓(xùn)練出的網(wǎng)絡(luò)將被最終用于控制車輛方向,車輛前方突然出現(xiàn)了一個交叉十字路口芽突,當(dāng)車輛到達這個十字路口時试浙,我們單行道網(wǎng)絡(luò)對應(yīng)的自信度驟減,當(dāng)它穿過這個十字路口時寞蚌,前方的雙車道將進入其視線田巴,雙車道網(wǎng)絡(luò)的自信度便開始上升,當(dāng)它的自信度上升時挟秤,雙車道的網(wǎng)絡(luò)壹哺,將被選擇來控制行駛方向,車輛將被安全地引導(dǎo)進入雙車道路艘刚。
這就是基于神經(jīng)網(wǎng)絡(luò)的自動駕駛技術(shù)。當(dāng)然,我們還有很多更加先進的試驗來實現(xiàn)自動駕駛技術(shù)坎拐。在美國馁启,歐洲等一些國家和地區(qū),他們提供了一些比這個方法更加穩(wěn)定的駕駛控制技術(shù)秋度。但我認為炸庞,使用這樣一個簡單的基于反向傳播的神經(jīng)網(wǎng)絡(luò),訓(xùn)練出如此強大的自動駕駛汽車静陈,的確是一次令人驚訝的成就燕雁。