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

时间:2019-03-18 10:15:38

标签: openmdao

The OpenMDAO paper中,对这三种方法(完整,半解析和混合解析梯度)进行了描述。

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

让我们面对一个只有10个“仅显式组件”并且没有依存关系或循环连接的小组,就像Sellar Problem中那样。 (我猜这里显式或隐式都没有关系,因为系统最终会将组件视为隐式,但是无论如何)

我对本文的理解是,与model.approx()中的FD近似相比,用FD近似逼近每个分量仍然更准确。

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

  • 每个组件都需要多次调用以进行梯度近似。这肯定比逼近整个问题要昂贵得多,而对于单边FD逼近而言,逼近整个问题只需要调用多达设计变量(+1)。

  • 每个组件都需要调整FD步骤,以及可能需要对输入/输出进行规范化,因此需要进行更多工作。这是正确的吗?

1 个答案:

答案 0 :(得分:2)

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

TL; DR:现实是,当对导数使用数值逼近时,“最佳”解决方案高度依赖于模型。广义上讲,如果存在具有真正非线性求解的ImplicitComponents,那么最好使用半解析方法。如果您有一个仅包含显式组件的纯前馈模型(尽管没有作弊,但是包装的工程代码通常是真正隐式的),而没有使用OpenMDAO解算器来收敛多学科耦合,那么您可能使用整体式FD可以更快(尽管在这里半解析方法通常仍会更准确)


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

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

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

对于选项1,存在几个问题,例如,求解器收敛噪声(取决于求解器公差),减法抵消以及每个步骤重新收敛的计算成本。如果您有一个非常昂贵的非线性求解器(即调用solve_nonlinear会很昂贵),那么这种方法会变得非常昂贵,尤其是在您有很多输入的情况下。同样,您必须能够保证求解器会为您执行的每个步骤收敛,否则您将不会获得任何导数。在实践中,这种保证是很难做到的,因此也存在数值稳定性问题。

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

的确,对于选项2,您可能还要执行更多的FD步骤,因为您现在针对许多其他变量采用偏导数。但是,由于apply_nonlinear的价格便宜得多,因此对您有利。


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

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

但是,单片FD也使选择合适的步长变得困难,因为不同的组件将执行不同的计算,并且理想情况下将具有不同的最佳步长。由于只能在设计变量本身上选择步骤,因此您会陷入其中,因为它会在模型​​中传播。因此,您可能会得到不那么准确的总数(如果在模型中间执行此操作,则可能是半总数),这需要您进行更多优化迭代。

现在,如果我们稍微放松一下对显式组件性质的假设,并说确实有一个工程代码,其内部求解器包装在模型中的某个地方……您真正拥有的是一个隐式组件您没有告诉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方法永远无法提供的。