0
我目前在機器學習算法工作,我注意到,當我用Matlab的fminunc
算法收斂到全局最小速度非常快(幾個迭代)比較時,我手動更新參數:fminunc如何在梯度下降中優化學習速率(步長比例)值?
thetas[j] = thetas[j] - (alpha*gradient)/sampleNum;
我認爲這是因爲我天真地認爲alpha
(步數比例)是恆定的。
那麼,如何在C中實現類似fminunc
的東西呢?
我試圖從一個大的alpha
開始,並調整它,如果當前成本變得比以前的成本更大。這個問題出現在最小化函數的形狀不是線性的時候,因爲alpha
最初可以得到一個非常小的值,並且當函數形狀趨向於「平坦」時不能返回到更大的值(並且可以採取更大的步驟)。
Matlab的'fminunc'不使用梯度下降。它使用準牛頓方法,無論您如何控制步長,速度都可以快得多。 – 3lectrologos
@ 3lectrologos感謝您的洞察力。這可以解釋爲什麼當使用'fminunc'時爲二次函數取得非常好的結果。所以,也許我應該嘗試使用不同的方法,而不是改進我的「猜測」。根據您的經驗,使用準牛頓方法與梯度下降相比有任何缺點(除了可能難以實現) –
我可能不是合適的人來回答這個問題,但我認爲在Newton-如果您嘗試從頭開始實現它們(例如數字問題),那麼這些方法可能有點棘手。在性能方面,我不知道喜歡漸變下降的原因,除非你的問題非常大(見隨機梯度下降)。 – 3lectrologos