首页 > 解决方案 > 如何手动停止 scipy.optimize.fmin_l_bfgs_b 的优化过程?

问题描述

我正在使用spicy.optimize.fmin_l_bfgs_b优化。

计算loss和的计算器grad由一个类实现

from calculator import loss_calculator

class one_batch:

    def __init__(self, setup_dict):
        self.setup_dict = setup_dict 

    def calculate(self):
        temp_instance = loss_calculator(self.setup_dict, self.parameters)
        self.loss, self.grad = temp_instance.result()

    def objective_function(self, parameter):
        self.parameters = parameters 
        self.calculate()
        ###########################################################
        #  I want to check if some convergence occures here. If   #
        #   the convergence occurs, stop l-bfgs-b optimization.   #
        ###########################################################
        return self.loss, self.grad

为了优化,one_batch每次加载新一批示例时都会创建一个实例。

from scipy.optimize import fmin_l_bfgs_b as optimizer
model_vector = initial_vector
for n in range(niter):
    setup_dict = setup_dict # load the batch of examples 
    temp_batch = one_batch(setup_dict)
    model_update = optimizer(temp_batch.objective_function, x0=model_vector)
    model_vector = model_update

从代码中可以看出,我想要实现的是:

optimizer要求temp_batch.objective_function最小化损失函数时,如果发生收敛,我想“打破”编码在spicy.optimize.fmin_l_bfgs_b.

我怎样才能做到这一点?

标签: pythonscipy

解决方案


l_bfgs_b 算法的收敛相关参数是

  1. factr- 默认值为 1e7,如果您想提前停止拟合,请增加其值。

因子的典型值是: 1e12 表示低精度;1e7 中等精度;10.0 用于极高的精度。

如果您熟悉 optimize.minimize 函数,那么ftol和之间的关系在文档factr中给出。

请注意,ftol 选项是通过该接口提供的,而 factr 是通过该接口提供的,其中 factr 是乘以默认机器浮点精度以获得 ftol 的因子: ftol = factr * numpy.finfo(float).eps .

  1. pgtol:浮动,可选

当 max{|proj g_i | 时,迭代将停止。i = 1, ..., n} <= pgtol 其中 pg_i 是投影梯度的第 i 个分量。

试试这个,如果你想使用optimize.minimize方法l_bfgs_b


推荐阅读