如何手动停止scipy.optimize.fmin_l_bfgs_b的优化过程?

时间:2018-12-23 05:33:49

标签: python scipy

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

用于计算lossgrad的计算器是由一个类实现的

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中编码的优化过程。

我该怎么做?

1 个答案:

答案 0 :(得分:0)

l_bfgs_b算法的收敛相关参数为

  1. factr-默认值为1e7,如果要及早停止拟合,请增加其值。

factor的典型值为:1e12(低精度); 1e7的精度适中; 10.0具有极高的精度。

如果您熟悉optimize.minimize函数,那么documentation中将给出ftolfactr之间的关系。

  

请注意,通过该界面可以使用ftol选项,而   通过该接口提供factr,其中factor是因素   将默认的机器浮点精度乘以得出   ftol:ftol =事实* numpy.finfo(float).eps。

  1. pgtol:浮动,可选
  

当max {| proj g_i | i = 1,...,n} <= pgtol   其中pg_i是投影渐变的第i个分量。

如果要使用l_bfgs_b

进行 optimize.minimize 方法,请尝试this