Optimization

如何選擇合適的優化算法?

  • April 5, 2013

我需要找到一個函數的最小值。閱讀http://docs.scipy.org/doc/scipy/reference/optimize.html上的文檔,我發現有幾種算法可以做同樣的事情,即找到最小值。我怎麼知道我應該選擇哪一個?

列出的一些算法

  • 使用下坡單純形算法最小化函數。
  • 使用 BFGS 算法最小化函數。
  • 使用非線性共軛梯度算法最小化函數。
  • 使用 Newton-CG 方法最小化函數 f。
  • 使用改進的 Powell 方法最小化函數。

我的函數是線性的。維度大約是 232750(這是我每次必須計算多少個不同的梯度),計算一次梯度和成本大約需要 2 分鐘,所以並不便宜。我不認為我有限制。它是確定性和連續性的。

根據您所說:我假設您必須針對 50 個變量進行優化;我還假設您遇到的情況是,找到解析導數非常昂貴(更不用說得到數值了),並且您的優化是不受約束的。

讓我強調一下,在 25-30 和 100 個變量之間,您有點不幸,因為在選擇大型或小型優化例程時,它有點像暮光區。話雖如此,但沒有任何損失。

考慮到即使是一階導數也很昂貴,從而扼殺了牛頓方法的想法。如果你的 Hessian 有點像開始的對角線,你可能會對 Quasi-Newton (BFGS) 有一些運氣。CG 通常比 BFGS 慢一點,所以可能不會有太大的改進;如果內存也是一個問題,請使用它(或者在這種情況下只使用 L-BFGS)。此外,考慮到評估函數的速度有多慢,一個簡單的最速下降/直線搜索算法會非常緩慢;模擬退火和其他隨機搜索變體也是如此(我假設您無權訪問 HMC 和所有爵士樂)。

因此,當您在進行單一功能評估時需要物超所值時:使用 Powell 的方法並測試 COBYLA;儘管它是一種受約束的優化算法,因為它會在內部線性近似函數的梯度以加快速度,但它將能夠利用函數的線性。也絕對嘗試NLopt for Python。他們有很多無梯度優化器;試試大華;這也是鮑威爾的創意(通過二次近似進行無約束優化)。

非常簡單:N-CG 算法依賴於計算 Hessian,而你的 Hessian 似乎計算起來非常昂貴。NLCG 和 BFGS 不需要它,儘管它們可能會在第一步中嘗試計算一次。

我故意省略了單純形算法,因為它是完全不同的野獸。與漸變無關。試試看,但我真的不能評論它;這實際上取決於您的問題的性質。

對於數值優化的第一個很好的參考,CTKelly 的《優化的迭代方法》一書會讓你走得很遠,很好。

引用自:https://stats.stackexchange.com/questions/55247

comments powered by Disqus

相關問答