2012-12-22 101 views
0

我目前在機器學習算法工作,我注意到,當我用Matlab的fminunc算法收斂到全局最小速度非常快(幾個迭代)比較時,我手動更新參數:fminunc如何在梯度下降中優化學習速率(步長比例)值?

thetas[j] = thetas[j] - (alpha*gradient)/sampleNum;

我認爲這是因爲我天真地認爲alpha(步數比例)是恆定的。

那麼,如何在C中實現類似fminunc的東西呢?

我試圖從一個大的alpha開始,並調整它,如果當前成本變得比以前的成本更大。這個問題出現在最小化函數的形狀不是線性的時候,因爲alpha最初可以得到一個非常小的值,並且當函數形狀趨向於「平坦」時不能返回到更大的值(並且可以採取更大的步驟)。

+1

Matlab的'fminunc'不使用梯度下降。它使用準牛頓方法,無論您如何控制步長,速度都可以快得多。 – 3lectrologos

+0

@ 3lectrologos感謝您的洞察力。這可以解釋爲什麼當使用'fminunc'時爲二次函數取得非常好的結果。所以,也許我應該嘗試使用不同的方法,而不是改進我的「猜測」。根據您的經驗,使用準牛頓方法與梯度下降相比有任何缺點(除了可能難以實現) –

+0

我可能不是合適的人來回答這個問題,但我認爲在Newton-如果您嘗試從頭開始實現它們(例如數字問題),那麼這些方法可能有點棘手。在性能方面,我不知道喜歡漸變下降的原因,除非你的問題非常大(見隨機梯度下降)。 – 3lectrologos

回答

3

Matlab的fminunc實際上並未使用梯度下降,而牛頓等的方法(BFGS-based quasi-Newton or trust-region根據問題的大小),這是一般比梯度下降顯著更快,無論你如何選擇步長。

也許你應該看看這種方法,如果你想更快的收斂。