我注意到定义不必要的偏导数会显着减慢优化器的速度。因此,我试图理解:我怎么知道是否应该为某个输入/输出关系定义偏导数?
答案 0 :(得分:1)
我认为如果它们与优化中的响应(约束或目标)相关,或者作为组内非线性求解的一部分,则需要定义它们。我个人的做法是始终定义它们。我是否应该每次都改变我的优化问题,我经常这样做,我不想再回过头来确保我总是定义合适的衍生产品。
OpenMDAO的主分支包含一些雅可比着色技术,如果您的问题特别稀疏,可以显着提高性能。通过在驱动程序上设置以下选项来启用此方法:
p.driver.options['dynamic_simul_derivs'] = True
p.driver.options['dynamic_simul_derivs_repeats'] = 5
此方法的工作原理是用随机数填写用户描述的稀疏模式(在声明部分中用rows
和cols
指定)并计算总雅各比。重复选项是为了提高结果的可信度,因为它可能但不太可能一次通过将导致偶然的零"在jacobian中,它不是稀疏结构的真正组成部分。
使用这种技术,并通过计算而不是使用嵌套for循环进行矢量化,我已经能够在很多情况下获得非常好的性能。当然,这些方法的有效性将从模型转变为模型。
答案 1 :(得分:1)
当你说“不必要”时,你的意思是偏导数总是为零吗?
使用declare_partials('*', '*')
,当组件实际上比它更稀疏时,会大大减慢模型的速度。在偏导数始终为零的任何地方,您都不应该声明它。
此外,如果你有矢量化操作,那么雅可比实际上是一个对角矩阵。在这种情况下,您应该通过向rows
调用1提供cols
和declare_partial
个参数来声明[稀疏偏导数]。这通常会大大加快您的代码速度。
从技术上讲,如果您遵循从所有设计变量,每个组件到目标和约束的数据路径,那么您传递的任何变量都需要定义其部分。但实际上你应该声明并指定每个输出w.r.t的所有部分。每个输入(除非它们为零),因此模型连接的更改不会破坏您的衍生产品。
需要更多的时间来更轻松地声明你的部分,但性能提升是非常值得的。