第5周
九窖铡、神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)(Neural Networks: Learning)
9.1 代價函數(shù)
參考視頻: 9 - 1 - Cost Function (7 min).mkv
首先引入一些便于稍后討論的新標記方法:
假設(shè)神經(jīng)網(wǎng)絡(luò)的訓(xùn)練樣本有個溉委,每個包含一組輸入
和一組輸出信號
点待,
表示神經(jīng)網(wǎng)絡(luò)層數(shù),
表示每層的neuron個數(shù)(
表示輸出層神經(jīng)元個數(shù))畴椰,
代表最后一層中處理單元的個數(shù)。
將神經(jīng)網(wǎng)絡(luò)的分類定義為兩種情況:二類分類和多類分類鸽粉,
二類分類:表示哪一類斜脂;
類分類:
表示分到第
類;
我們回顧邏輯回歸問題中我們的代價函數(shù)為:
在邏輯回歸中触机,我們只有一個輸出變量帚戳,又稱標量(scalar),也只有一個因變量儡首,但是在神經(jīng)網(wǎng)絡(luò)中片任,我們可以有很多輸出變量,我們的
是一個維度為
的向量蔬胯,并且我們訓(xùn)練集中的因變量也是同樣維度的一個向量对供,因此我們的代價函數(shù)會比邏輯回歸更加復(fù)雜一些,為:
這個看起來復(fù)雜很多的代價函數(shù)背后的思想還是一樣的氛濒,我們希望通過代價函數(shù)來觀察算法預(yù)測的結(jié)果與真實情況的誤差有多大产场,唯一不同的是,對于每一行特征舞竿,我們都會給出個預(yù)測京景,基本上我們可以利用循環(huán),對每一行特征都預(yù)測
個不同結(jié)果骗奖,然后在利用循環(huán)在
個預(yù)測中選擇可能性最高的一個确徙,將其與
中的實際數(shù)據(jù)進行比較。
正則化的那一項只是排除了每一層后执桌,每一層的
矩陣的和鄙皇。最里層的循環(huán)
循環(huán)所有的行(由
層的激活單元數(shù)決定),循環(huán)
則循環(huán)所有的列鼻吮,由該層(
層)的激活單元數(shù)所決定育苟。即:
與真實值之間的距離為每個樣本-每個類輸出的加和,對參數(shù)進行regularization的bias項處理所有參數(shù)的平方和椎木。
9.2 反向傳播算法
參考視頻: 9 - 2 - Backpropagation Algorithm (12 min).mkv
之前我們在計算神經(jīng)網(wǎng)絡(luò)預(yù)測結(jié)果的時候我們采用了一種正向傳播方法违柏,我們從第一層開始正向一層一層進行計算,直到最后一層的香椎。
現(xiàn)在漱竖,為了計算代價函數(shù)的偏導(dǎo)數(shù),我們需要采用一種反向傳播算法畜伐,也就是首先計算最后一層的誤差馍惹,然后再一層一層反向求出各層的誤差,直到倒數(shù)第二層。
以一個例子來說明反向傳播算法万矾。
假設(shè)我們的訓(xùn)練集只有一個樣本悼吱,我們的神經(jīng)網(wǎng)絡(luò)是一個四層的神經(jīng)網(wǎng)絡(luò),其中
:
前向傳播算法:
下面的公式推導(dǎo)過程見:https://blog.csdn.net/qq_29762941/article/details/80343185
我們從最后一層的誤差開始計算,誤差是激活單元的預(yù)測()與實際值(
)之間的誤差薪丁,(
)遇西。
我們用來表示誤差,則:
我們利用這個誤差值來計算前一層的誤差:
其中 是
形函數(shù)的導(dǎo)數(shù)严嗜,
粱檀。而
則是權(quán)重導(dǎo)致的誤差的和。下一步是繼續(xù)計算第二層的誤差:
因為第一層是輸入變量漫玄,不存在誤差茄蚯。我們有了所有的誤差的表達式后,便可以計算代價函數(shù)的偏導(dǎo)數(shù)了称近,假設(shè)第队,即我們不做任何正則化處理時有:
重要的是清楚地知道上面式子中上下標的含義:
代表目前所計算的是第幾層。
代表目前計算層中的激活單元的下標刨秆,也將是下一層的第
個輸入變量的下標凳谦。
代表下一層中誤差單元的下標,是受到權(quán)重矩陣中第
行影響的下一層中的誤差單元的下標衡未。
如果我們考慮正則化處理尸执,并且我們的訓(xùn)練集是一個特征矩陣而非向量。在上面的特殊情況中缓醋,我們需要計算每一層的誤差單元來計算代價函數(shù)的偏導(dǎo)數(shù)如失。在更為一般的情況中,我們同樣需要計算每一層的誤差單元送粱,但是我們需要為整個訓(xùn)練集計算誤差單元褪贵,此時的誤差單元也是一個矩陣,我們用來表示這個誤差矩陣抗俄。第
層的第
個激活單元受到第
個參數(shù)影響而導(dǎo)致的誤差脆丁。
我們的算法表示為:
即首先用正向傳播方法計算出每一層的激活單元,利用訓(xùn)練集的結(jié)果與神經(jīng)網(wǎng)絡(luò)預(yù)測的結(jié)果求出最后一層的誤差动雹,然后利用該誤差運用反向傳播法計算出直至第二層的所有誤差槽卫。
在求出了之后,我們便可以計算代價函數(shù)的偏導(dǎo)數(shù)了胰蝠,計算方法如下:
在Octave 中歼培,如果我們要使用 fminuc
這樣的優(yōu)化算法來求解求出權(quán)重矩陣震蒋,我們需要將矩陣首先展開成為向量,在利用算法求出最優(yōu)解后再重新轉(zhuǎn)換回矩陣躲庄。
假設(shè)我們有三個權(quán)重矩陣查剖,Theta1,Theta2 和 Theta3噪窘,尺寸分別為 10*11梗搅,10*11 和1*11,
下面的代碼可以實現(xiàn)這樣的轉(zhuǎn)換:
thetaVec = [Theta1(:) ; Theta2(:) ; Theta3(:)]
...optimization using functions like fminuc...
Theta1 = reshape(thetaVec(1:110, 10, 11);
Theta2 = reshape(thetaVec(111:220, 10, 11);
Theta1 = reshape(thetaVec(221:231, 1, 11);
9.3 反向傳播算法的直觀理解
參考視頻: 9 - 3 - Backpropagation Intuition (13 min).mkv
在上一段視頻中效览,我們介紹了反向傳播算法,對很多人來說荡短,當?shù)谝淮慰吹竭@種算法時丐枉,第一印象通常是,這個算法需要那么多繁雜的步驟掘托,簡直是太復(fù)雜了瘦锹,實在不知道這些步驟,到底應(yīng)該如何合在一起使用闪盔。就好像一個黑箱弯院,里面充滿了復(fù)雜的步驟。如果你對反向傳播算法也有這種感受的話泪掀,這其實是正常的听绳,相比于線性回歸算法和邏輯回歸算法而言,從數(shù)學(xué)的角度上講异赫,反向傳播算法似乎并不簡潔椅挣,對于反向傳播這種算法,其實我已經(jīng)使用了很多年了塔拳,但即便如此鼠证,即使是現(xiàn)在,我也經(jīng)常感覺自己對反向傳播算法的理解并不是十分深入靠抑,對于反向傳播算法究竟是如何執(zhí)行的量九,并沒有一個很直觀的理解。做過編程練習(xí)的同學(xué)應(yīng)該可以感受到這些練習(xí)或多或少能幫助你颂碧,將這些復(fù)雜的步驟梳理了一遍荠列,鞏固了反向傳播算法具體是如何實現(xiàn)的,這樣你才能自己掌握這種算法稚伍。
在這段視頻中弯予,我想更加深入地討論一下反向傳播算法的這些復(fù)雜的步驟,并且希望給你一個更加全面直觀的感受个曙,理解這些步驟究竟是在做什么锈嫩,也希望通過這段視頻受楼,你能理解,它至少還是一個合理的算法呼寸。但可能你即使看了這段視頻艳汽,你還是覺得反向傳播依然很復(fù)雜,依然像一個黑箱对雪,太多復(fù)雜的步驟河狐,依然感到有點神奇,這也是沒關(guān)系的瑟捣。即使是我接觸反向傳播這么多年了馋艺,有時候仍然覺得這是一個難以理解的算法,但還是希望這段視頻能有些許幫助迈套,為了更好地理解反向傳播算法捐祠,我們再來仔細研究一下前向傳播的原理:
前向傳播算法:
反向傳播算法做的是:
感悟:上圖中的 理解如下:
相當于是第
層的第
單元中得到的激活項的“誤差”,即”正確“的
與計算得到的
的差桑李。
而 踱蛀,(g為sigmoid函數(shù))。我們可以想象
為函數(shù)求導(dǎo)時邁出的那一丁點微分贵白,所以更準確的說
9.4 實現(xiàn)注意:展開參數(shù)
參考視頻: 9 - 4 - Implementation Note_ Unrolling Parameters (8 min).mkv
在上一段視頻中率拒,我們談到了怎樣使用反向傳播算法計算代價函數(shù)的導(dǎo)數(shù)。在這段視頻中禁荒,我想快速地向你介紹一個細節(jié)的實現(xiàn)過程猬膨,怎樣把你的參數(shù)從矩陣展開成向量,以便我們在高級最優(yōu)化步驟中的使用需要圈浇。
9.5 梯度檢驗
參考視頻: 9 - 5 - Gradient Checking (12 min).mkv
當我們對一個較為復(fù)雜的模型(例如神經(jīng)網(wǎng)絡(luò))使用梯度下降算法時寥掐,可能會存在一些不容易察覺的錯誤,意味著磷蜀,雖然代價看上去在不斷減小召耘,但最終的結(jié)果可能并不是最優(yōu)解。
為了避免這樣的問題褐隆,我們采取一種叫做梯度的數(shù)值檢驗(Numerical Gradient Checking)方法污它。這種方法的思想是通過估計梯度值來檢驗我們計算的導(dǎo)數(shù)值是否真的是我們要求的。
對梯度的估計采用的方法是在代價函數(shù)上沿著切線的方向選擇離兩個非常近的點然后計算兩個點的平均值用以估計梯度庶弃。即對于某個特定的 衫贬,我們計算出在
-
處和
+
的代價值(
是一個非常小的值,通常選取 0.001)歇攻,然后求兩個代價的平均固惯,用以估計在
處的代價值。
Octave 中代碼如下:
gradApprox = (J(theta + eps) – J(theta - eps)) / (2*eps)
當是一個向量時缴守,我們則需要對偏導(dǎo)數(shù)進行檢驗葬毫。因為代價函數(shù)的偏導(dǎo)數(shù)檢驗只針對一個參數(shù)的改變進行檢驗镇辉,下面是一個只針對
進行檢驗的示例:
最后我們還需要對通過反向傳播方法計算出的偏導(dǎo)數(shù)進行檢驗。
根據(jù)上面的算法贴捡,計算出的偏導(dǎo)數(shù)存儲在矩陣 中忽肛。檢驗時,我們要將該矩陣展開成為向量烂斋,同時我們也將
矩陣展開為向量屹逛,我們針對每一個
都計算一個近似的梯度值,將這些值存儲于一個近似梯度矩陣中汛骂,最終將得出的這個矩陣同
進行比較罕模。
9.6 隨機初始化
參考視頻: 9 - 6 - Random Initialization (7 min).mkv
任何優(yōu)化算法都需要一些初始的參數(shù)。到目前為止我們都是初始所有參數(shù)為0帘瞭,這樣的初始方法對于邏輯回歸來說是可行的手销,但是對于神經(jīng)網(wǎng)絡(luò)來說是不可行的。如果我們令所有的初始參數(shù)都為0图张,這將意味著我們第二層的所有激活單元都會有相同的值。同理诈悍,如果我們初始所有的參數(shù)都為一個非0的數(shù)祸轮,結(jié)果也是一樣的。
我們通常初始參數(shù)為正負ε之間的隨機值侥钳,假設(shè)我們要隨機初始一個尺寸為10×11的參數(shù)矩陣适袜,代碼如下:
Theta1 = rand(10, 11) * (2*eps) – eps
9.7 綜合起來
參考視頻: 9 - 7 - Putting It Together (14 min).mkv
小結(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ù)量。
如果隱藏層數(shù)大于1给猾,確保每個隱藏層的單元個數(shù)相同疫萤,通常情況下隱藏層單元的個數(shù)越多越好。
我們真正要決定的是隱藏層的層數(shù)和每個中間層的單元數(shù)敢伸。
訓(xùn)練神經(jīng)網(wǎng)絡(luò):
參數(shù)的隨機初始化
利用正向傳播方法計算所有的
編寫計算代價函數(shù)
的代碼
利用反向傳播方法計算所有偏導(dǎo)數(shù)
利用數(shù)值檢驗方法檢驗這些偏導(dǎo)數(shù)
使用優(yōu)化算法來最小化代價函數(shù)
9.8 自主駕駛
參考視頻: 9 - 8 - Autonomous Driving (7 min).mkv
在這段視頻中扯饶,我想向你介紹一個具有歷史意義的神經(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ò)便能夠準確地模擬人類駕駛者的駕駛方向混萝,對其他道路類型,也重復(fù)進行這個訓(xùn)練過程萍恕,當網(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)了一個交叉十字路口购撼,當車輛到達這個十字路口時,我們單行道網(wǎng)絡(luò)對應(yīng)的自信度驟減谴仙,當它穿過這個十字路口時迂求,前方的雙車道將進入其視線,雙車道網(wǎng)絡(luò)的自信度便開始上升晃跺,當它的自信度上升時揩局,雙車道的網(wǎng)絡(luò),將被選擇來控制行駛方向掀虎,車輛將被安全地引導(dǎo)進入雙車道路凌盯。
這就是基于神經(jīng)網(wǎng)絡(luò)的自動駕駛技術(shù)付枫。當然,我們還有很多更加先進的試驗來實現(xiàn)自動駕駛技術(shù)驰怎。在美國阐滩,歐洲等一些國家和地區(qū),他們提供了一些比這個方法更加穩(wěn)定的駕駛控制技術(shù)县忌。但我認為掂榔,使用這樣一個簡單的基于反向傳播的神經(jīng)網(wǎng)絡(luò),訓(xùn)練出如此強大的自動駕駛汽車芹枷,的確是一次令人驚訝的成就衅疙。