【问题标题】:fmin_bfgs does not completefmin_bfgs 未完成
【发布时间】:2012-12-06 10:01:26
【问题描述】:

我正在尝试使用 fmin_bfgs() 或 fmin_l_bfgs_b() 最小化具有大量参数(略超过 7000)的函数。当我输入命令时

 opt_pars = fmin_l_bfgs_b(obj_f, pars, approx_grad=1)

(其中 obj_f 是我要最小化的函数,而 pars 是初始参数的向量)该函数永远运行,直到 python 告诉我它必须终止程序。从来没有任何输出。我尝试添加参数 maxfunc = 2 以查看它是否到达任何地方并且发生​​了同样的事情(永远运行然后python终止了程序)。

我只是想弄清楚该函数可能出了什么问题。似乎它可能陷入了一个while循环或其他东西。有没有人遇到过这个问题?如果没有,我还可以在此处使用一些一般调试帮助(因为我对 Python 比较陌生)来了解如何监视函数正在执行的操作。

最后,也许有人可以为我正在尝试的任务推荐不同的功能或包。我正在尝试将套索正则化泊松回归拟合到稀疏数据,其中包含对 7000 个变量的大约 1200 万个观测值。

PS 很抱歉没有包括我试图最小化的 -log 似然函数,但这将是完全无法解释的。

非常感谢您的帮助!

扎克

【问题讨论】:

  • 7000个参数太多了! fmin 正在尝试评估您的函数以了解所有这些变化,这可能就是它需要这么长时间的原因。当然,对于 7000 个变量,可能会有很多局部最小值。我的建议是尝试一些 PCA 来减少问题的维度。
  • 很多!但它完全是凸的,所以没有局部最小值......

标签: python debugging optimization scipy regression


【解决方案1】:

由于您没有为fmin_bfgsfmin_l_bfgs_b 提供渐变,因此每次需要渐变时都会评估您的目标函数len(x) > 7000 次。如果目标函数的评估速度很慢,那将会累加。

maxfun 选项显然没有计算梯度估计,所以它实际上可能不是一个无限循环,只是它需要很长时间。

“python 告诉我它必须终止程序”是什么意思?

无论如何,请尝试在此处提供可重现的测试用例。目标函数是否难以理解并不重要 --- 重要的是感兴趣的人可以重现您遇到的情况。

即使对于 7000 个参数,我也没有在我的系统上看到无限循环问题。但是,对于l_bfgs_b 且未提供梯度的简单 7000 参数问题,函数评估计数约为200000。分析您的代码以查看此类评估计数对您意味着什么。提供梯度后,它是 35(+ 35 倍梯度)。提供渐变可能会有所帮助。 (如果函数很复杂,自动微分可能仍然有效——Python中有相应的库。)

其他适用于 Python 的优化库,请参阅:http://scipy.org/Topical_Software(虽然不能说哪个是最好的 --- ipopt 或 coin-or 值得一试)

供参考:Scipy 中的 L-BFGS-B 实现是这个(由应该知道自己在做什么的人编写): http://users.eecs.northwestern.edu/~nocedal/lbfgsb.html

***

您可以调试正在发生的事情,例如通过使用 Python 调试器 pdbpython -m pdb your_script.py。或者只是在其中插入打印语句。

也尝试谷歌“调试python”和“profile python”;)

【讨论】:

  • 谢谢,我没有意识到 maxfunc 不计算梯度估计。我有一个可以提供的渐变功能。它本身很慢,但必须比近似值快!
猜你喜欢
  • 2012-02-03
  • 1970-01-01
  • 1970-01-01
  • 2017-10-19
  • 2013-08-16
  • 2017-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多