機器學習從入門到XX(六):神經網絡代價函數和BP算法

代價函數

如今來討論神經網絡模型的代價函數。首先有以下定義:算法

  • L:網絡中的層數
  • $ s_l $:第l層中的單元數(不包括誤差單元)
  • K:輸出單元個數

咱們記$ 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

  • 雙重嵌套求和試圖將所有樣本的每一個分類輸出值求和。
  • 三重嵌套求和試圖整個網絡的每一個Θ求和。
  • 三重嵌套循環中的i,跟第i個訓練樣本無關,不是一個概念。

反向傳播(BP)算法

若是梯度降低是一個最小化迴歸模型的方法,那麼術語反向傳播(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

  1. 設$ a^{(1)} := x^{(t)} $
  2. 經過正向計算,分別算得$ a^{(l)}\space l=2,3...L $
  3. 根據實際結果$ y^{(t)} $,計算 $ \delta^{(L)} = a^{(L)} - y^{(t)} $。因爲L是總的層數,因此$ a^{(L)} $實際上是是經過模型獲得的輸出向量。因此第L層的誤差能夠直接經過訓練集的實際結果向量y獲得。其餘層的誤差則是從右往左的順序依次計算:
  4. $ \delta^{(L-1)} $,$ \delta^{(L-2)} $,...$ \delta^{2} $,公式爲:$ \delta^{(l)} = ((Θ^{(l)})^T)\delta^{(l+1)} .* a^{(l)} .* ( 1 - a^{(l)}) $ 要計算第l層的誤差,首先將第l層的Θ矩陣與下一層的誤差向量相乘。放大項$ a^{(l)} .* ( 1 - a^{(l)}) $實際是激勵函數g的導數:$ g'(z^{(l)} = a^{(l)} .* ( 1 - a^{(l)}) $
  5. $ Δ^{(l)} := Δ^{(l)} + \delta^{(l+1)}(a^{(l)})^T $

最後,計算

$$ \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)

clipboard.png

如上圖,當前咱們但願求解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;

訓練神經網絡

首先,選擇一個神經網絡架構,有多少層,每層有多少個單元:

  • 輸入單元數:特徵$ x^{(i)} $的維度
  • 輸出單元數:分類數量
  • 每一個隱藏層的單元數:一般多多益善,但要平衡計算成本。默認使用1個隱藏層,若是多於1個隱藏層,推薦每層的單元數保持相同。

接下來:

  1. 隨機初始化權重Θ
  2. 對每個$ x^{(i)} $使用前向傳導計算$ h_θ(x^{(i)}) $
  3. 實現代價函數J(Θ)
  4. 實現反向傳導計算偏導數
  5. 使用梯度檢查,確保反向傳播算法正確。而後關閉梯度檢查
  6. 使用梯度降低或其餘優化函數最小化代價函數

clipboard.png

理想狀況下,$ h_\Theta(x^{(i)}) \approx y^{(i)} $,但因爲J(Θ)多是non-convex的,因此,你可能會獲得局部最優解。

相關文章
相關標籤/搜索