我在这里有两个损失函数被最小化:
第一个是本地,其中:
min f1(x1), min f2(x2), min f3(x3),.... min fn(xn)
另一个是全球一个,其中:
min f(x1,x2,...,xn)= f1(x1)+ f2(x2)+ ... fn(xn)
对于每个本地问题fi(x),我有2个要优化的变量,我有1000个本地问题。相应地,对于全局问题,我有2000个变量需要优化。当然第二个有更多的参数需要优化,但由于f1,f2,f3 ... fn彼此独立,我希望它们两个应该具有可比性。
我使用scipy最小化函数进行优化(scipy.optimize.minimize)。但第二个比第一个慢得多。
我认为全球唯一的缺点就是需要比实际需要更多的渐变。例如,x1的梯度仅来自f1,但是全局计算其f2,f3 ... fn的渐变,即0。因此,使其变慢。如果是这种情况,我希望有一些方法可以加速。
BTW,因为我后来需要为优化添加全局约束,这就是为什么我必须使用全局损失函数而不是本地函数。
答案 0 :(得分:0)
我认为你的猜测是正确的,它花费更多的时间是因为它需要计算渐变。根据scipy.optimize.minimize(https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.minimize.html)的描述页面,如果你提供jac = False(可选并默认设置为False),该方法似乎以数字方式计算渐变。
jac:bool或callable,optional
雅可比(渐变)的目标函数。仅适用于CG,BFGS,Newton-CG,L-BFGS-B,TNC,SLSQP,dogleg,trust-ncg,trust-krylov,trust-region-exact。如果jac是布尔值并且为True,则假定fun会返回梯度以及目标函数。如果为False,将以数字方式估计梯度。 jac也可以是一个可调用的,返回目标的梯度。在这种情况下,它必须接受与fun相同的参数。
基于以上所述,您可以设置jac = True,然后您应该将您的函数作为可调用函数提供,它返回函数值以及渐变。这应该加快这个过程。 另一种方法是将您自己的可自定义最小化程序编写为可调用。