【发布时间】:2012-05-21 09:56:14
【问题描述】:
我想加快 MATLAB 中凸优化问题的收敛速度。
我的目标函数是具有三个参数的凸函数,我正在使用梯度上升来最大化。
现在我正在手动编写迭代,终止条件是新参数值和旧参数值之间的差异非常小(大约 0.0000001)。我不能根据迭代次数终止,因为它不能保证它已经收敛到最优解。
因此,收敛需要很长时间 - 将近 2 天!有什么办法可以加快速度吗?
其实我的目标函数只有三个参数。我知道我的第一个参数的值应该大于第二个参数的值。
所以从初始条件开始,第二个参数的值开始快速增加。达到某一点后,第一个参数的值开始快速增加。当第一个参数的值开始增加时,第二个参数的值开始缓慢下降。最终,我的第一个参数的值大于第二个参数的值。
有什么方法可以加快这个过程吗? 2天是很长的时间。此外,计算梯度也很耗时。它需要大量的矩阵计算。
我不想从定义的参数值开始,比如 parameter1 的值大于第二个的值。此外,第一个参数不必总是大于第二个参数。我只知道哪个参数值应该更大。有什么建议吗?
【问题讨论】:
-
老实说,一点点数学知识会有助于理解您的问题。目标函数是什么?你用的是什么算法?你是如何实施的?我只看到三个可能的问题:你的算法不是目标函数的好选择,你的初始值不好或者你的实现不是最优的。
-
是的,与其告诉我们变量和它们的值,你应该提供更多关于你的梯度上升实现的细节,尤其是你的更新规则。
-
如果您将代码(至少是执行梯度搜索的部分)和最重要的目标函数提供给我们,我认为您仍然会得到更复杂的答案。
-
如果你的梯度不是解析的,那么你不应该使用基于梯度的方法。您至少应该尝试一种单纯形法,但我认为 Matlab 的优化工具箱还有其他非梯度选项。如果你的梯度是分析的,我绝对同意@GuntherStruyf。尝试使用具有更好收敛性的基于梯度的算法(BFGS 非常好)。如果这些都不够快,那么您需要分析您的代码(请参阅
help profile)并尝试优化您正在调用的函数。
标签: matlab mathematical-optimization convex-optimization