上一週咱們學習了 神經網絡 | 多分類問題。咱們分別使用 邏輯迴歸 和 神經網絡 來解決多分類問題,並瞭解到在特徵數很是多的狀況下,神經網絡是更爲有效的方法。這周的課程會給出訓練 神經網絡 所使用的 代價函數,並使用 反向傳播 算法來計算梯度。筆者會給出 反向傳播 算法中重要的思路和推導,但不會包含全部的計算步驟。git
點擊 課程視頻 你就能不間斷地學習 Ng 的課程,關於課程做業的 Python 代碼已經放到了 Github 上,點擊 課程代碼 就能去 Github 查看( 沒法訪問 Github 的話能夠點擊 Coding 查看 ),代碼中的錯誤和改進歡迎你們指出。github
如下是 Ng 機器學習課程第四周的筆記。算法
假設咱們的多分類問題有 個分類,神經網絡共有 層,每一層的神經元個數爲 ,那麼神經網絡的 代價函數 爲:網絡
其中的第二項爲 正則化 項,是網絡中全部權值的平方和。第一項與邏輯迴歸中的 代價函數 相似,但這裏咱們須要累加全部輸出神經元的偏差。app
爲了可以使用 梯度降低 算法來訓練網絡,咱們須要計算代價函數的梯度。一種很直觀的方法就是使用數值計算,對於某個 ,給它加上減去一個很小的量 來計算梯度:機器學習
但稍微分析一下算法的複雜度就能知道,這樣的方法十分緩慢。對於每一組數據,咱們須要計算全部權值的梯度,**總的計算次數 = 訓練數據個數 x 網絡權值個數 x 前向傳播計算次數 **。在一般狀況下這樣的複雜度是沒法接受的,因此咱們僅使用這個方法來驗證 反向傳播 算法計算的梯度是否正確。ide
爲了可以理解以後對於 反向傳播 公式的推導,咱們首先要了解一個關於多元複合函數求導的 鏈式法則。對於多元函數 ,其中 ,,那麼:函數
鏈式法則 告訴咱們有多個層次的多元複合函數,下一層次的導數能夠由上一層次推得。學習
上圖中筆者有意多加了一層,這裏 是 的函數, 是 的函數, 是 的函數。對於要計算的 與 ,上式仍成立,緣由是咱們能夠把 看做 的函數。這至關於咱們把:簡化爲了只與上一層相關,利用上一層計算完成的結果 和 而不用從頭算起:.net
通常的,對於函數 ,若是它能看作 的函數,而 爲 的函數,則:
神經網絡就是一個層次不少的多元函數,咱們能夠隱約從 鏈式法則 中感受到反向傳播的意味。
爲了施展 反向傳播 的魔法,咱們首要要引入一箇中間變量 ,定義爲:
其中 爲第幾層, 表示第 層的第幾個神經元, 爲上次課程提到的中間變量( 爲了讓式子看上去更清晰,反向傳播 中的公式上標不使用括號 )。 被稱爲第 層第 個神經元的偏差。反向傳播 就是先計算每一層每一個神經元的偏差,而後經過偏差來獲得梯度的。
首先來看輸出層的偏差:
對它使用 鏈式法則 獲得:
而只有當 時,右邊部分纔不爲 ,因此:
對於其它層的偏差:
使用 鏈式法則:
而其中:
求偏導得:
因此:
最後一樣使用 鏈式法則 來計算:
因爲:
只有當 , 時留下一項:
有了 (1) (2) (3) 式,就能夠來完成 反向傳播 算法了( 須要注意的是剛纔所推導的式子都是針對一組訓練數據而言的 )。
- 對於全部的 初始化
- 對於 組訓練數據, 從 取到 :
- 令
- 前向傳播,計算各層激活向量
- 使用 (1) 式,計算輸出層偏差
- 使用 (2) 式,計算其它層偏差
- 使用 (3) 式,累加 ,
- 計算梯度矩陣:
- 更新權值
最後提一下權值的初始化。對於神經網絡,不能像以前那樣使用相同的 0 值來初始化,這會致使每層的 邏輯單元 都相同。所以咱們使用隨機化的初始化方法,使得 。
So~,這周學完了 神經網絡 和它的學習算法,你們有沒有以爲很神奇呢?