为什么要花这么多精力来解决凸程序?对我(我是一个新手)来说,所有凸方法(可能很复杂)看起来都像是基于导数的方法的一种变体,从根本上来说并不比枯燥的梯度下降法好。同时,有很多现实生活中的非凸任务实际上没有(在我看来)如此发达的数学理论(遗传算法、分支定界、退火等)。为什么?有没有将非凸任务转换为凸任务的方法?还是现代数学在非凸任务上的弱点表现?
请说清楚...
为什么要花这么多精力来解决凸程序?对我(我是一个新手)来说,所有凸方法(可能很复杂)看起来都像是基于导数的方法的一种变体,从根本上来说并不比枯燥的梯度下降法好。同时,有很多现实生活中的非凸任务实际上没有(在我看来)如此发达的数学理论(遗传算法、分支定界、退火等)。为什么?有没有将非凸任务转换为凸任务的方法?还是现代数学在非凸任务上的弱点表现?
请说清楚...
开始之前,我建议阅读Stephen Boyd对这本书的介绍。他在凸优化方面进行了大量前沿研究,是该领域的知名人士之一。
通常,“使”你的问题凸出的问题是问题公式的重新参数化。但有时您尝试优化的函数不是凸函数,因此您可以优化凸近似值,该近似值通常与相同的全局最优值一致。还有一些函数是高度非凸的,例如深度神经网络,需要求助于其他方法(反向传播)。
这个主题为什么重要的事实与优化的历史有关。人们设法解决了线性程序,其中单纯形法是解决这类问题的第一个广泛使用的方法之一。然后他们开始解决二次规划和其他类型的问题,但没有明显的泛化。这些问题的共同点是凸性。事实证明,您可以将凸优化问题放在规范形式中,这只是一个线性规划。从而有可能解决一大类问题。这是迄今为止我们最好的概括,我认为我们不能比这更进一步概括。离散问题的继续松弛通常也会产生凸问题。
大多数基本的优化问题都是凸的,很多统计数据都依赖于凸优化。在某些情况下,您可以获得最优的封闭形式解决方案(例如线性回归),但很容易定义没有封闭形式解决方案的问题(例如套索)。如果您正在处理这样的问题,最好有一个工具来验证您的目标函数是否为凸函数并对其进行优化。这在 Boyd 等人开发的软件 CVX 中是可能的。这对于原型设计来说非常好,但是如果您需要更快的求解器,有时您需要利用问题的复杂性,您必须创建一个运行速度更快的求解器。
牛顿法、单纯形法和其他方法的共同点是它们是确定性的。它们总是产生相同的结果。遗传算法不给你这个保证。它们通常运行得更慢,并且更适合当您有嘈杂的目标函数或潜在的高度多模态目标函数时。
这完全取决于您要解决的问题,您想使用哪种方法。阅读本书的介绍,它会带你走得很远!
花这么多时间开发凸编程的原因是它已经很好地解决了很多问题,因此进一步改进它是值得的。
此外,简单的梯度下降不适用于许多非常有趣的大型非光滑(但凸)问题。在 1-2 维中容易有效处理的东西在 1000 维中可能变得困难。