[CLPR] 用於加速訓練神經網絡的二階方法

本文翻譯自: http://www.codeproject.com/Articles/16650/Neural-Network-for-Recognition-of-Handwritten-Digi

所有二階技術都有同一個目標: 提高BP收斂的速度. 它們都使用同一種基本的方法 - 分別調整每個權值. 比如, 對於每個權值設置不同的學習速率.

在文章 Efficient BackProp, 中, LeCun博士提出了一種被稱爲"隨機對角Levenberg-Marquardt方法"的二階技術. 他把這種技術和一種"精確優化的隨機梯度算法"進行了對比, 後者是一種不依賴於二階技術的算法, 但對於每個權值都使用了不同的學習速率eta. 根據他的比較, "(隨機對角LM)額外引入的誤差是可以忽略的, 但訓練速度上 - 憑感覺 - 卻比隨機梯度算法快了3倍." (文章的35頁).

我們需要一種二階方法來加速訓練. 不使用這些方法的結果是我們的收斂會非常緩慢.

Simard博士, 在他的文章"Best Practices for Convolutional Neural Networks Applied to Visual Document Analysis,"中提到, 由於想讓算法儘量簡潔, 所以沒有使用二階技術. 他同樣承認他需要上百次循環才能收斂.(我個人認爲接近1000)

我們再來看看MNIST數據庫, 每一個循環需要60,000次BP過程, 在我的電腦上每個循環需要大概40分鐘. 我沒有耐心(也沒有自信我的代碼毫無錯誤)來等待上千次循環. 同樣地, 不像LeCun博士, 我也沒有能力去設計一個"精確優化的隨機梯度算法". 所以, 由於隨機對角LM方法會快3倍, 我的NN實現了這一方法.

我不會詳細分析數學或這個算法的代碼. 它本質上已經和標準的BP不太一樣了. 使用這個技術, 我可以在20~25次循環內收斂到一個滿意的結果. 這樣有兩個好處: 第一, 它證明了我的代碼是正確的, 因爲LeCun博士的收斂次數也是20左右; 第二, 40分鐘一次循環的情況下, 我只需要14~16個小時即可, 這可以接受.

如果你想要仔細分析這一段的代碼, 你可以查看CMNistDoc::CalculateHessian()和NeuralNetwork::BackpropagateSecondDervatives(). 另外, 應當注意NNWeight包含一個double成員, 這在前述的代碼中沒有顯式註明. 這個成員名爲diagHessian, 它存儲的是根據LeCun博士的算法計算出的曲率. 基本上, 當調用CMNistDoc::CalculateHessian()時, 500個MNIST的模式就會被隨機挑選出來. 對於每個模式, NeuralNetwork::BackpropagateSecondDervatives()會計算出每個權值的Hessian, 這個數字會被收集到diagHessian中. 在500個模式都運行結束後, diagHessian中的值都被除以500, 從而爲每個權值賦予一個獨特的diagHessian值. 在實際的BP過程中, diagHessian值被用來縮放當前的學習速率, 從而在曲率較高的區域, 學習速率降低, 反之升高.

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