我们如何指定给定参数不影响 OpenMDAOv1+ 中组件的梯度?

How can we specify that a given parameter does not affect the gradient of a component in OpenMDAOv1+?

我们如何指定给定参数不影响OpenMDAOv1+中组件的梯度?在早期版本中我们设置了 missing_deriv_policy = 'assume_zero',但在新的 OpenMDAO1+ 中似乎不存在。我想我可以通过 super__init__ 函数中添加输入,而不是将它们包含在 params 中,这样它们对 OpenMDAO 是不可见的,或者可能只是 return 偏导数为 0,但 intended/recommended 方式是什么?很抱歉,如果这在文档中,那么我一定是错过了它。

如果您不希望您的参数影响渐变并且您不需要将该参数连接到另一个组件,那么您绝对应该将其设为组件的常规 python 属性,这样它对框架是不可见的。如果您确实需要将它连接到另一个组件,那么您可以在该变量的元数据中设置 'pass_by_obj',它将由 OpenMDAO 数据传递系统传递,但不会影响梯度。遗憾的是,'pass_by_obj'只能串口使用。它在 MPI 中还不起作用。

共有三个选项:

  1. 使其成为 python 属性而不是框架变量。
  2. 使用对象传递
  3. 将其排除在雅可比矩阵之外

如果该值是特定于某个组件的常量并且从不需要 OpenMDAO 将它传递给其他任何东西,您可以使用 1。如果您确实需要传递信息,那么我建议使用 2 或 3。

如果您有一个要传递的值,但它不是浮点数或浮点数数组(即列表或字典甚至整数数组),那么您将使用选项 2。OpenMDAO 将传递数据在你周围,但出于优化的目的,它将被完全忽略。

但是,如果您有一个浮点数或浮点数数组的值,并且您希望在优化中考虑它,那么您应该使用选项 3。这可能是最常见的情况!也许您有一个参数不会影响组件中的输出之一,但会影响其他输出。在这种情况下,当您构建偏导数字典时,您只需省略希望为零的密钥对。 OpenMDAO 理解任何未定义的导数都暗示为零。

因此,如果您有一个函数,f(x,y,z) = 3*x + 2*y,那么 z 对它没有影响,您可以按如下方式定义雅可比矩阵:

J = {}
J['f','x'] = 3    
J['f','y'] = 2    

通过省略 ('f','z') 偏导数,我告诉 OpenMDAO 它为零。