scipy.optimize.fmin_l_bfgs_b returns 'ABNORMAL_TERMINATION_IN_LNSRCH'
scipy.optimize.fmin_l_bfgs_b returns '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-07
information 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 bounds
At iterate 0 f= 1.14462D-07 |proj g|= 3.51719D-05
* * *
Tit = total number of iterations
Tnf = total number of function evaluations
Tnint = total number of segments explored during Cauchy searches
Skip = number of BFGS updates skipped
Nact = number of active bounds at final generalized Cauchy point
Projg = norm of the final projected gradient
F = 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-007
ABNORMAL_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')。
我知道这意味着在这个迭代中可以达到最小值。我用谷歌搜索了这个问题。有人说经常出现是因为objective和梯度函数不匹配。但是这里我没有提供渐变功能,因为我用的是'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行开始(link到最下面的代码)
gd = ddot(n,g,1,d,1)
if (ifun .eq. 0) then
gdold=gd
if (gd .ge. zero) then
c 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,因为这已经足够了。机器epsilon是10E-16,我觉得20其实有点多了。所以,对于大多数遇到这个问题的人来说,我的钱是你的渐变与你的函数不匹配。
现在,也可能是“2.舍入误差主导计算”。通过这个,他的意思是你的函数是一个非常平坦的表面,其中增加的数量级为机器 epsilon(在这种情况下你可能会重新缩放函数),
现在,我在想当你的功能太奇怪时,也许应该有第三种选择。振荡?我可以看到类似 $\sin({\frac{1}{x}})$ 的东西导致了这种问题。不过我不是什么聪明人,所以不要以为还有第三种情况。
所以我觉得OP的解决方法应该是你的函数太扁平了。或查看 fortran 代码。
https://github.com/scipy/scipy/blob/master/scipy/optimize/lbfgsb/lbfgsb.f
想看的小伙伴在线搜索。 https://en.wikipedia.org/wiki/Line_search
注意。这已经晚了 7 个月。我把它放在这里是为了将来。
正如 Wilmer E. Henao 在回答中指出的那样,问题可能出在梯度上。由于您使用的是 approx_grad=True
,梯度是用数值计算的。在这种情况下,减小 epsilon
的值(用于数值计算梯度的步长)会有所帮助。
我在使用 L-BFGS-B 优化器时也遇到了错误 "ABNORMAL_TERMINATION_IN_LNSRCH"。
虽然我的梯度函数指向正确的方向,但我通过其 L2 范数重新调整了函数的 实际 梯度。删除它或添加另一种适当类型的重新缩放有效。之前估计是梯度太大,立马出界
如果我没看错的话,OP的问题是无界的,所以这对这个问题的设置肯定没有帮助。但是,谷歌搜索错误 "ABNORMAL_TERMINATION_IN_LNSRCH" 会将此页面作为第一个结果之一,因此它可能会帮助其他人...
我最近遇到了类似的问题。我有时会在使用 scipy 的 fmin_l_bfgs_b
功能后遇到 ABNORMAL_TERMINATION_IN_LNSRCH 消息。我试着对我得到这个的原因给出额外的解释。如果我错了,我正在寻找补充细节或更正。
在我的例子中,我提供了渐变功能,所以approx_grad=False
。 我的代价函数和梯度是一致的。我 double-checked 它和优化实际上大部分时间都有效。 当我得到ABNORMAL_TERMINATION_IN_LNSRCH时,解决方案不是最优的,甚至不接近(即使这是一个主观的观点)。我可以通过修改 maxls
参数来解决这个问题。 增加maxls
有助于解决这个问题,最终得到最优解。 但是,我注意到有时 maxls
比生成 ABNORMAL_TERMINATION_IN_LNSRCH 的小 maxls
会导致收敛解 。 A dataframe summarizes the results。我很惊讶地观察到这一点。我预计减少 maxls
不会改善结果。为此,我试图阅读描述线搜索算法的论文,但我很难理解它。
行“search algorithm生成了一个序列
嵌套区间 {Ik} 和迭代序列 αk ∈ Ik ∩ [α分钟; αmax] 根据 [...] 过程”。如果我理解得很好,我会说 maxls
参数指定了这个序列的长度。最后maxls
次迭代(如果算法在较少的迭代中终止,则更少),线搜索停止。在最终间隔 Imaxls 内生成最终试验点。我会说公式不能保证得到一个 αmaxls 尊重两个更新条件,最小减少和曲率,特别是当间隔仍然很宽时。我的猜测是在我的在这种情况下,经过 11 次迭代后,生成的区间 I11 使得试验点 α11 满足这两个条件。但是,即使 I12较小,仍然包含可接受的点,α12则不是。最后经过24次迭代,区间很小,生成的α k 遵守更新条件。
我的理解/解释准确吗?
如果是这样,那么我会很惊讶,当maxls=12
时,由于生成的α11是可以接受的,而α12是可以接受的,为什么α 11 在这种情况下没有选择,而不是 α12?
从实用的角度来说,我建议在获得 ABNORMAL_TERMINATION_IN_LNSRCH 时尝试更高的 maxls
。
我正在使用 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-07
information 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 bounds
At iterate 0 f= 1.14462D-07 |proj g|= 3.51719D-05
* * *
Tit = total number of iterations
Tnf = total number of function evaluations
Tnint = total number of segments explored during Cauchy searches
Skip = number of BFGS updates skipped
Nact = number of active bounds at final generalized Cauchy point
Projg = norm of the final projected gradient
F = 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-007
ABNORMAL_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')。
我知道这意味着在这个迭代中可以达到最小值。我用谷歌搜索了这个问题。有人说经常出现是因为objective和梯度函数不匹配。但是这里我没有提供渐变功能,因为我用的是'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行开始(link到最下面的代码)
gd = ddot(n,g,1,d,1)
if (ifun .eq. 0) then
gdold=gd
if (gd .ge. zero) then
c 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,因为这已经足够了。机器epsilon是10E-16,我觉得20其实有点多了。所以,对于大多数遇到这个问题的人来说,我的钱是你的渐变与你的函数不匹配。
现在,也可能是“2.舍入误差主导计算”。通过这个,他的意思是你的函数是一个非常平坦的表面,其中增加的数量级为机器 epsilon(在这种情况下你可能会重新缩放函数), 现在,我在想当你的功能太奇怪时,也许应该有第三种选择。振荡?我可以看到类似 $\sin({\frac{1}{x}})$ 的东西导致了这种问题。不过我不是什么聪明人,所以不要以为还有第三种情况。
所以我觉得OP的解决方法应该是你的函数太扁平了。或查看 fortran 代码。
https://github.com/scipy/scipy/blob/master/scipy/optimize/lbfgsb/lbfgsb.f
想看的小伙伴在线搜索。 https://en.wikipedia.org/wiki/Line_search
注意。这已经晚了 7 个月。我把它放在这里是为了将来。
正如 Wilmer E. Henao 在回答中指出的那样,问题可能出在梯度上。由于您使用的是 approx_grad=True
,梯度是用数值计算的。在这种情况下,减小 epsilon
的值(用于数值计算梯度的步长)会有所帮助。
我在使用 L-BFGS-B 优化器时也遇到了错误 "ABNORMAL_TERMINATION_IN_LNSRCH"。
虽然我的梯度函数指向正确的方向,但我通过其 L2 范数重新调整了函数的 实际 梯度。删除它或添加另一种适当类型的重新缩放有效。之前估计是梯度太大,立马出界
如果我没看错的话,OP的问题是无界的,所以这对这个问题的设置肯定没有帮助。但是,谷歌搜索错误 "ABNORMAL_TERMINATION_IN_LNSRCH" 会将此页面作为第一个结果之一,因此它可能会帮助其他人...
我最近遇到了类似的问题。我有时会在使用 scipy 的 fmin_l_bfgs_b
功能后遇到 ABNORMAL_TERMINATION_IN_LNSRCH 消息。我试着对我得到这个的原因给出额外的解释。如果我错了,我正在寻找补充细节或更正。
在我的例子中,我提供了渐变功能,所以approx_grad=False
。 我的代价函数和梯度是一致的。我 double-checked 它和优化实际上大部分时间都有效。 当我得到ABNORMAL_TERMINATION_IN_LNSRCH时,解决方案不是最优的,甚至不接近(即使这是一个主观的观点)。我可以通过修改 maxls
参数来解决这个问题。 增加maxls
有助于解决这个问题,最终得到最优解。 但是,我注意到有时 maxls
比生成 ABNORMAL_TERMINATION_IN_LNSRCH 的小 maxls
会导致收敛解 。 A dataframe summarizes the results。我很惊讶地观察到这一点。我预计减少 maxls
不会改善结果。为此,我试图阅读描述线搜索算法的论文,但我很难理解它。
行“search algorithm生成了一个序列
嵌套区间 {Ik} 和迭代序列 αk ∈ Ik ∩ [α分钟; αmax] 根据 [...] 过程”。如果我理解得很好,我会说 maxls
参数指定了这个序列的长度。最后maxls
次迭代(如果算法在较少的迭代中终止,则更少),线搜索停止。在最终间隔 Imaxls 内生成最终试验点。我会说公式不能保证得到一个 αmaxls 尊重两个更新条件,最小减少和曲率,特别是当间隔仍然很宽时。我的猜测是在我的在这种情况下,经过 11 次迭代后,生成的区间 I11 使得试验点 α11 满足这两个条件。但是,即使 I12较小,仍然包含可接受的点,α12则不是。最后经过24次迭代,区间很小,生成的α k 遵守更新条件。
我的理解/解释准确吗?
如果是这样,那么我会很惊讶,当maxls=12
时,由于生成的α11是可以接受的,而α12是可以接受的,为什么α 11 在这种情况下没有选择,而不是 α12?
从实用的角度来说,我建议在获得 ABNORMAL_TERMINATION_IN_LNSRCH 时尝试更高的 maxls
。