如今來討論神經網絡模型的代價函數。首先有以下定義:算法
咱們記$ h_Θ(x)_k $表示第k
個輸出單元。回顧在邏輯迴歸中,咱們使用以下代價函數:網絡
$$ J(θ) = - \frac{1}{m} \displaystyle \sum_{i=1}^m [y^{(i)}\log (h_θ (x^{(i)})) + (1 - y^{(i)})\log (1 - h_θ(x^{(i)}))] + \fracλ{2m}\sum_{j=1}^nθ_j^2 $$架構
對於神經網絡,看起來有些複雜:app
$$ J(θ) = - \frac{1}{m} \displaystyle \sum_{i=1}^m\sum_{k=1}^K [y^{(i)}_k\log ((h_θ (x^{(i)}))_k) + (1 - y^{(i)}_k)\log (1 - (h_θ(x^{(i)}))_k)] + \fracλ{2m}\sum_{l=1}^{L-1}\sum_{i=1}^{s_l}\sum_{j=1}^{sl+1}(Θ_{j,i}^{(l)})^2 $$函數
公式使用了一個嵌套的求和來計算輸出單元的平均誤差。正則項部分,咱們須要將L-1
個Θ
矩陣所有求和,同時每一個矩陣是$ s_{j+1} × (s_j + 1) $維的。優化
總之:spa
Θ
求和。若是梯度降低是一個最小化迴歸模型的方法,那麼術語反向傳播(Backpropagation)
用於最小化神經網絡模型。咱們的目標依舊是$ min_ΘJ(Θ) $,這表示咱們試圖找到最優的參數$ Θ $來最小化代價函數$ J(Θ) $。本節介紹如何經過Backpropagation
計算$ J(Θ) $的偏導數:code
$$ \frac∂{∂Θ^{(l)}_{i,j}}J(Θ) $$ip
首先給出BP算法的實現步驟:get
假設訓練數據集以下
$$ \lbrace (x^{(1)}, y^{(1)}) \cdots (x^{(m)}, y^{(m)})\rbrace $$
設$ Δ^{(l)}_{ij} $爲全0矩陣。
for t=1 to m
Θ
矩陣與下一層的誤差向量相乘。放大項$ a^{(l)} .* ( 1 - a^{(l)}) $實際是激勵函數g
的導數:$ g'(z^{(l)} = a^{(l)} .* ( 1 - a^{(l)}) $最後,計算
$$ \frac∂{∂Θ^{(l)}_{i,j}}J(Θ) = D^{(l)}_{i,j} $$
$$ D^{(l)}_{i,j} := \frac{1}{m}\left(\Delta^{(l)}_{i,j} + \lambda\Theta^{(l)}_{i,j}\right)\space\space ,j≠0 $$
$$ D^{(l)}_{i,j} := \frac{1}{m}\left(\Delta^{(l)}_{i,j} \right)\space\space ,j=0 $$
上述算法就是BP算法,確實是個比較難理解的算法,有興趣的能夠參閱如何直觀地解釋 back propagation 算法?,幫助理解。
獲得了J(Θ)
的偏導數,意味着獲得了梯度
,模型就能夠訓練出Θ
。
BP算法有不少細節,這些細節可能致使錯誤的算法實現。咱們能夠用梯度檢查的方法,驗證算法是否準確。這種方法也稱爲數值梯度檢查(Numerical Gradient Checking)
:
如上圖,當前咱們但願求解J(Θ)
在Θ
處的導數(即梯度)時,咱們能夠選取一個很小的$ \epsilon $,分別計算$ J(\Theta + \epsilon) $和$ J(\Theta - \epsilon) $,這兩個點的連線應近似等於Θ
處的切線方向,只要$ \epsilon $越接近於0,就越準確。所以能夠獲得以下公式計算導數:
$$ \frac{\partial}{\partial\Theta}J(\Theta) \approx \frac{J(\Theta + \epsilon) - J(\Theta - \epsilon)}{2\epsilon} $$
$ \epsilon $一般取值爲$ 10^{-4} $。當Θ
是一個多值矩陣時,用以下公式分別計算每一個$ Θ_j $的梯度:
$$ \frac{\partial}{\partial\Theta_j}J(\Theta) \approx \frac{J(\Theta_1, \dots, \Theta_j + \epsilon, \dots, \Theta_n) - J(\Theta_1, \dots, \Theta_j - \epsilon, \dots, \Theta_n)}{2\epsilon} $$
一旦驗證BP算法正確,應該中止使用梯度檢查,由於這一般很耗時間,這也是爲何不用數值梯度算法來計算梯度,BP是相對更高效的算法。
當使用梯度降低法時,須要設置Θ
初始值。在邏輯迴歸中,咱們能夠把初始的Θ
設置爲0。但在神經網絡中,這麼作可能會致使同一層單元,其激勵值與偏差δ
相同。進而每次更新,參數對應的每一個輸入到隱藏層的值是相同的。
通俗的說,當某一層的$ Θ^{(j)} $表示的權重
相同的話,會致使下一層的單元計算結果所有相同,這意味着,特徵在傳遞到下層時,所有壓縮爲一個特徵了。
咱們把這種現象稱爲對稱性(Symmetry)
,能夠經過相似以下方法打破對稱性(Symmetry Breaking)
,使初始化θ
在 [-ε, ε] 的區間內:
If the dimensions of Theta1 is 10x11, Theta2 is 10x11 and Theta3 is 1x11. Theta1 = rand(10,11) * (2 * INIT_EPSILON) - INIT_EPSILON; Theta2 = rand(10,11) * (2 * INIT_EPSILON) - INIT_EPSILON; Theta3 = rand(1,11) * (2 * INIT_EPSILON) - INIT_EPSILON;
首先,選擇一個神經網絡架構,有多少層,每層有多少個單元:
接下來:
Θ
J(Θ)
理想狀況下,$ h_\Theta(x^{(i)}) \approx y^{(i)} $,但因爲J(Θ)
多是non-convex
的,因此,你可能會獲得局部最優解。