2012-02-06 102 views
4

我已經實現了批處理和隨機梯度下降。雖然我遇到了一些問題。這是隨機的規則:梯度下降實現

1 to m { 
theta(j):=theta(j)-step*derivative (for all j) 
} 

我的問題是,即使成本函數變得越來越小,測試說它不好。如果我稍微改變步驟並更改迭代次數,那麼成本函數的值有點大,但結果是可以的。這是一個過度的「症狀」嗎?我怎麼知道哪一個是正確的? :)

正如我所說,即使成本函數更小,測試說它不好。

+0

「不好」是什麼意思? – 2012-02-06 16:52:04

+0

@ MichaelJ.Barber例如,期望值爲0.35,我得到0.65。這是一個區別。但是,通過不同的步數和迭代次數,我可以得到0.35。問題是,當我獲得正確的參數時,我怎麼能在更大的範圍內知道? – Andrew 2012-02-06 16:53:22

+0

@ MichaelJ.Barber,儘管成本函數值較小(它更小),但測試值與正確的測試值相差很遠,而價值成本函數中的較大值則爲測試示例提供了正確的值。 – Andrew 2012-02-06 16:59:18

回答

17

漸變下降是一種用於最小化函數的局部搜索方法。當它在參數空間中達到最小值時,將無法繼續。這使得梯度下降(和其他局部方法)容易陷入局部最小值,而不是達到全局最小值。當地的最低標準可能會或可能不會成爲您嘗試實現的良好解決方案。期待什麼取決於你想盡量減少的功能。

特別是,高維NP-完全問題可能會非常棘手。它們通常具有指數級的許多局部最優性,其中許多與成本方面的全局最優性幾乎一樣好,但參數值與全局最優值正交。這些是問題:您通常不希望能夠找到全局最優值,而只是尋找足夠好的局部最小值。這些也是相關問題:許多有趣的問題都只是這些屬性。

我建議首先測試一個簡單問題的梯度下降實現。您可以嘗試在多項式中找到最小值。由於這是一個單參數問題,因此您可以繪製沿多項式曲線的參數值的進度。你應該能夠看到是否有嚴重錯誤,並且還可以觀察搜索如何陷入局部最小值。您還應該能夠看到最初的參數選擇可能非常重要。

爲了處理更難的問題,你可以修改你的算法來幫助它避開局部最小值。一些常見方法:

  • 增加噪音。這會降低您找到的參數的精確度,從而可以「模糊」出局部最小值。然後搜索可跳出局部最小值,與噪聲相比較小,但仍然陷入更深的最小值。衆所周知的增加噪音的方法是simulated annealing

  • 增加勢頭。在使用當前漸變定義該步驟的同時,還要繼續與上一步相同的方向。如果你把上一步的一小部分作爲動量項,那麼就有繼續前進的趨勢,這可能會使搜索超過局部最小值。通過使用一個分數,這些步驟會成倍地衰減,所以差的步驟不是一個大問題。當用於訓練神經網絡時,這種梯度下降總是一種流行的修改,其中梯度下降被稱爲反向傳播。

  • 使用混合搜索。首先使用全局搜索(例如,遺傳算法,各種蒙特卡洛方法)來找到一些好的起點,然後應用梯度下降來利用函數中的梯度信息。

我不會推薦使用哪個。相反,我會建議做一些小小的研究,看看別人在解決與你正在做什麼有關的問題時所做的一切。如果純粹是一種學習體驗,動力可能是最容易工作的。

+0

你能推薦一些閱讀雜交GA與梯度下降 – Alex 2014-11-13 11:32:08

0

有很多事情可以回事:

  • step可能是一個不錯的選擇
  • 您的衍生物可能會關閉
  • 你的「期望值」可能會被誤認爲
  • 你的梯度下降可能會慢慢收斂

我會嘗試增加運行leng th,並且劇情以各種步驟值運行。一個更小的步驟將有更好的機會避免呃太大的問題。

+0

如果問題來自於局部最小值卡住,那麼*更大的步長實際上可能是更好的選擇。這將是必要的實驗。 – 2012-02-07 06:54:36

+0

對,我甚至沒有考慮過陷入局部最低點。但是,如果這是問題,那麼最好先做一些梯度下降以外的事情。 – comingstorm 2012-02-07 20:07:42

+0

太掃地了,我會說。基於漸變的方法已經成功地使用了很多次 - 漸變具有很多信息。難題很難,所以我們應該嘗試不同的方法。無論如何,不​​管我們使用什麼方法,我們都不會在大多數情況下找到全局最優化。 – 2012-02-08 07:57:29