对于标准线性代数/优化方法来说,什么太大了?

计算科学 线性代数 优化 非线性规划
2021-11-27 09:53:16

不同的数值线性代数和数值优化方法具有不同的大小范围,它们是一个“好主意”,除了它们自己的属性。例如,对于非常大的优化问题,使用梯度、随机梯度和坐标下降法代替牛顿法或内点法,因为您不必处理 Hessian。同样,密集线性求解器方法在一定大小后不再可行。

因此,鉴于算法和计算机硬件都在不断变化,有什么好方法可以了解并跟上标准线性代数和优化求解器的大小?

(我正在考虑这个问题,因为当您是数字算法的最终用户时,对何时可以应用这些算法有一个模糊的想法很重要。其中一部分是问题结构和所需的解决方案,但一部分是也只是问题的大小。)

编辑:更具体地说,让我想到这一点的是关于上限的不同经验法则,即内点算法可以解决多大的问题。早期的论文说维数应该在 1000 左右,而后来的论文已经向上修正到 5000,甚至最近的论文允许更大,这取决于你是否可以利用稀疏性。这是一个相当大的范围,所以我很好奇最先进的内点方法有多大。

3个回答

如果保持稀疏性,有最优的预处理器,并且不等式约束可以通过多尺度方法解决(或者活动约束的数量不太大),则整体算法可以O(n)时间和空间。在并行机器上分布会在时间上增加一个对数项。如果有足够的稀疏性,或者如果使用无矩阵方法,则每个核心可以解决大约一百万个自由度。这使得当今最大机器的问题规模达到了大约一万亿自由度。几个小组已经以这种规模运行了 PDE 模拟。

请注意,仍然可以在较大的设计空间中使用基于牛顿的优化,您只需要使用 Hessian 进行迭代求解。有很多方法可以有效地做到这一点。

所以这一切都取决于你如何定义“标准方法”。如果您的定义包括多级结构保持方法,那么非常大的问题是易于处理的。如果您的定义仅限于非结构化密集方法,则可行的问题规模要小得多,因为算法在时间或空间上都不是“可扩展的”。

限制主要由存储矩阵表示所需的内存以及从内存中检索它的时间给出。

这使得密集矩阵方法在简单环境中的限制达到几千。对于稀疏问题,直接求解器的限制要高得多,但取决于稀疏模式,因为必须适应填充。线性求解器的迭代方法的极限本质上是矩阵向量乘法的成本。

求解线性子问题的极限直接转化为非线性方程组和优化问题的局部求解器的相应极限。

全局求解器有更严格的限制,因为它们受限于需要在分支定界框架中求解的子问题数量,或者随机搜索方法中的维数灾难。

对于给定的一类问题,找出什么构成“太大”的好方法是:

  • 搜索您所在领域的文献;了解哪些因素会限制执行时间(包括内存使用和通信)
  • 查看测试问题集(串行算法比并行算法更好,因为我不知道并行算法的许多测试问题集)
  • 将算法分解成更小的组成部分,并使用您对这些部分的了解来推断整体(例如:Krylov 子空间方法归结为矩阵向量乘积的循环,因此您必须计算出多少次迭代是“太多”,是什么让矩阵向量积“太大”)
  • 自己尝试一下(在串行机器上,或者如果你有资源,在并行机器上)。查看您可以运行多大的实例,或运行多个不同大小的实例,并进行经验扩展分析(时间与问题大小)。

举个例子,在全局优化中,具体的答案是非常依赖结构的。正如 Arnold Neumaier 所指出的,确定性全局优化算法往往受到必须在分支定界(或分支切割)框架中解决的子问题数量的限制。我已经解决了包含数千个二进制变量的混合整数线性规划 (MILP),但我怀疑我能够解决如此大的问题(相对而言,对于 MILP)的原因是因为问题结构是如此之少,只需要解决几个子问题一些关键的二进制变量集,其余的可以设置为零。我知道我的问题是“大”的;我已经构建了其他类似大小的 MILP,它们的求解速度要慢数万倍。

有全局优化测试集可以让您了解什么是“普通”,而文献可以让您了解哪些问题是“大”的。存在类似的策略来确定其他领域问题规模的最新水平,这就是 Jed Brown 和 Arnold Neumaier 引用这些数字的方式。获得这些数字固然好,但在时机成熟时能够自己弄清楚如何获得它们更有价值。