全、半和混合解析梯度:OpenMDAO 论文

Full, semi and mixed analytic gradients: The OpenMDAO paper

The OpenMDAO paper 中描述了 3 种方法(完全、半和混合分析梯度)。

我想澄清一件事。据说半解析技术比近似整个模型的梯度更强大。

让我们以具有 10 个“仅显式组件”并且没有依赖关系或循环连接的单个组作为 Sellar Problem 中的问题。 (我想这里显式或隐式并不重要,因为系统最终会将组件视为隐式,但无论如何)

我从论文中的理解是,用 FD 逼近每个组件仍然比 model.approx() 中用 FD 逼近整个问题更准确。

假设我的理解是正确的,由于我看到的缺点,我对推广这种用法感到困惑;

如果您的模型只有 ExplicitComponent 实例,那么情况会稍微微妙一些,并且很难提供经验法则。

TL;DR:现实情况是,当对导数使用数值近似时,"best" 解决方案高度依赖于模型。从广义上讲,如果有任何具有真正非线性求解的 ImplicitComponents,那么您最好使用半解析方法。如果你有一个只有显式组件的纯前馈模型(虽然没有作弊,包装的工程代码通常实际上是隐式的)并且没有使用 OpenMDAO 求解器来收敛多学科耦合,那么你 可能 使用单片 FD 获得更快的速度(尽管半分析方法在这里通常仍然更准确)


当您的模型中有 ImplicitComponent 实例时,计算权衡会更加清晰。所以让我们先考虑一下。为了简单起见,让我们考虑一个只有一个 ImplicitComponent 实例的模型,它提供自己的内部 solve_nonlinear 方法。在这里,您有两个选择:

1) 传统的 FD 方法,它将通过跨 solve_nonlinear 方法的步骤计算 d_outputs/d_inputs。这将涉及为每个 FD 近似完全重新收敛模型(每个输入一次)。

2) 半解析 FD,它通过跨 apply_nonlinear 方法采取步骤计算 partial_outputs/partial_inputs,然后依靠 OpenMDAO 的解析衍生功能为您计算总数。

对于选项 1,存在多个问题,例如求解器收敛噪声(取决于求解器容差)、减法抵消以及每步重新收敛的计算成本。如果您有一个非常昂贵的非线性求解(即调用 solve_nonlinear 的成本很高),那么这种方法可能会变得非常昂贵,尤其是当您有很多输入时。此外,您必须能够保证求解器会针对您采取的每一步收敛,否则您将无法获得任何导数。实际上,这种保证是很难做到的,因此也存在数值稳定性问题。

对于选项 2,即使您有更多的隐式变量要处理,您也只是调用 apply_nonlinear,这通常比完全非线性求解快几个数量级。它也不会遭受那么多的数字问题。与完全收敛的非线性求解相比,确保获得有效的残差评估要容易得多,因此实际上消除了稳定性问题。此外,您无需担心松散的求解器公差引入的噪声。如果你使用 FD,你仍然会因为微小的步骤而遭受减法取消,但这是唯一真正的弱点(并且可以通过使用 CS 来消除)。

的确,对于选项 2,您可能需要执行更多的 FD 步骤,因为您现在要对许多附加变量求偏导数。但是,由于 apply_nonlinear 总的来说便宜得多,所以这对您有利。


现在回到关于所有显式组件的大型模型的原始问题。这里有一组更复杂的权衡。首先让我们假设您所有的显式组件都是简单的解析函数(即 none 它们实际上调用了某种非线性求解器或外部工程代码)。

在这里,您不会遇到求解器容差引起的数值噪声问题。并且如果您的设计变量很少,那么如果您执行 FD at the top of your model. 可能会产生最少的函数调用,这可能会给您带来最便宜的 FD 成本,但取决于 FD 的准确性,它也可能会导致更多优化迭代和更高的整体计算成本。

但是,单片 FD 也使得 select 难以采用良好的步长,因为不同的组件将执行不同的计算,理想情况下会有不同的最佳步长。由于您只能 select 设计变量本身的步骤,因此您会遇到通过模型传播的问题。因此,您可能会获得不太准确的总导数(如果您在模型中间执行此操作,则可能是半总导数)需要您进行更多优化迭代。

现在,如果我们稍微放宽对显式组件的性质的假设,并说确实有一个工程代码及其自己的内部求解器包裹在模型中的某处......你真正拥有的是您没有告诉 OpenMDAO 的隐式组件。所以再次重申,最好将其包装为隐式组件(暴露残差计算)。在这种情况下,您无法在仍然利用半解析方法的同时对模型进行整体 FD。所以在这里,您通常更喜欢分别 FD 每个组件。在 2014 年一篇题为 "Automatic Evaluation of Multidisciplinary Derivatives Using a Graph-Based Problem Formulation in OpenMDAO" 的论文中,我们展示了这一点。即使您在具有大量输入的最昂贵的分析(FEA 求解器)上使用 FD,与整体 FD 相比,半解析方法仍然快得多。


我还没有触及的半解析方法的另一个优点是它允许您混合 FD、CS 和解析导数。您可以从完整的 fd 开始,转向 CS 进行一些更非线性的计算,然后当您的开发速度减慢时开始添加分析导数。每次升级衍生产品时,您都会看到性能提升。

因此,即使半解析方法一开始速度较慢,它也为您提供了一条整体 FD 方法永远无法提供的升级途径。