[CLPR] 用于加速训练神经网络的二阶方法
本文翻譯自:?http://www.codeproject.com/Articles/16650/Neural-Network-for-Recognition-of-Handwritten-Digi
所有二階技術(shù)都有同一個目標: 提高BP收斂的速度. 它們都使用同一種基本的方法 - 分別調(diào)整每個權(quán)值. 比如, 對于每個權(quán)值設(shè)置不同的學(xué)習(xí)速率.
在文章?Efficient BackProp,?中, LeCun博士提出了一種被稱為"隨機對角Levenberg-Marquardt方法"的二階技術(shù). 他把這種技術(shù)和一種"精確優(yōu)化的隨機梯度算法"進行了對比, 后者是一種不依賴于二階技術(shù)的算法, 但對于每個權(quán)值都使用了不同的學(xué)習(xí)速率eta. 根據(jù)他的比較, "(隨機對角LM)額外引入的誤差是可以忽略的, 但訓(xùn)練速度上 - 憑感覺 - 卻比隨機梯度算法快了3倍." (文章的35頁).
我們需要一種二階方法來加速訓(xùn)練. 不使用這些方法的結(jié)果是我們的收斂會非常緩慢.
Simard博士, 在他的文章"Best Practices for Convolutional Neural Networks Applied to Visual Document Analysis,"中提到, 由于想讓算法盡量簡潔, 所以沒有使用二階技術(shù). 他同樣承認他需要上百次循環(huán)才能收斂.(我個人認為接近1000)
我們再來看看MNIST數(shù)據(jù)庫, 每一個循環(huán)需要60,000次BP過程, 在我的電腦上每個循環(huán)需要大概40分鐘. 我沒有耐心(也沒有自信我的代碼毫無錯誤)來等待上千次循環(huán). 同樣地, 不像LeCun博士, 我也沒有能力去設(shè)計一個"精確優(yōu)化的隨機梯度算法". 所以, 由于隨機對角LM方法會快3倍, 我的NN實現(xiàn)了這一方法.
我不會詳細分析數(shù)學(xué)或這個算法的代碼. 它本質(zhì)上已經(jīng)和標準的BP不太一樣了. 使用這個技術(shù), 我可以在20~25次循環(huán)內(nèi)收斂到一個滿意的結(jié)果. 這樣有兩個好處: 第一, 它證明了我的代碼是正確的, 因為LeCun博士的收斂次數(shù)也是20左右; 第二, 40分鐘一次循環(huán)的情況下, 我只需要14~16個小時即可, 這可以接受.
如果你想要仔細分析這一段的代碼, 你可以查看CMNistDoc::CalculateHessian()和NeuralNetwork::BackpropagateSecondDervatives(). 另外, 應(yīng)當注意NNWeight包含一個double成員, 這在前述的代碼中沒有顯式注明. 這個成員名為diagHessian, 它存儲的是根據(jù)LeCun博士的算法計算出的曲率. 基本上, 當調(diào)用CMNistDoc::CalculateHessian()時, 500個MNIST的模式就會被隨機挑選出來. 對于每個模式,?NeuralNetwork::BackpropagateSecondDervatives()會計算出每個權(quán)值的Hessian, 這個數(shù)字會被收集到diagHessian中. 在500個模式都運行結(jié)束后,?diagHessian中的值都被除以500, 從而為每個權(quán)值賦予一個獨特的diagHessian值. 在實際的BP過程中,?diagHessian值被用來縮放當前的學(xué)習(xí)速率, 從而在曲率較高的區(qū)域, 學(xué)習(xí)速率降低, 反之升高.
轉(zhuǎn)載于:https://www.cnblogs.com/lancelod/p/4062352.html
總結(jié)
以上是生活随笔為你收集整理的[CLPR] 用于加速训练神经网络的二阶方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [原创] 浅谈ETL系统架构如何测试?
- 下一篇: Table '' is marked a