假設神經網絡的訓練樣本有m個,每一個包含一組輸入x和一組輸出信號y,L表示神經網絡層數,S_I表示每層的neuron個數(S_l表示輸出層神經元個數),S_L表明最後一層中處理單元的個數。 html
將神經網絡的分類定義爲兩種狀況:二類分類和多類分類,git
二類分類:表示哪一類;github
K類分類:表示分到第i類;k>2算法
咱們回顧邏輯迴歸問題中咱們的代價函數爲:編程
在邏輯迴歸中,咱們只有一個輸出變量,又稱標量(scalar),也只有一個因變量y,可是在神經網絡中,咱們能夠有不少輸出變量,咱們的是一個維度爲K的向量,而且咱們訓練集中的因變量也是一樣維度的一個向量,所以咱們的代價函數會比邏輯迴歸更加複雜一些,爲:安全
這個看起來複雜不少的代價函數背後的思想仍是同樣的,咱們但願經過代價函數來觀察算法預測的結果與真實狀況的偏差有多大,惟一不一樣的是,對於每一行特徵,咱們都會給出K個預測,基本上咱們能夠利用循環,對每一行特徵都預測K個不一樣結果,而後在利用循環在K個預測中選擇可能性最高的一個,將其與y中的實際數據進行比較。markdown
正則化的那一項只是排除了每一層後,每一層的矩陣的和。最裏層的循環j循環全部的行(由 層的激活單元數決定),循環 i 則循環全部的列,由該層(層)的激活單元數所決定。即: 與真實值之間的距離爲每一個樣本-每一個類輸出的加和,對參數進行regularization的bias項處理全部參數的平方和。網絡
以前咱們在計算神經網絡預測結果的時候咱們採用了一種正向傳播方法,咱們從第一層開始正向一層一層進行計算,直到最後一層的。機器學習
如今,爲了計算代價函數的偏導數,咱們須要採用一種反向傳播算法,也就是首先計算最後一層的偏差,而後再一層一層反向求出各層的偏差,直到倒數第二層。 以一個例子來講明反向傳播算法。函數
假設咱們的訓練集只有一個樣本,咱們的神經網絡是一個四層的神經網絡,其中K=4,S_L=4,L=4:
前向傳播算法:
下面的公式推導過程見:https://blog.csdn.net/qq_29762941/article/details/80343185
咱們從最後一層的偏差開始計算,偏差是激活單元的預測()與實際值()之間的偏差,()。 咱們用來表示偏差,則: 咱們利用這個偏差值來計算前一層的偏差: 其中 是 S 形函數的導數,。而則是權重致使的偏差的和。下一步是繼續計算第二層的偏差: 由於第一層是輸入變量,不存在偏差。咱們有了全部的偏差的表達式後,即可以計算代價函數的偏導數了,假設,即咱們不作任何正則化處理時有:
重要的是清楚地知道上面式子中上下標的含義:
l 表明目前所計算的是第幾層。
j 表明目前計算層中的激活單元的下標,也將是下一層的第j個輸入變量的下標。
i 表明下一層中偏差單元的下標,是受到權重矩陣中第i行影響的下一層中的偏差單元的下標。
若是咱們考慮正則化處理,而且咱們的訓練集是一個特徵矩陣而非向量。在上面的特殊狀況中,咱們須要計算每一層的偏差單元來計算代價函數的偏導數。在更爲通常的狀況中,咱們一樣須要計算每一層的偏差單元,可是咱們須要爲整個訓練集計算偏差單元,此時的偏差單元也是一個矩陣,咱們用來表示這個偏差矩陣。第 l 層的第 i 個激活單元受到第 j 個參數影響而致使的偏差。
咱們的算法表示爲:
即首先用正向傳播方法計算出每一層的激活單元,利用訓練集的結果與神經網絡預測的結果求出最後一層的偏差,而後利用該偏差運用反向傳播法計算出直至第二層的全部偏差。
在求出了以後,咱們即可以計算代價函數的偏導數了,計算方法以下:
在Octave 中,若是咱們要使用 fminuc
這樣的優化算法來求解求出權重矩陣,咱們須要將矩陣首先展開成爲向量,在利用算法求出最優解後再從新轉換回矩陣。
假設咱們有三個權重矩陣,Theta1,Theta2 和 Theta3,尺寸分別爲 10*11,10*11 和1*11, 下面的代碼能夠實現這樣的轉換:
在上一段視頻中,咱們介紹了反向傳播算法,對不少人來講,當第一次看到這種算法時,第一印象一般是,這個算法須要那麼多繁雜的步驟,簡直是太複雜了,實在不知道這些步驟,到底應該如何合在一塊兒使用。就好像一個黑箱,裏面充滿了複雜的步驟。若是你對反向傳播算法也有這種感覺的話,這實際上是正常的,相比於線性迴歸算法和邏輯迴歸算法而言,從數學的角度上講,反向傳播算法彷佛並不簡潔,對於反向傳播這種算法,其實我已經使用了不少年了,但即使如此,即便是如今,我也常常感受本身對反向傳播算法的理解並非十分深刻,對於反向傳播算法到底是如何執行的,並無一個很直觀的理解。作過編程練習的同窗應該能夠感覺到這些練習或多或少能幫助你,將這些複雜的步驟梳理了一遍,鞏固了反向傳播算法具體是如何實現的,這樣你才能本身掌握這種算法。
在這段視頻中,我想更加深刻地討論一下反向傳播算法的這些複雜的步驟,而且但願給你一個更加全面直觀的感覺,理解這些步驟到底是在作什麼,也但願經過這段視頻,你能理解,它至少仍是一個合理的算法。但可能你即便看了這段視頻,你仍是以爲反向傳播依然很複雜,依然像一個黑箱,太多複雜的步驟,依然感到有點神奇,這也是不要緊的。即便是我接觸反向傳播這麼多年了,有時候仍然以爲這是一個難以理解的算法,但仍是但願這段視頻能有些許幫助,爲了更好地理解反向傳播算法,咱們再來仔細研究一下前向傳播的原理:
前向傳播算法:
反向傳播算法作的是:
感悟:上圖中的 理解以下:
至關因而第 l 層的第 j單元中獲得的激活項的「偏差」,即」正確「的 與計算獲得的 的差。
而 ,(g爲sigmoid函數)。咱們能夠想象 爲函數求導時邁出的那一丁點微分,因此更準確的說
在上一段視頻中,咱們談到了怎樣使用反向傳播算法計算代價函數的導數。在這段視頻中,我想快速地向你介紹一個細節的實現過程,怎樣把你的參數從矩陣展開成向量,以便咱們在高級最優化步驟中的使用須要。
當咱們對一個較爲複雜的模型(例如神經網絡)使用梯度降低算法時,可能會存在一些不容易察覺的錯誤,意味着,雖然代價看上去在不斷減少,但最終的結果可能並非最優解。
爲了不這樣的問題,咱們採起一種叫作梯度的數值檢驗(Numerical Gradient Checking)方法。這種方法的思想是經過估計梯度值來檢驗咱們計算的導數值是否真的是咱們要求的。
對梯度的估計採用的方法是在代價函數上沿着切線的方向選擇離兩個很是近的點而後計算兩個點的平均值用以估計梯度。即對於某個特定的 ,咱們計算出在 處和 的代價值(是一個很是小的值,一般選取 0.001),而後求兩個代價的平均,用以估計在 處的代價值。
當是一個向量時,咱們則須要對偏導數進行檢驗。由於代價函數的偏導數檢驗只針對一個參數的改變進行檢驗,下面是一個只針對進行檢驗的示例:
最後咱們還須要對經過反向傳播方法計算出的偏導數進行檢驗。
根據上面的算法,計算出的偏導數存儲在矩陣中。檢驗時,咱們要將該矩陣展開成爲向量,同時咱們也將 矩陣展開爲向量,咱們針對每個 都計算一個近似的梯度值,將這些值存儲於一個近似梯度矩陣中,最終將得出的這個矩陣同 進行比較。
任何優化算法都須要一些初始的參數。到目前爲止咱們都是初始全部參數爲0,這樣的初始方法對於邏輯迴歸來講是可行的,可是對於神經網絡來講是不可行的。若是咱們令全部的初始參數都爲0,這將意味着咱們第二層的全部激活單元都會有相同的值。同理,若是咱們初始全部的參數都爲一個非0的數,結果也是同樣的。
咱們一般初始參數爲正負ε之間的隨機值,假設咱們要隨機初始一個尺寸爲10×11的參數矩陣,代碼以下:
小結一下使用神經網絡時的步驟:
網絡結構:第一件要作的事是選擇網絡結構,即決定選擇多少層以及決定每層分別有多少個單元。
第一層的單元數即咱們訓練集的特徵數量。
最後一層的單元數是咱們訓練集的結果的類的數量。
若是隱藏層數大於1,確保每一個隱藏層的單元個數相同,一般狀況下隱藏層單元的個數越多越好。
咱們真正要決定的是隱藏層的層數和每一箇中間層的單元數。
訓練神經網絡:
參數的隨機初始化
利用正向傳播方法計算全部的$h_{\theta}(x)$
編寫計算代價函數 $J$ 的代碼
利用反向傳播方法計算全部偏導數
利用數值檢驗方法檢驗這些偏導數
使用優化算法來最小化代價函數
在這段視頻中,我想向你介紹一個具備歷史意義的神經網絡學習的重要例子。那就是使用神經網絡來實現自動駕駛,也就是說使汽車經過學習來本身駕駛。接下來我將演示的這段視頻是我從 Dean Pomerleau那裏拿到的,他是個人同事,任職於美國東海岸的卡耐基梅隆大學。在這部分視頻中,你就會明白可視化技術究竟是什麼?在看這段視頻以前,我會告訴你可視化技術是什麼。
在下面也就是左下方,就是汽車所看到的前方的路況圖像。
在圖中你依稀能看出一條道路,朝左延伸了一點,又向右了一點,而後上面的這幅圖,你能夠看到一條水平的菜單欄顯示的是駕駛操做人選擇的方向。就是這裏的這條白亮的區段顯示的就是人類駕駛者選擇的方向。好比:最左邊的區段,對應的操做就是向左急轉,而最右端則對應向右急轉的操做。所以,稍微靠左的區段,也就是中心稍微向左一點的位置,則表示在這一點上人類駕駛者的操做是慢慢的向左拐。
這幅圖的第二部分對應的就是學習算法選出的行駛方向。而且,相似的,這一條白亮的區段顯示的就是神經網絡在這裏選擇的行駛方向,是稍微的左轉,而且實際上在神經網絡開始學習以前,你會看到網絡的輸出是一條灰色的區段,就像這樣的一條灰色區段覆蓋着整個區域這些均稱的灰色區域,顯示出神經網絡已經隨機初始化了,而且初始化時,咱們並不知道汽車如何行駛,或者說咱們並不知道所選行駛方向。只有在學習算法運行了足夠長的時間以後,纔會有這條白色的區段出如今整條灰色區域之中。顯示出一個具體的行駛方向這就表示神經網絡算法,在這時候已經選出了一個明確的行駛方向,不像剛開始的時候,輸出一段模糊的淺灰色區域,而是輸出一條白亮的區段,表示已經選出了明確的行駛方向。
ALVINN (Autonomous Land Vehicle In a Neural Network)是一個基於神經網絡的智能系統,經過觀察人類的駕駛來學習駕駛,ALVINN可以控制NavLab,裝在一輛改裝版軍用悍馬,這輛悍馬裝載了傳感器、計算機和驅動器用來進行自動駕駛的導航試驗。實現ALVINN功能的第一步,是對它進行訓練,也就是訓練一我的駕駛汽車。
而後讓ALVINN觀看,ALVINN每兩秒將前方的路況圖生成一張數字化圖片,而且記錄駕駛者的駕駛方向,獲得的訓練集圖片被壓縮爲30x32像素,而且做爲輸入提供給ALVINN的三層神經網絡,經過使用反向傳播學習算法,ALVINN會訓練獲得一個與人類駕駛員操縱方向基本相近的結果。一開始,咱們的網絡選擇出的方向是隨機的,大約通過兩分鐘的訓練後,咱們的神經網絡便可以準確地模擬人類駕駛者的駕駛方向,對其餘道路類型,也重複進行這個訓練過程,當網絡被訓練完成後,操做者就可按下運行按鈕,車輛便開始行駛了。
每秒鐘ALVINN生成12次數字化圖片,而且將圖像傳送給神經網絡進行訓練,多個神經網絡同時工做,每個網絡都生成一個行駛方向,以及一個預測自信度的參數,預測自信度最高的那個神經網絡獲得的行駛方向。好比這裏,在這條單行道上訓練出的網絡將被最終用於控制車輛方向,車輛前方忽然出現了一個交叉十字路口,當車輛到達這個十字路口時,咱們單行道網絡對應的自信度驟減,當它穿過這個十字路口時,前方的雙車道將進入其視線,雙車道網絡的自信度便開始上升,當它的自信度上升時,雙車道的網絡,將被選擇來控制行駛方向,車輛將被安全地引導進入雙車道路。
這就是基於神經網絡的自動駕駛技術。固然,咱們還有不少更加先進的試驗來實現自動駕駛技術。在美國,歐洲等一些國家和地區,他們提供了一些比這個方法更加穩定的駕駛控制技術。但我認爲,使用這樣一個簡單的基於反向傳播的神經網絡,訓練出如此強大的自動駕駛汽車,的確是一次使人驚訝的成就。
[1] 吳恩達機器學習課程:https://study.163.com/course/courseMain.htm?courseId=1004570029
[2] https://www.cnblogs.com/sl0309/category/1382582.html
[3] https://github.com/fengdu78/Coursera-ML-AndrewNg-Notes/blob/master/markdown/week4.md