Machine Learning(五—2)神經網絡學習

第五講——Neural Networks 神經網絡的表示

===============================

(一)、Cost function

(二)、Backpropagation algorithm

(三)、Backpropagation intuition

(四)、Implementation note: Unrolling parameters

(五)、Gradient checking

(六)、Random initialization

(七)、Putting it together



===============================

(一)、Cost function


假設神經網絡的訓練樣本有m個,每個包含一組輸入x和一組輸出信號y,L表示神經網絡層數,Sl表示每層的neuron個數(SL表示輸出層神經元個數)。

將神經網絡的分類定義爲兩種情況:二類分類和多類分類,

卐二類分類:SL=1, y=0 or 1表示哪一類;

卐K類分類:SL=K, y= 1表示分到第i類;(K>2)


我們在前幾章中已經知道,Logistic hypothesis的Cost Function如下定義:


其中,前半部分表示hypothesis與真實值之間的距離,後半部分爲對參數進行regularization的bias項,神經網絡的cost function同理:


hypothesis與真實值之間的距離爲 每個樣本-每個類輸出 的加和,對參數進行regularization的bias項處理所有參數的平方和




===============================

(二)、Backpropagation algorithm

前面我們已經講了cost function的形式,下面我們需要的就是最小化J(Θ)


想要根據gradient descent的方法進行參數optimization,首先需要得到cost function和一些參數的表示。根據forward propagation,我們首先進行training dataset 在神經網絡上的各層輸出值:


我們定義神經網絡的總誤差爲:

希望通過調整權重參數W(也就是theta)來最小化E。
由於


所以每一層按如下方式進行更新:

根據backpropagation算法進行梯度的計算,這裏引入了error變量δ該殘差表明了該節點對最終輸出值的殘差產生了多少影響。
對於最後一層,我們可以直接算出網絡產生的輸出與實際值之間的差距,我們將這個差距定義爲。對於隱藏單元我們如何處理呢?我們將通過計算各層節點殘差的加權平均值計算hidden layer的殘差。讀者可以自己驗證下,其實就是E對b求導的結果。

在最後一層中,

對於前面的每一層,都有

由此得到第l層第i個節點的殘差計算方法:

由於我們的真實目的是計算,且


所以我們可以得到神經網絡中權重的update方程:
不斷迭代直到落入local optima,就是backpropagation的算法過程。


============================================================
Example of logistical cost:

下面我們針對logistical cost給出計算的例子:
而對於每一層,其誤差可以定義爲:

分別代入即得


由此得來\theta_{k}的update方程:


如果將誤差對激勵函數(activation function)的導數記做δ,則有:



對於前面一層 ,更新同理,,只是上一層\Theta梯度的第一個分量E對a_k求導有所變化,

但是始終是不變的。


下圖就是上面推導得出的結果:


由上圖我們得到了error變量δ的計算,下面我們來看backpropagation算法的僞代碼:


ps:最後一步之所以寫+=而非直接賦值是把Δ看做了一個矩陣,每次在相應位置上做修改。

從後向前此計算每層δ,用Δ表示全局誤差,每一層都對應一個Δ(l)。再引入D作爲cost function對參數的求導結果。下圖左邊j是否等於0影響的是是否有最後的bias regularization項。左邊是定義,右邊可證明(比較繁瑣)。






===============================

(三)、Backpropagation intuition

上面講了backpropagation算法的步驟以及一些公式,在這一小節中我們講一下最簡單的back-propagation模型是怎樣learning的。

首先根據forward propagation方法從前往後計算z(j),a(j) ;


然後將原cost function 進行簡化,去掉下圖中後面那項regularization項,


那麼對於輸入的第i個樣本(xi,yi),有

Cost(i)=y(i)log(hθ(x(i)))+(1- y(i))log(1- hθ(x(i)))


由上文可知,


其中J就是cost。那麼將其進行簡化,暫時不考慮g'(zk) = ak(1-ak)的部分,就有:


經過求導計算可得,對於上圖有


換句話說, 對於每一層來說,δ分量都等於後面一層所有的δ加權和,其中權值就是參數Θ





===============================

(四)、Implementation note: Unrolling parameters

這一節講述matlab中如何實現unrolling parameter。

前幾章中已經講過在matlab中利用梯度下降方法進行更新根本,兩個方程:

function [jVal, gradient] = costFunction(theta)
optTheta = fminunc(@costFunction, initialTheta, options)

與linear regression和logistic regression不同,在神經網絡中,參數非常多,每一層j有一個參數向量Θj和Derivative向量Dj。那麼我們首先將各層向量連起來,組成大vectorΘ和D,傳入function,再在計算中進行下圖中的reshape,分別取出進行計算。


計算時,方法如下:




===============================

(五)、Gradient checking


神經網絡中計算起來數字千變萬化難以掌握,那我們怎麼知道它裏頭工作的對不對呢?不怕,我們有法寶,就是gradient checking,通過check梯度判斷我們的code有沒有問題,ok?怎麼做呢,看下邊:

對於下面這個【Θ-J(Θ)】圖,取Θ點左右各一點(Θ+ε),(Θ-ε),則有點Θ的導數(梯度)近似等於(J(Θ+ε)-J(Θ-ε))/(2ε)。

對於每個參數的求導公式如下圖所示:


由於在back-propagation算法中我們一直能得到J(Θ)的導數D(derivative),那麼就可以將這個近似值與D進行比較,如果這兩個結果相近就說明code正確,否則錯誤,如下圖所示:


Summary: 有以下幾點需要注意

-在back propagation中計算出J(θ)對θ的導數D,並組成vector(Dvec)

-用numerical gradient check方法計算大概的梯度gradApprox=(J(Θ+ε)-J(Θ-ε))/(2ε)

-看是否得到相同(or相近)的結果

-(這一點非常重要)停止check,只用back propagation 來進行神經網絡學習(否則會非常慢,相當慢)






===============================

(六)、Random Initialization


對於參數θ的initialization問題,我們之前採用全部賦0的方法,比如:


this means all of your hidden units are computing all of the exact same function of the input. So this is a highly redundant representation. 因爲一層內的所有計算都可以歸結爲1個,而這使得一些interesting的東西被ignore了。

所以我們應該打破這種symmetry,randomly選取每一個parameter,在[-ε,ε]範圍內






===============================

(七)、Putting it together

1. 選擇神經網絡結構

我們有很多choices of network :


那麼怎麼選擇呢?

No. of input units: Dimension of features
No. output units: Number of classes
Reasonable default: 1 hidden layer, or if >1 hidden layer, have same no. of hidden units in every layer (usually the more the better)

2. 神經網絡的訓練

① Randomly initialize weights
② Implement forward propagation to get hθ(x(i)) for anyx(i)
③ Implement code to compute cost function J(θ)
④ Implement backprop to compute partial derivatives



test:



本章講述了神經網絡學習的過程,重點在於back-propagation算法,gradient-checking方法,希望能夠有人用我之前這篇文章中的類似方法予以實現神經網絡。

另外提供一篇作爲Reference,供大家參考。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章