1. 程式人生 > >機器學習筆記——神經網路(neural networks)

機器學習筆記——神經網路(neural networks)

神經網路

非線性假設

對於非線性假設而言,當特徵足夠多的時候,如果我們仍採用多項式進行線性擬合,那麼我們將獲得數量非常龐大的高次項,這使得計算變得非常複雜。出於這個原因,我們受到人腦的啟發,提出了神經網路

我們可以將logistic單元表示成神經元的形式,中間的神經元代表假設函式h,左側是輸入,右側是輸出

如果我們的輸入輸出之間經過了多層計算,這樣一種結構我們就叫做神經網路

前向傳播

為了計算最終的輸出,我們可以用前向傳播的方法,顧名思義就是由輸入一層層向右迭代計算輸出

我們把輸入特徵的層叫做輸入層,輸出結果的層叫輸出層,而中間的層我們統一稱為隱藏層

多元分類

對於分類問題,如果輸出是多元的,那我們需要構建一個向量來表示輸出屬於哪一類

 

反向傳播

代價函式

我們已經講了神經網路的大致結構,那麼它的代價函式是什麼呢?我們以多元分類問題舉例,實際上神經網路的代價函式就是把每一個輸出的代價函式求和就得到了最終的代價函式(其中還包括正則化的項)

那麼有了代價函式,我們怎麼求它的最小值呢?我們知道要計算最小值,需要計算代價函式以及代價函式對各個係數的偏導,那麼這個計算的過程就叫做反向傳播。我們可以由如下過程求出偏導數。我們可以看出我們先定義了輸出層的誤差δ,也就是最後的輸出結果與實際值(1或0)的差值,然後再根據一系列公式(在此就不再推到了)計算出代價函式對每個引數的偏導數

以上是一組資料的情況,那麼對於m組訓練資料,我們可以採用如下的演算法計算偏導數

讓我們再來回顧一下上面的過程:首先我們根據一組訓練資料從左到右正向計算出輸出的值

然後我們再根據輸出結果與偏導數計算公式從右到左反向一級級計算出δ,最後計算出偏導數

在得到了代價函式與代價函式對引數的偏導數之後我們就可以利用一些整合的來計算出代價函式的最小值了。需要注意的是我們在表示係數的時候我們一般將係數寫成矩陣的形式(每一層有一個係數矩陣),但是在matlab中呼叫這些高階函式(例如fminunc)需要我們將這些矩陣展開成向量的形式

梯度檢測

由於反向傳播演算法比較複雜,很多時候它很多時候容易出問題。正是這樣,我們需要梯度檢測來證明我們的結果是否正確。我們會採用導數逼近的形式來觀察我們的梯度求得是否正確

以下是高維的情況

由於梯度檢測的過程遠比神經網路的計算過程計算量大,因此我們一般只進行一次梯度檢測,之後將其關閉,再來執行反向傳播的程式碼

還需要注意的是我們在初始化引數的時候不能像logistic迴歸一樣簡單地將每個引數置0,因為這會導致對稱性權重(symmetry weight)問題,因此我們需要隨機化初始引數來進行初始化

 

總結

下面讓我們來對訓練神經網路的過程做一個總結。首先我們需要選擇一個網路結構,一般來說我們選擇一層隱藏層就行

之後我們按以下幾個步驟對神經網路進行訓練

很多時候代價函式是非凸函式,演算法會收斂到區域性最小值,但是我們在實操的時候可以知道就算收斂到區域性最小值我們仍能取得很好的效果