Standford機器學習 神經網絡的學習(Neural Network Learning)

       轉自http://blog.csdn.net/jackie_zhu/article/details/8977055

       上一講講了神經網絡的表示,神經網絡中,從前一層映射到後一層的需要有個一個權重矩陣Theta和激活函數,映射後可以得到該層神經元的activation。如何來學習Theta是本講要解決的內容。

首先,對於一個分類問題,如果是兩類問題,輸出層只需要有一個神經元,輸出1爲正類,輸出0爲負類。而對於多類的問題,需要有多個神經元。定義一個神經網絡,如下:

 

它的輸出是一個向量,如圖,假設要分成4類,向量的對應類別下標爲1,輸出可以表示成

 

 

根據上一講神經網絡的表示,和邏輯迴歸的估價函數類似(神經網絡就是把每個神經元的估價函數相加得到的),可以得出如下的估價函數

 

 

估價函數的優化反向傳播算法(BackpropagationAlgorithm

        對於上面的估價函數,常用的方法是利用梯度下降法來計算。在利用梯度下降法的時候,主要的兩步計算是求J和在當前點的梯度。神經網絡中用到了一個求梯度的非常高效的算法,即反向傳播算法(BackpropagationAlgorithm)。

對於上面這個四層網絡,我們可以用前向傳播得到每一層每一個神經元的activation,所謂前向傳播就是利用之前定義的方法,按順序計算每層神經網絡的activation,如下:

 

接下來定義每一層error的概念,用符號表示是這樣

 

對於輸出層的每一個神經元可以計算出它的誤差

 

        因爲a已經從前向傳播算法中得到了,而yi就是每個樣本已知的實際類別。然後計算倒數第二層的誤差,當計算前面層的誤差時就需要用到反向傳播算法了。反向傳播算法定義如下:

 

        g(z)的倒數爲g(z)(1-g(z)),自己推導下,代入這個式子中。從這個式子可以看出,後一層的誤差是由前一層的誤差推導而來,Theta轉置之後剛好和前向傳播反向,這也是可以理解的。

 

 

 

這樣就能通過誤差,計算出每一層的delta值,而梯度就是通過該delta值來計算的。

 

然後就得到了梯度

 

 梯度校驗(Gradient Checking)

 

        在實際神經網絡的學習中,由於學習過程過於複雜,我們會不確定自己寫的程序梯度計算對了沒有,梯度校驗就是一種來近似估計當前點的梯度的方法。

 

 

 

        根據導數的定義,如果elpsiton趨向於無窮小,那麼約等於號右邊的值正是改點的導數,於是我們就區一個非常小的elpsiton,比如elpsiton0.001,來估計該點的梯度值。這樣計算出來的梯度和實際的梯度會非常的接近。對於某一點,如果你程序計算的梯度和這樣估計出來的梯度有很大的差別,那麼或許是你的程序寫錯了。

對於每個theta就可以通過下式來求得:

 

 

另外,之所以不用梯度校驗來求梯度,是因爲梯度校驗比反向傳播算法更加複雜,計算需要消耗更多的時間,你的程序會很慢。

 

隨機初始化(Random Initialization)

        如果和前面講到的邏輯迴歸中的初始化一樣,把全部的theta初始化爲0,會出現什麼問題呢?如果把所有的theta初始化一樣的話,每層神經網絡得到的activation也全是一樣的,這樣一直優化下去會得到theta值全部一樣的結果,這明顯對我們的模型是不利的。

解決方法就是隨機初始化,先設定一個較小的值init_elpsiton,然後初始化如下

 

        這樣的theta值就是在-init_elpsitoninit_elpsiton之間的隨機初始值了,就可以解決上面那個問題。

另外,神經網絡學習的話可以看下下面這篇文章,可以讓你對神經網絡由一個更好的瞭解。

點擊打開鏈接   

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