scipy.optimize.fmin_l_bfgs_b 返回 ‘ABNORMAL_TERMINATION_IN_LNSRCH’

我在使用 scipy.optimize.fmin_l_bfgs_b 来解决高斯混合问题。混合分布的均值通过回归建模,其权重需要使用 EM 算法进行优化。

sigma_sp_new, func_val, info_dict = fmin_l_bfgs_b(func_to_minimize, self.sigma_vector[si][pj],                        args=(self.w_vectors[si][pj], Y, X, E_step_results[si][pj]),                       approx_grad=True, bounds=[(1e-8, 0.5)], factr=1e02, pgtol=1e-05, epsilon=1e-08)

但有时我在信息字典中收到警告 ‘ABNORMAL_TERMINATION_IN_LNSRCH’:

func_to_minimize value = 1.14462324063e-07information dictionary: {'task': b'ABNORMAL_TERMINATION_IN_LNSRCH', 'funcalls': 147, 'grad': array([  1.77635684e-05,   2.87769808e-05,   3.51718654e-05,         6.75015599e-06,  -4.97379915e-06,  -1.06581410e-06]), 'nit': 0, 'warnflag': 2}RUNNING THE L-BFGS-B CODE           * * *Machine precision = 2.220D-16 N =            6     M =           10 This problem is unconstrained.At X0         0 variables are exactly at the boundsAt iterate    0    f=  1.14462D-07    |proj g|=  3.51719D-05           * * *Tit   = total number of iterationsTnf   = total number of function evaluationsTnint = total number of segments explored during Cauchy searchesSkip  = number of BFGS updates skippedNact  = number of active bounds at final generalized Cauchy pointProjg = norm of the final projected gradientF     = final function value           * * *   N    Tit     Tnf  Tnint  Skip  Nact     Projg        F    6      1     21      1     0     0   3.517D-05   1.145D-07  F =  1.144619474757747E-007ABNORMAL_TERMINATION_IN_LNSRCH                               Line search cannot locate an adequate point after 20 function  and gradient evaluations.  Previous x, f and g restored. Possible causes: 1 error in function or gradient evaluation;                  2 rounding error dominate computation. Cauchy                time 0.000E+00 seconds. Subspace minimization time 0.000E+00 seconds. Line search           time 0.000E+00 seconds. Total User time 0.000E+00 seconds.

我并不是每次都会收到这个警告,但有时会收到。(大多数情况下会得到 ‘CONVERGENCE: NORM_OF_PROJECTED_GRADIENT_<=_PGTOL’ 或 ‘CONVERGENCE: REL_REDUCTION_OF_F_<=_FACTR*EPSMCH’)。

我知道这意味着在本次迭代中无法达到最小值。我在谷歌上搜索了这个问题。有人说这通常是因为目标函数和梯度函数不匹配。但在这里我没有提供梯度函数,因为我使用了 ‘approx_grad’。

我应该调查的可能原因是什么?“rounding error dominate computation”是什么意思?

======

我还发现对数似然度没有单调增加:

########## Convergence !!! ##########log_likelihood_history: [-28659.725891322563, 220.49993177669558, 291.3513633060345, 267.47745327823907, 265.31567762171181, 265.07311121000367, 265.04217683341682]

它通常在第二次或第三次迭代时开始下降,即使 ‘ABNORMAL_TERMINATION_IN_LNSRCH’ 没有发生。我不知道这个问题是否与前一个问题有关。


回答:

Scipy 调用了原始的 L-BFGS-B 实现。这是一些 Fortran77 代码(古老但美丽且超级快),我们的问题是下降方向实际上是在上升。问题从第 2533 行开始(代码链接在底部)

gd = ddot(n,g,1,d,1)  if (ifun .eq. 0) then     gdold=gd     if (gd .ge. zero) thenc                               the directional derivative >=0.c                               Line search is impossible.        if (iprint .ge. 0) then            write(0,*)' ascent direction in projection gd = ', gd        endif        info = -4        return     endif  endif

换句话说,你告诉它通过上山来下山。代码尝试在你提供的下降方向上进行线搜索,总共尝试了 20 次,并意识到你不是在告诉它下山,而是在上山。所有 20 次都是如此。

编写这个代码的人(Jorge Nocedal,他顺便说一句是个非常聪明的人)设置了 20 次,因为这基本上已经足够了。机器精度是 10E-16,我认为 20 次实际上有点多。所以,我认为大多数人遇到这个问题的原因是你的梯度与你的函数不匹配

现在,也可能是“2. 舍入误差主导计算”。他的意思是你的函数是一个非常平坦的表面,其增加量在机器精度的数量级上(在这种情况下,你可以考虑重新缩放函数),现在,我在想也许应该有一个第三种情况,当你的函数太奇怪时。振荡?我可以看到像 $\sin({\frac{1}{x}})$ 这样的东西会引起这种问题。但我不是一个聪明的人,所以不要假设有第三种情况。

所以我认为原帖者的解决方案应该是你的函数太平坦了。或者查看 Fortran 代码。

https://github.com/scipy/scipy/blob/master/scipy/optimize/lbfgsb/lbfgsb.f

这里是线搜索,供那些想看的人参考。 https://en.wikipedia.org/wiki/Line_search

注意。这已经晚了7个月。我把它放在这里是为了未来的参考。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注