吳恩達機器學習個人筆記(四)-神經網絡的學習

1 代價函數

     一開始先引入神經網絡的新標記方法:   若神經網絡的樣本有m個,每個包含一組輸入x和一組輸出信號y,例如下列方式(x^{1},y^{1}),(x^{2},y^{2})\cdots (x^{m},y^{m}) 其中x^{m}和 y^{m} 都可能爲向量。L表示爲神經網絡的層數,S_{l}表示爲l層神經網絡的神經元數,不包括該層的偏差單元

神經網絡的分類可以定義爲兩種情況:二類分類和多類分類。二類分類時,輸出層只有一個單元即 y=0 or 1,y表示爲輸出信號,K類分類即多類分類時 y_{i}=1,表示爲分到第 i類(K>2)這兩類情況如下所示。

              

邏輯迴歸當中,我們的代價函數爲:

               \dpi{120} J(\theta)=-\frac{1}{m}\sum_{i=1}^m[y^{(i)}log(h_{\theta }(x^{(i)}))+(1-y^{(i)})log(1-h_{\theta }(x^{(i)}))]+\frac{\lambda }{2m}\sum_{j=1}^n\theta _{j}^{2}

在邏輯迴歸中,我們只有一個輸出變量,然後在神經網絡中,每層神經網絡有多個神經單元,所以 h_{\theta }(x) 是一個維度爲k的向量,因此神經網絡的代價函數會比邏輯迴歸的更復雜,如下所示。

          J(\theta)=-\frac{1}{m}[\sum_{i=1}^m\sum_{k=1}^k[y^{(i)}log(h_{\theta }(x^{(i)}))_{k}+(1-y_{k}^{(i)})log(1-h_{\theta }(x^{(i)})_{k})]+\frac{\lambda }{2m}\sum_{l=1}^{L-1}\sum_{i=1}^{s_{l}}\sum_{j=1}^{s_{l}+1}\theta _{j}^{2}

看起來比邏輯單元複雜很多,但是思想都是一樣的,即通過代價函數來檢測算法的誤差。只不過由於輸出y爲k維向量並且\theta爲多個矩陣,所以變得異常複雜。

2 反向傳播算法(Backpropagation Algorithm)

       之前計算神經網絡預測結果的時候採用了一種正向傳播的方法,從第一層開始向下一層計算,直到計算出最後的結果。爲了計算代價函數的偏導數  \frac{\partial }{\partial \theta _{ij}^{l}}J(\theta ),我們需要採用一種反向傳播的算法,也就是首先計算最後一層誤差,然後再一層一層反向求出各層的誤差,直到倒數第二層。正向傳播也就是向前傳播如下所示

                       

                                             

第一層爲 a^{(1)},爲輸入的數據x。第二層爲a^{(2)},如上圖所示 a^{(2)}=g(z^{(2)}),z^{(2)}=a^{(1)}\Theta ^{(1)},\Theta ^{(1)}爲第一層到第二層之間的參數,上篇博客講到,\Theta ^{(1)}的大小爲5\times 4。其他層的結果也如此計算。

從最後一層的誤差開始計算,誤差是激活單元的預測(a^{(4)})與實際值y之間的誤差。用\delta來表示誤差,即:\delta ^{(4)}=a^{(4)}-y。再利用這個第四層的誤差計算前一層的誤差 \delta ^{(3)}=\left ( \Theta ^{(3)} \right )^{T}\delta ^{(4)}*g^{'}\left ( z^{(3)} \right ),其中g^{'}\left ( z^{(3)} \right )爲之前所講述的sigmod函數g^{'}\left ( z^{(3)} \right )=a^{(3)}*(1-a^{(3)})。下一步爲依據該誤差計算第二層的誤差\delta ^{(2)}=\left ( \Theta ^{(2)} \right )^{T}\delta ^{(3)}*g^{'}\left ( z^{(2)} \right ),第一層爲輸入變量,不存在誤差。我們有了所有層的(除去輸入層)的誤差表達式後,即可計算代價函數的偏導數了,假設\lambda =0,即不做任何正則化處理時有偏導數  \frac{\partial }{\partial \theta _{ij}^{l}}J(\theta )=a_{j}^{(l)}\delta _{i}^{(l+1)}

 l代表目前所計算的是第幾層。

 j代表目前計算層中的激活單元的下標,也將是下一層的第j個輸入變量的下標。

 i代表下一層中誤差單元的下標,是受到權重矩陣中第i行影響的下一層中的誤差單元的下標

上面所述並且圖中,輸入數據只有一組爲(x,y),如果我們的輸入數據爲矩陣即(x^{1},y^{1}),(x^{2},y^{2})\cdots (x^{m},y^{m}),那麼我們就要爲整個訓練集計算誤差。此時的誤差單元也是一個矩陣,用 \Delta _{ij}^{(l)},l表示層數算法如下                               

由於我們的數據集中有m對,因此使用一個for循環。現將每次的輸入數據設爲a^{(1)},然後使用向前傳播算法計算神經網絡中的每層的激勵單元,計算出最終預測結果後,計算上訴的誤差,然後再一層一層的反向傳播計算誤差,最後相交到一個矩陣。

說實話對這個還有有點迷糊,不過後面吳恩達老師詳細解釋了反向傳播算法。聽完還是覺得雲裏霧裏,所以在網上查閱,覺得這篇文章寫得很好,讀了之後對反向傳播有一點認識,至少不會一頭霧水一文弄懂神經網絡中的反向傳播法——BackPropagation

4梯度檢驗

       當我們對一個較爲複雜的模型(例如神經網絡)使用梯度下降算法時,可能會存在一些不容易察覺的錯誤,意味着,雖然代價看上去在不斷減小,但最終的結果可能並不是最優解。

       爲了避免這樣的問題,我們採取一種叫做梯度的數值檢驗(Numerical Gradient Checking)方法。這種方法的思想是通過估計梯度值來檢驗我們計算的導數值是否真的是我們要求的。梯度值就是某一點的導數值,非常的容易理解,如下所示

                                  

這是我們常見的一個點的導數的示意圖即  \frac{\partial}{\partial_{\theta }}=\frac{J(\theta +\varepsilon )-J(\theta -\varepsilon )}{2\varepsilon }   ,\varepsilon的取值非常小。當\theta是一個向量時,需要對偏導數進行檢驗,因爲代價函數只針對一個參數逇變化進行檢驗,如果 \theta _{1}是向量\theta內的一個值,那麼針對\theta _{1}的檢驗爲

\frac{\partial}{\partial_{\theta _{1}}}=\frac{J(\theta _{1}+\varepsilon ,\theta _{2},\theta _{3}\cdots \theta _{n})-J(\theta _{1}-\varepsilon ,\theta _{2},\theta _{3}\cdots \theta _{n})}{2\varepsilon }

根據上面的算法,計算出的偏導數存儲在矩陣D_{ij}^{(l)}檢驗時,我們要將該矩陣展開成爲向量,同時我們也將 矩陣展開爲向量\theta,我們針對每一個 \theta都計算一個近似的梯度值,將這些值存儲於一個近似梯度矩陣中,最終將得出的這個矩陣同 D_{ij}^{(l)} 進行比較。如下所示

                          

5隨機初始化

任何優化算法都需要一些初始的參數。到目前爲止我們都是初始所有參數爲0,這樣的初始方法對於邏輯迴歸來說是可行的,但是對於神經網絡來說是不可行的。如果我們令所有的初始參數都爲0,這將意味着我們第二層的所有激活單元都會有相同的值。同理,如果我們初始所有的參數都爲一個非0的數,結果也是一樣的。

我們通常初始參數爲正負ε之間的隨機值,假設我們要隨機初始一個尺寸爲10×11的參數矩陣,代碼如下

            Theta1 = rand(10, 11) * (2*eps) – eps

6總結

總結一下使用神經網絡的步驟:

網絡結構:第一件要做的事是選擇網絡結構,即決定選擇多少層以及決定每層分別有多少個單元。

第一層的單元數即我們訓練集的特徵數量。

最後一層的單元數是我們訓練集的結果的類的數量。

如果隱藏層數大於1,確保每個隱藏層的單元個數相同,通常情況下隱藏層單元的個數越多越好。

我們真正要決定的是隱藏層的層數和每個中間層的單元數。

訓練神經網絡:

  1. 參數的隨機初始化
  2. 利用正向傳播方法計算所有的h_{\theta }(x)
  3. 編寫計算代價函數J  的代碼
  4. 利用反向傳播方法計算所有偏導數
  5. 利用數值檢驗方法檢驗這些偏導數
  6. 使用優化算法來最小化代價函數
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章