首先引入一些便於稍後討論的新標記方法: html
假設神經網絡的訓練樣本有𝑚個,每一個包含一組輸入𝑥和一組輸出信號𝑦,𝐿表示神經網絡層數,𝑆𝑙表示輸出層神經元個數,𝑆𝐿表明最後一層中處理單元的個數。算法
在邏輯迴歸中,代價函數爲:安全
在邏輯迴歸中,咱們只有一個輸出變量,也只有一個因變量𝑦,可是在神經網絡中,咱們能夠有不少輸出變量,咱們的ℎ𝜃(𝑥)是一個維度爲𝐾的向量,而且咱們訓練集中的因變量也是一樣維度的一個向量,所以咱們的代價函數會比邏輯迴歸更加複雜一些,爲: ℎ𝜃(𝑥) ∈ ℝ𝐾 ,( ℎ𝜃(𝑥) )𝑖= 𝑖𝑡ℎoutput微信
這個看起來複雜不少的代價函數背後的思想仍是同樣的,咱們但願經過代價函數來觀察算法預測的結果與真實狀況的偏差有多大。惟一不一樣的是,對於每一行特徵,咱們都會給出𝐾個預測。網絡
步驟以下:機器學習
(1)利用循環,對每一行特徵都預測𝐾個不一樣結果函數
(2)利用循環在𝐾個預測中選擇可能性(爲某個結果的機率值)最大的一個,將其與𝑦中的實際數據進行比較。學習
正則化的那一項只是排除了每一層 𝜃0 後,每一層的 𝜃 矩陣的和。最裏層的循環 𝑗 循環全部的行(𝑠𝑙 +1 個),循環 𝑖 則循環全部的列,由該層(𝑠𝑙 個)的激活單元數所決定。ps:j 表明第 j 層,i 表明該層的第 i 個激活單元 優化
通俗理解就是,先把每一行的每一個𝜃加起來求和,原矩陣變成了一列, 而後再把這一列中的每一個數加起來,而後再把不一樣層的𝜃加起來。spa
爲了計算代價函數的偏導數,咱們須要採用反向傳播的算法,即先計算最後一層的偏差,而後一層一層反向求出各層的偏差,直到倒數第二層。
舉個例子,以下圖所示的神經網絡中:
(1)計算最後一層(layer 4)的偏差:
該層偏差是激活單元的預測 ak(4) 與實際值 yk 之間的差值,記爲: 𝛿(4) = 𝑎(4) − 𝑦
(2)計算layer 3的偏差
𝛿(3) = (𝛩(3))𝑇𝛿(4) ∗ 𝑔′(𝑧(3)) ,其中𝑔′(𝑧(3))是 𝑆 形函數的導數,𝑔′(𝑧(3)) = 𝑎(3) ∗ (1 − 𝑎(3))。而(𝜃(3))𝑇𝛿(4)則是權重致使的偏差的和。
推導過程(𝛿是代價函數關於所計算出的中間項 z 的偏導數,它所衡量的是:爲了影響這些中間值,咱們所須要改變神經網絡中的權重的程度):
(3)計算layer 2的偏差
𝛿(2) = (𝛩(2))𝑇𝛿(3) ∗ 𝑔′(𝑧(2))
(4)第一層是輸入層,不存在偏差
咱們有了全部的偏差的表達式後,即可以計算代價函數的偏導數了,假設𝜆 = 0,即咱們不作任何正則化處理時有:
重要的是清楚地知道上面式子中上下標的含義:
𝑙 表明目前所計算的是第幾層。
𝑗 表明目前計算層中的激活單元的下標,也將是下一層的第𝑗個輸入變量的下標。
𝑖 表明下一層中偏差單元的下標,是受到權重矩陣中第𝑖行影響的下一層中的偏差單元的下標。
若是咱們考慮正則化處理,而且咱們的訓練集是一個特徵矩陣而非向量。在上面的特殊狀況中,咱們須要計算每一層的偏差單元來計算代價函數的偏導數。在更爲通常的狀況中,咱們一樣須要計算每一層的偏差單元,可是咱們須要爲整個訓練集計算偏差單元,此時的偏差單元也是一個矩陣,咱們用𝛥𝑖𝑗(𝑙)表示這個偏差矩陣。第 𝑙 層的第 𝑖 個激活單元受到第 𝑗個參數影響而致使的偏差。
咱們的算法表示爲:
即首先用正向傳播方法計算出每一層的激活單元,利用訓練集的結果與神經網絡預測的結果求出最後一層的偏差,而後利用該偏差運用反向傳播法計算出直至第二層的全部偏差。在求出了𝛥𝑖𝑗(𝑙)以後,咱們即可以計算代價函數的偏導數了,計算方法以下:
在使用一些高級優化算法時,咱們通常須要將參數從矩陣形式展開成向量。
矩陣轉換成向量以及向量轉換成矩陣:
步驟以下:
當咱們對一個較爲複雜的模型(例如神經網絡)使用梯度降低算法時,可能會存在一些不容易察覺的錯誤,意味着,雖然代價看上去在不斷減少,但最終的結果可能並非最優解。爲了不這樣的問題,咱們採起一種叫作梯度的數值檢驗(Numerical Gradient Checking)方法。這種方法的思想是經過估計梯度值來檢驗咱們計算的導數值是否真的是咱們要求的。
梯度檢驗方法的步驟以下:
(1)當 𝜃 是一個實數時:
沿着切線的方向選擇離兩個很是近的點,而後計算兩個點的平均值用以估計梯度。即對於某個特定的 𝜃,咱們計算出在 𝜃-𝜀 處和 𝜃+𝜀 的代價值(𝜀是一個很是小的值,一般選取 0.001),而後求兩個代價的平均,用以估計在 𝜃 處的代價值。
公式爲:gradApprox = (J(theta + eps) – J(theta - eps)) / (2*eps)
當𝜃是一個向量時:
(2)經過反向傳播方法計算出偏導數,將這些偏導數存儲在矩陣 𝐷𝑖𝑗(𝑙) 中
(3)將計算出來的斜率和偏導數進行對比,具體實現以下:
最後,檢查一下 gradApprox 和 DVec 的值是否近似相等。
隨機初始化的方法有不少,並且各有其特色,在這裏介紹一下比較簡單的隨機初始化方法,在以後的內容中(涉及到梯度消失和梯度爆炸,再去介紹其餘的初始化方法)
(1)對於邏輯迴歸,一般將參數初始化爲0,以下:
initial_tneta = zeros(n,1)
(2)對於神經網絡,初始化爲0不可行
若是咱們令全部的初始參數都爲0,或者初始全部的參數都爲一個非0的數,這將意味着咱們第二層的全部激活單元都會有相同的值。全部的單元都相同,每一層都在計算同一特徵,那麼是沒法進行非線性的擬合的。換句話說,原本咱們但願不一樣的結點學習到不一樣的參數,可是因爲參數相同以及輸出值都同樣,不一樣的結點根本沒法學到不一樣的特徵!這樣就失去了網絡學習特徵的意義了。
所以在神經網絡中,須要採用隨機初始化:
%輸入層單元數:10,隱含層單元數:10,輸出層單元數:1 initial_theta1 = rand(10,11)* (2*eps) – eps initial_theta2 = rand(1,11)* (2*eps) – eps
即將參數初始化爲正負eps之間的隨機數 :
小結一下使用神經網絡時的步驟:
(1)肯定網絡結構:即多少層、每層多少個單元
第一層的單元數即咱們訓練集的特徵數量,最後一層的單元數是咱們訓練集的結果的類的數量,真正須要決定的是隱含層的層數和每層的單元數。
(2)訓練神經網絡
① 參數隨機初始化
② 利用正向傳播方法計算全部的ℎ𝜃(𝑥)
③ 編寫計算代價函數 𝐽 的代碼
④ 利用反向傳播方法計算全部偏導數
⑤ 利用數值檢驗方法檢驗這些偏導數
⑥ 使用優化算法來最小化代價函數
在這一部份內容中,介紹了一個具備歷史意義的神經網絡學習的重要例子。那就是使用神經網絡來實現自動駕駛。
ALVINN (Autonomous Land Vehicle In a Neural Network)是一個基於神經網絡的智能系統,經過觀察人類的駕駛來學習駕駛,ALVINN 可以控制NavLab,裝在一輛改裝版軍用悍馬,這輛悍馬裝載了傳感器、計算機和驅動器用來進行自動駕駛的導航試驗。實現ALVINN 功能的第一步,是對它進行訓練,也就是訓練一我的駕駛汽車。
而後讓ALVINN 觀看,ALVINN 每兩秒將前方的路況圖生成一張數字化圖片,而且記錄駕駛者的駕駛方向,獲得的訓練集圖片被壓縮爲 30x32 像素,而且做爲輸入提供給 ALVINN 的三層神經網絡,經過使用反向傳播學習算法,ALVINN 會訓練獲得一個與人類駕駛員操縱方向基本相近的結果。一開始,咱們的網絡選擇出的方向是隨機的,大約通過兩分鐘的訓練後,咱們的神經網絡便可以準確地模擬人類駕駛者的駕駛方向,對其餘道路類型,也重複進行這個訓練過程,當網絡被訓練完成後,操做者就可按下運行按鈕,車輛便開始行駛了。
每秒鐘 ALVINN 生成 12 次數字化圖片,而且將圖像傳送給神經網絡進行訓練,多個神經網絡同時工做,每個網絡都生成一個行駛方向,以及一個預測自信度的參數,預測自信度最高的那個神經網絡獲得的行駛方向。好比這裏,在這條單行道上訓練出的網絡將被最終用於控制車輛方向,車輛前方忽然出現了一個交叉十字路口,當車輛到達這個十字路口時,咱們單行道網絡對應的自信度驟減,當它穿過這個十字路口時,前方的雙車道將進入其視線,雙車道網絡的自信度便開始上升,當它的自信度上升時,雙車道的網絡,將被選擇來控制行駛方向,車輛將被安全地引導進入雙車道路。
以上,就是吳恩達機器學習課程第十章的主要內容。
【重要提示】:本人機器學習課程的主要學習資料包括:吳恩達教授的機器學習課程和黃廣海博士的中文學習筆記。感謝吳恩達教授和黃廣海博士的知識分享和無私奉獻。做爲機器學習小白,計劃每週末記錄一週以來的學習內容,總結回顧。但願你們多多挑錯,也願個人學習筆記能幫助到有須要的人。