按部就班的吳恩達機器學習網課用於討論(8)

反向傳播的直觀理解

在如下例子的神經網絡中,誤差從後向前傳遞。誤差反向傳遞的過程中,以權值theta作爲反向傳遞的依據。

如delta(4)1=y-a(4)1作爲最終的誤差。delta(3)2=theta(3)02*delta(4)1,delta(2)2=theta(2)12*delta(3)1+theta(2)22*delta(3)2

這裏使用的表示法和之前相同,括號中爲第幾層的數據,角標數據爲下一層與上一層的組合關係。

 

參數展開

在代碼編程的過程中,使用costFunction函數,傳入fminunc這樣的優化求解器,可以找到無約束函數的最小值。

fminunc見:https://blog.csdn.net/qq_35488769/article/details/76396275

問題在於傳遞參數過程中,由於是對神經網絡進行的操作,每層之間使用的是矩陣權值、矩陣權值偏導數。所以需要將矩陣變換爲向量,便於在函數見傳遞。傳入後,再進行變換用於使用。

 

如下圖中所示,thetaVec表示權值向量,它將所有的Theta展開爲向量後,進行了矩陣連接成一維。同理如DVec。

thetaVec傳入costFunction函數中後,使用reshape函數,可以恢復數據爲之前的矩陣形式,然後就可以求D值吧,最後再變換爲向量形式,返回參數。

 

 

 其實就是如下圖中,獲得了初始的theta1,theta2,theta3矩陣以後,展開成向量傳入fminunc函數,其theta會傳入costFunction中。

costFunction中,恢復theta爲矩陣,計算theta的偏導數矩陣D1,D2,D3,然後將D矩陣進行展開和連接,作爲gradientVec返回。

 

 

 

梯度檢驗

梯度檢驗是爲了保證,使用J誤差函數,對theta求得的偏導數D的正確性。實現方式如下:

使用theta+-e的方式,求得一個近似梯度,然後和計算得出的梯度進行比較,一致則表示梯度正確。

 

 在多theta矩陣參數的具體應用過程中,固定住所有其他theta矩陣中的值,只對其中一個進行改變,然後計算近似梯度。

 如下是對theta1,theta2,theta3等分別求得的偏導,

 

 同理的代碼實現:

 

 在檢驗完成後,關閉梯度檢驗,以提高代碼的執行速度。

 

隨機初始化

爲了使得神經網絡具有良好的泛化特性,便於學習到不同的特徵,需要使用隨機初始化權值,而不是固定相同的權值,否則反向傳遞則會相同,神經網絡性能不太好吧。

隨機初始化可以設計爲均勻分佈,也可正態分佈。如下是將Theta1和Theta2的連接權值矩陣設計爲了(-INIT_EPSLON,INIT_EPSLON)的均勻分佈吧。

 

 

神經網絡綜合總結

就是如下六步驟吧,初始權值,前向傳遞得出結果h,通過h和y計算誤差J,然後對J求權值theta的偏導,然後梯度檢驗偏導得出的梯度值,正確則應用,最終進行反向傳遞,訓練權值theta。

 

 

算法改進優化以及排錯方向

沒有正確的分析和以理論指導的工作,很大程度上會導致低效率,甚至數個月時間的浪費。

一些優化的方案如下,但是在選擇方案的時候,還是強調,不是隨機選擇,而是使用機器學習診斷法。

 

 

 診斷法:

 

 

 

評估假設函數h

所謂假設函數其實就是訓練完成的神經網絡模型,輸出值爲h,或者又如一個預測線性迴歸模型,或者又如分類問題的邏輯迴歸模型。

在判斷如下模型是否過擬合時候,採用訓練集和測試集的方式,對訓練完成的模型進行評估。評估的方式,自然是誤差。在訓練集完成訓練後,將測試集輸入得出模型的輸出誤差J的值,訓練集誤差低而測試集誤差太高的話,當然是過擬合了。訓練集合測試集的比例一般按照先隨機打亂,然後7:3進行分。

另外,針對邏輯迴歸,使用的J的值可以如下方式吧:

 

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