【问题标题】:MATLAB: Slow convergence of convex optimization algorithmMATLAB:凸优化算法的缓慢收敛
【发布时间】:2012-05-21 09:56:14
【问题描述】:

我想加快 MATLAB 中凸优化问题的收敛速度。

我的目标函数是具有三个参数的凸函数,我正在使用梯度上升来最大化。

现在我正在手动编写迭代,终止条件是新参数值和旧参数值之间的差异非常小(大约 0.0000001)。我不能根据迭代次数终止,因为它不能保证它已经收敛到最优解。

因此,收敛需要很长时间 - 将近 2 天!有什么办法可以加快速度吗?

其实我的目标函数只有三个参数。我知道我的第一个参数的值应该大于第二个参数的值。

所以从初始条件开始,第二个参数的值开始快速增加。达到某一点后,第一个参数的值开始快速增加。当第一个参数的值开始增加时,第二个参数的值开始缓慢下降。最终,我的第一个参数的值大于第二个参数的值。

有什么方法可以加快这个过程吗? 2天是很长的时间。此外,计算梯度也很耗时。它需要大量的矩阵计算。

我不想从定义的参数值开始,比如 parameter1 的值大于第二个的值。此外,第一个参数不必总是大于第二个参数。我只知道哪个参数值应该更大。有什么建议吗?

【问题讨论】:

  • 老实说,一点点数学知识会有助于理解您的问题。目标函数是什么?你用的是什么算法?你是如何实施的?我只看到三个可能的问题:你的算法不是目标函数的好选择,你的初始值不好或者你的实现不是最优的。
  • 是的,与其告诉我们变量和它们的值,你应该提供更多关于你的梯度上升实现的细节,尤其是你的更新规则。
  • 梯度搜索是牛顿类型的优化,但它是该系列中最慢的。如果它是非线性的,你为什么不试试 Gaus-Newton(有或没有 LM)或BFGS。大多数情况下,这些速度要快得多。完成其他解决方案:也许你可以使用yalmip
  • 如果您将代码(至少是执行梯度搜索的部分)和最重要的目标函数提供给我们,我认为您仍然会得到更复杂的答案。
  • 如果你的梯度不是解析的,那么你不应该使用基于梯度的方法。您至少应该尝试一种单纯形法,但我认为 Matlab 的优化工具箱还有其他非梯度选项。如果你的梯度是分析的,我绝对同意@GuntherStruyf。尝试使用具有更好收敛性的基于梯度的算法(BFGS 非常好)。如果这些都不够快,那么您需要分析您的代码(请参阅help profile)并尝试优化您正在调用的函数。

标签: matlab mathematical-optimization convex-optimization


【解决方案1】:

如果梯度的计算速度很慢,而你仍然想手动实现,你可以试试这个,它需要更多的步骤,但可能会更快,因为步骤很简单:

定义步长

尝试变量在步长方向上移动 -1、0 或 1 次的所有点(3^3 = 27 种可能性)

选择最好的

如果最好的一个是你之前的一个,则将步长乘以因子 0.5

当然,这个过程的成功取决于你的函数的属性。此外应该注意的是,一个更简单的解决方案可能是将所需的差异设置为 0.0001

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-16
    • 2012-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多