2013-11-15 89 views
10

我在玩神經網絡,試圖瞭解基於您需要解決的問題類型來設計體系結構的最佳實踐。神經網絡體系結構設計

我生成的單個凸狀區域構成的,你可以看到下面一個非常簡單的數據集:當我使用的架構與L = 1,或L = 2隱藏

enter image description here

一切正常圖層(加上輸出圖層),但只要添加第三個隱藏圖層(L = 3),我的表現會下降到略好於機會。

我知道您添加到網絡中的複雜性越高(學習權重和參數的數量越多)您越傾向於過度使用數據,但我相信這不是我的問題的本質原因:

  • 我的訓練集性能也爲60%左右(而過度擬合通常意味着你有一個非常低的訓練誤差和高測試誤差),
  • ,我有一個非常大的量數據示例(不要看僅僅是一個我玩過的玩具人物)。

任何人可以幫助我理解了爲什麼增加額外的隱藏層給 我這個下降的演出就這麼簡單的任務嗎?

這裏是我的表現的圖像所使用的層數的一個函數:

enter image description here

增加的部分DUE TO評論:

  • 我使用的是S形函數假定值介於0和1之間,L(s) = 1/1 + exp(-s)
  • 我正在使用早期作爲停止學習的標準停止(在40000次反向傳播後)。我知道這不是停止的最好方法,但我認爲如果您認爲這是我沒有收斂的主要原因,那麼這樣做可能會很簡單,我可能會實施一些更好的標準。
+0

你的激活功能是什麼? –

+0

你如何確定訓練需要多長時間?更多層的網絡需要更長的時間才能收斂。 – seaotternerd

+0

@AtillaOzgur - 請注意,我更新了問題以回答您的評論! – Matteo

回答

10

至少在它的表面上,這似乎是所謂的「消失梯度」問題的一種情況。

激活功能

你的神經元激活根據邏輯S形函數,F(X)= 1 /(1 + E^-x):

sigmoid function

該活化功能經常使用,因爲它有幾個很好的屬性。一個很好的這些性質是f的衍生物(x)的計算表達使用函數本身的值,爲f'(X)= F(X)(1 - F(X))。該函數對於接近零的x具有非零值,但快速地以| x |爲零變大:

sigmoid first derivative

梯度下降

在與後勤激活的前饋神經網絡,該誤差通常向後通過網絡利用所述第一導數作爲學習信號傳播。網絡中權重的通常更新與由權重乘以當前權重值乘以邏輯函數導數得出的誤差成正比。

delta_w(w) ~= w * f'(err(w)) * err(w) 

作爲三個潛在非常小的值的產品,在這樣的網絡中的一階導數可以變小非常迅速如果在邏輯函數的導數的「中間」制度之外的網絡落入權重。另外,這種消失迅速變得衍生物通過添加更多的層惡化,因爲在層中的錯誤被「分裂」,並在該層劃分出到每個單元。這反過來又進一步降低了低於該層的梯度。

與比,也就是說,兩個隱含層更多的網絡,這可以成爲訓練網絡,因爲第一階梯度信息會導致你相信,權重不能有效地改變一個嚴重的問題。

不過,也有一些解決方案,可以幫助!我能想到的那些涉及改變你的學習方法,使用比一階梯度下降更復雜的東西,通常包含一些二階導數信息。

動量

使用一些二階的信息大致估計最簡單的辦法是包括在您的網絡參數更新一個動量項。

w_new = w_old - learning_rate * delta_w(w_old) 

結合了動量項:除了使用更新的參數

w_dir_new = mu * w_dir_old - learning_rate * delta_w(w_old) 
w_new = w_old + w_dir_new 

直觀地說,要使用從過去的衍生信息,以幫助確定是否要按照新的衍生完全(你可以通過設置mu = 0來完成),或者繼續朝着前一次更新的方向前進,通過新的漸變信息(通過設置mu> 0)來鍛鍊。

實際上,你可以通過使用「涅斯捷羅夫的加速梯度」比這還要好:

w_dir_new = mu * w_dir_old - learning_rate * delta_w(w_old + mu * w_dir_old) 
w_new = w_old + w_dir_new 

我覺得這裏的想法是,與其計算在「舊」參數值w的衍生物,計算它在w的「新」設置中,如果按照標準動量術語繼續前進並移動到那裏,那將是什麼。 Read more in a neural-networks context here (PDF)

黑森州免費

教科書方法,將二階梯度信息到你的神經網絡訓練算法是用牛頓的方法來計算你的目標函數的第一秒階導數相對於到參數。但是,稱爲Hessian matrix的二階導數通常非常大,並且計算起來過於昂貴。

過去幾年來,一些聰明的研究已經指出了一種方法來計算Hessian在特定搜索方向的值,而不是計算整個Hessian。然後,您可以使用此過程來識別比第一階梯度更好的參數更新。

通過閱讀research paper (PDF)或查看sample implementation,您可以瞭解更多信息。

其他

還有許多其他的優化方法,可以完成這個任務是有用的 - conjugate gradient (PDF -- definitely worth a read)Levenberg-Marquardt (PDF),L-BFGS - 但是從我的研究文獻中所看到的,動力和黑森州無任何方法似乎是最常見的方法。

+0

無言!感謝這樣一個詳細和準確的答案。併爲許多有用的指針! – Matteo

2

由於收斂所需的訓練迭代次數隨着向神經網絡添加複雜度而增加,因此在向神經網絡添加圖層時保持訓練長度不變會導致最終觀察到像這樣的下降。要弄清楚這是否是針對這個特定觀察的解釋,請嘗試增加您正在使用的訓練的迭代次數,看看它是否有所改善。使用更智能的停止標準也是一個不錯的選擇,但簡單的增加停用會讓你的答案更快。