我有一个非常复杂的模型,我需要解决许多参数。即使模型很复杂,每一步的功能形式也不是不规则的。
我看到一些带有起始值的奇怪行为。如果我从标准的随机值(全0)开始,求解器在673s中收敛于“找到本地最优解”,0次CG迭代。
如果我从我所知道的接近解的值开始,求解器会收敛于“原始可行解决方案估计无法改进”,即1718年的493次CG迭代。
请注意,在这两种情况下,最终值都相同(或非常相似)。
2个问题:
答案 0 :(得分:4)
从第一个问题开始,我们了解到您正在使用“智能”解算器,即动态调整算法以最佳地收敛。共轭梯度法是“远程”找到最优值的好方法,但是当你接近浅的最佳值时收敛很慢。
与所有“智能”代码一样,有些情况下启发式失败,而您遇到了一个。我假设您的最优值相当浅,因此如果您的参数稍有变化,目标函数(即您尝试优化的实际标准)变化很小。现在解算器无法知道参数已经非常接近最佳值。尽管如此,它知道在目标函数相当平坦的区域中它可能离解决方案很远。经过一些初步测试后,默认采用共轭梯度法,这是一种接近最优的缓慢但安全的方法。然而,由于经过大量的搜索后它实际上并没有走得太远,它告诉你,如果你很幸运,你开始接近最佳状态,但如果你运气不好,你的解决方案远离最佳解决方案。
如果您知道您的初步猜测会非常好,那么您可能需要检查您的求解器是否允许指定应该/不应该使用哪些算法。
答案 1 :(得分:4)
共轭梯度是一种gradient-type优化算法(也称为“最速下降”),在某些情况下可能会出现收敛缓慢的情况。即使你接近最佳状态。
在WikiPedia上,你可以找到数字来说明这种行为,我在这里调整了其中一个:
您所看到的是等高线图上的等成本(或等目标)线。让我们假设我们从第1点开始,这是一个非常好的起始值。红线表示达到最佳路径。我们看到它向最优化方向转动,这需要进行大量的功能评估,因此需要时间。
如果我们将A点作为起始值进行比较,那么我们会得到更快的收敛(或者至少,这就是我在这种情况下所期望的)。我们假设在这种情况下只需要一次迭代。
现在看一下第5点,它显然接近最佳值,但需要大量迭代才能达到最佳状态。当你接近一个狭窄的山谷时,算法会从一侧跳到另一侧,只能在途中达到最佳状态。当你从山谷的较宽的一侧接近时,你会发现渐变更多地指向最佳,这会导致更快的收敛。
在您的情况下,可能是您的初始值有点像上面的第5点,而通用起始值与A点相当。这是假设您的起始值收敛到真值,这可能是不是这样的。如果您的起始值接近但它与全局最优值之间存在峰值,则不会收敛到正确的值,如下图所示。
当knitro更改为CG或其他算法之一时,应该在文档中提及或者只有knitro的开发人员知道。
答案 2 :(得分:-1)
嗯,这是因为起始值只是问题解决方案的近似值,因为迭代解决方案试图通过尝试收敛到最终值来接近,然后越接近答案起始值,您需要收敛的迭代次数越少。收敛阈值也应计算在内。
这是经典的知情与非知情问题,如果你从ad-hoc值开始,如果你从良好的非ad-hoc值开始,结果将更难找到。