Algorithms
如何定義梯度下降的終止條件?
實際上,我想問你如何定義梯度下降的終止條件。
我可以根據迭代次數停止它嗎,即考慮參數值,比如 100 次迭代?
或者我應該等待,使得兩個參數值“新”和“舊”的差異非常小到可以說的順序? 這肯定需要很多時間。
什麼是最好的方法?在我的情況下,即使是一次迭代也需要大量時間。在這種情況下,如果我等待第二種情況,我猜它甚至可能需要數週時間。
那麼我應該使用哪種方法。如何應對這種情況?
好問題。我在文獻中看到了很多停止規則,每個規則都有優點和缺點,具體取決於上下文。例如,R 中的
optim
函數至少有三個不同的停止規則:
maxit
,即預定的最大迭代次數。我在文獻中看到的另一個類似選擇是超時前的最大秒數。如果您只需要一個近似的解決方案,這可能是一個非常合理的方案。事實上,有些模型(尤其是線性模型)的提前停止類似於在參數值上放置高斯先驗。常客會說你有一個“L2 規範”而不是先驗,但他們也會認為這是一件合理的事情。我只是略讀了這篇論文,但它討論了提前停止和正則化之間的關係,可能會幫助您獲得更多信息。但簡短的版本是,是的,提前停止可能是一件非常受人尊敬的事情,這取決於你做什麼abstol
,即當函數“足夠接近”為零時停止。這可能與您無關(聽起來您並不期待零),所以我將跳過它。reltol
,這就像你的第二個建議——當改進低於閾值時停止。我實際上不知道這方面有多少理論,但是與使用少量最大迭代次數相比,您可能會傾向於通過這種方式獲得更低的最小值。如果這對您很重要,那麼運行代碼進行更多迭代可能是值得的。另一類停止規則與優化驗證數據集(或交叉驗證)而不是訓練數據上的成本函數有關。根據您要使用模型的目的,您可能希望在訓練數據達到局部最小值之前停止,因為這可能涉及過度擬合。我很確定 Trevor Hastie 寫過關於這樣做的好方法,但我不記得引用了。
在合理的時間內找到較低最小值的其他可能選項包括:
- 隨機梯度下降,它只需要一次估計一小部分數據的梯度(例如,“純”SGD 的一個數據點,或小批量)。
- 更高級的優化函數(例如牛頓型方法或共軛梯度),它們使用有關目標函數曲率的信息來幫助您指向更好的方向並在下坡時採取更好的步長。
- 更新規則中的“動量”術語,以便優化器在下坡方面做得更好,而不是在目標函數中限制峽谷壁。
這些方法都在我在網上找到的這些講義中討論過。
希望這可以幫助!
編輯哦,您還可以嘗試獲得更好的起始值(例如,通過解決問題的更簡單版本),以便從“熱啟動”獲得接近最佳值的迭代次數更少。