我有一个问题,什么时候可以使用中间变量,在优化过程中可以直接从中导出函数值、雅可比矩阵和(投影的)粗麻布矩阵。
例如,我有一个函数
f
取决于 q
,而它又取决于 x
。
f
的一个很好的特性是它的雅可比 g
和投影的粗麻布 hv
都直接依赖于 q
。
因此,我可以从 q
计算一次 x
,同时获得所有 f
、g
和 hv
。
在 python/scipy 中,我可以将 q
设置为全局变量。在每次优化迭代中,在用f
评估myfunc
时,q
会根据当前的x
自动更新;在计算 g
和 hv
时,x
和 myjac
函数读取全局 myhessp
并返回相应的导数,而不是处理 q
。
类似的东西
q=0
def myfunc(x):
global q
q=foo(x)
return bar0(q)
def myjac(x):
# do nothing with x
return bar1(q)
def myhessp(x):
# do nothing with x
return bar2(q)
scipy.optimize.minimize(myfunc,initial_guess_x0,method="blablabla",jac=myjac,hessp=myhessp)
在每次迭代中,如果
myfunc
、myjac
和 myhessp
仅用 1 个 $x$ 分别评估一次,则该策略肯定会起作用。
然而,一些优化器在一次迭代中使用多个 x
来评估这些值。
当优化器尝试使用除当前用于评估 g
的 hv
以外的 x_prime
来评估 x
和 f
时,x_prime
实际上不会产生任何影响,而是使用 q
源自 x
被错误读取。
当然,对f
的多次评估是可以容忍的,因为在myfunc
中,f
是从q
获得x
之后获得的。
一个例子是有限差分数值 hessian 的使用。 为了评估数值 Hessian,优化器需要使用许多不同的
myjac
来调用 x
。
由于 myjac
只读取未更改的 q
而不是 x
,因此所有雅可比矩阵将完全相同。
我尝试过让
myjac
和myhessp
从g
而不是hv
计算x
和q
,但在我的例子中,q
的评估非常耗时。
相比之下,从 g
获得 hv
和 q
则相当快。
因此,我想坚持该策略,并且我想知道是否有任何优化器可以使用它。
优化器最好是二阶的,这样容易收敛。
它也最好基于具有信任半径的电平转换算法,因为我手头有一个很好的预处理器。
提前非常感谢!
您可以获得的最接近的结果(无需使用其他成本更高的策略,例如外部缓存)是使用文档中的这一点:
jac : {可调用, ‘2点’, ‘3点’, ‘cs’, bool}, 可选
...
如果 jac 是布尔值且为 True,则假定 fun 返回包含目标函数和梯度的元组
。(f, g)
然后您可以通过目标内的一次调用来减少重新计算。
此功能不适用于
hessp
。