我可以使用中间变量,在优化过程中直接导出函数值、雅可比矩阵和(投影的)粗麻布矩阵吗?

问题描述 投票:0回答:1

我有一个问题,什么时候可以使用中间变量,在优化过程中可以直接从中导出函数值、雅可比矩阵和(投影的)粗麻布矩阵。

例如,我有一个函数

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
则相当快。 因此,我想坚持该策略,并且我想知道是否有任何优化器可以使用它。 优化器最好是二阶的,这样容易收敛。 它也最好基于具有信任半径的电平转换算法,因为我手头有一个很好的预处理器。

提前非常感谢!

scipy-optimize nonlinear-optimization
1个回答
0
投票

您可以获得的最接近的结果(无需使用其他成本更高的策略,例如外部缓存)是使用文档中的这一点:

jac : {可调用, ‘2点’, ‘3点’, ‘cs’, bool}, 可选

...

如果 jac 是布尔值且为 True,则假定 fun 返回包含目标函数和梯度的元组

(f, g)

然后您可以通过目标内的一次调用来减少重新计算。

此功能不适用于

hessp

© www.soinside.com 2019 - 2024. All rights reserved.