如果 FD 步骤不同怎么办 w.r.t output/input
what if the FD steps varied w.r.t output/input
我正在使用有限差分方案来求梯度。
假设我在单个组件中有 2 个输出 (y1,y2) 和 1 个输入 (x)。并且事先我知道 y1 对 x 的敏感性与 y2 对 x 的敏感性不同。因此,对于那些,我可能有两个不同的步骤;
self.declare_partials(of=y1, wrt=x, method='fd',step=0.01, form='central')
self.declare_partials(of=y2, wrt=x, method='fd',step=0.05, form='central')
没有什么能阻止我(在算法上),但不清楚在这种情况下 openmdao 梯度计算究竟会做什么?
它是否通过查看步骤比率或简单地独立处理它们来交换步骤不同情况下的信息,从而使计算时间加倍?
我刚刚对此进行了测试,它对两个不同的步长进行了两次有限差分,并且只保存了每一步的请求输出。我认为我们无法按照您的建议对比率做任何事情,因为使用不同的步长来解决单个输出的原因是因为您不相信较小(或较大)步长的输出准确性。
这是一个关于 API 效果的公平问题。在典型的 FD 应用程序中,对于前向和后向差分,每个设计变量只能调用 1 次函数,而对于中心差分,则需要 2 次函数调用。
但是在这种情况下,您要求两个不同的输出具有两个不同的步长,两者都有中心差异。所以在这里,您最终会调用 4 个函数来计算所有导数。 dy1_dx 将使用 .01 的步长计算,dy2_dx 将使用 .05 的步长计算。
两个不同的 FD 调用之间没有串扰,与通过以下方式指定单个步长相比,您最终会调用更多的函数:
self.declare_partials(of='*', wrt=x, method='fd',step=0.05, form='central')
如果代价是你能承受的,并且你得到了更高的准确性,那么你可以使用这种方法为不同的输出获得不同的步长。
我正在使用有限差分方案来求梯度。 假设我在单个组件中有 2 个输出 (y1,y2) 和 1 个输入 (x)。并且事先我知道 y1 对 x 的敏感性与 y2 对 x 的敏感性不同。因此,对于那些,我可能有两个不同的步骤;
self.declare_partials(of=y1, wrt=x, method='fd',step=0.01, form='central')
self.declare_partials(of=y2, wrt=x, method='fd',step=0.05, form='central')
没有什么能阻止我(在算法上),但不清楚在这种情况下 openmdao 梯度计算究竟会做什么?
它是否通过查看步骤比率或简单地独立处理它们来交换步骤不同情况下的信息,从而使计算时间加倍?
我刚刚对此进行了测试,它对两个不同的步长进行了两次有限差分,并且只保存了每一步的请求输出。我认为我们无法按照您的建议对比率做任何事情,因为使用不同的步长来解决单个输出的原因是因为您不相信较小(或较大)步长的输出准确性。
这是一个关于 API 效果的公平问题。在典型的 FD 应用程序中,对于前向和后向差分,每个设计变量只能调用 1 次函数,而对于中心差分,则需要 2 次函数调用。
但是在这种情况下,您要求两个不同的输出具有两个不同的步长,两者都有中心差异。所以在这里,您最终会调用 4 个函数来计算所有导数。 dy1_dx 将使用 .01 的步长计算,dy2_dx 将使用 .05 的步长计算。
两个不同的 FD 调用之间没有串扰,与通过以下方式指定单个步长相比,您最终会调用更多的函数:
self.declare_partials(of='*', wrt=x, method='fd',step=0.05, form='central')
如果代价是你能承受的,并且你得到了更高的准确性,那么你可以使用这种方法为不同的输出获得不同的步长。