Scipy.optimize.minimize:为什么全局最小化损失函数比使用 Scipy 最小化的局部函数慢得多?



我这里有两个损失函数需要最小化:

第一个是本地的,其中:

最小 f1(x1), 最小 f2(x2), 最小 F3(x3),.... 最小 FN(xn)

另一个是全局的,其中:

最小 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。因此,使其变慢。如果是这样的话,我确实希望有一些加速的方法。

顺便说一句,由于我稍后需要向优化添加全局约束,这就是为什么我必须使用全局损失函数而不是局部损失函数。

我认为你的猜测是正确的,它花费更多的时间是因为它需要计算梯度。根据 scipy.optimize.reduce (https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.minimize.html) 的描述页面,如果您提供 jac = False(可选且默认设置为 False),该方法似乎以数字方式计算梯度。

JAC : 布尔值或可调用,可选

目标函数的雅可比(梯度)。仅适用于 CG、BFGS、Newton-CG、L-BFGS- B、TNC、SLSQP、dogleg、trust-ncg、trust-krylov、trust-region-exact。如果 jac 是布尔值并且为 True,则假设 fun 返回梯度和目标函数。如果为 False,则将以数字方式估计梯度。JAC 也可以是返回目标梯度的可调用对象。在这种情况下,它必须接受与乐趣相同的论点。

基于上述,您可以设置 jac = True,然后您应该提供您的函数作为返回函数值和梯度的可调用对象。这应该会加快这个过程。 另一种方法是将您自己的可自定义最小化器编写为可调用。

最新更新