至少在它的表面上,這似乎是所謂的「消失梯度」問題的一種情況。
激活功能
你的神經元激活根據邏輯S形函數,F(X)= 1 /(1 + E^-x):
該活化功能經常使用,因爲它有幾個很好的屬性。一個很好的這些性質是f的衍生物(x)的計算表達使用函數本身的值,爲f'(X)= F(X)(1 - F(X))。該函數對於接近零的x具有非零值,但快速地以| x |爲零變大:
梯度下降
在與後勤激活的前饋神經網絡,該誤差通常向後通過網絡利用所述第一導數作爲學習信號傳播。網絡中權重的通常更新與由權重乘以當前權重值乘以邏輯函數導數得出的誤差成正比。
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 - 但是從我的研究文獻中所看到的,動力和黑森州無任何方法似乎是最常見的方法。
你的激活功能是什麼? –
你如何確定訓練需要多長時間?更多層的網絡需要更長的時間才能收斂。 – seaotternerd
@AtillaOzgur - 請注意,我更新了問題以回答您的評論! – Matteo