2

我有一个优化问题,涉及最小化我知道梯度的函数,但目标函数在任何点的实际值都是未知的。

我想使用 BFGS 优化函数,但我发现的所有 BFGS 实现似乎都需要了解目标的值,尤其是在行搜索步骤中。我查看了 BFGS 的 python (scipy) 和 C++ 实现。

显然我可以使用梯度下降,但我不想在这里重新发明轮子。

有任何想法吗?

更多细节:我想最小化h。但我没有得到h。我得到的是h = f(g),以及g(x)的明确公式。f基本上以一种不太难计算但不可能积分的复杂几何方式来转换g的梯度。因此,计算h(x)的梯度非常简单,但很难获得h(x)的明确值。

4

4 回答 4

3

我相信您已将问题简化为寻找根源的问题。您可以使用scipy 中的根查找器之一,然后您只需检查该点是最小值、最大值还是拐点。

于 2013-02-01T16:51:04.973 回答
2

在这种情况下,请尝试将 h(x) 最小化为 2 次方。这是因为您实际上是在搜索 h(x) 接近于零的点。您可以通过平方和运行参数搜索来凸化它。

编辑:对不起,我的意思是 h(x) 是渐变..

于 2013-02-01T04:22:38.030 回答
1

在花了一些时间思考这个问题之后,我认为答案是只采用像 BFGS 这样的准牛顿方法。函数值进入 BFGS 计算的唯一地方是线搜索部分,即第一个 Wolfe 条件。

我认为解决方案是使用不检查第一个 Wolfe 条件(Armijo 规则)的线搜索方法。

我在 python 和 C++ 中为 BFGS 实现了它:https ://gist.github.com/rmcgibbo/4735287 。尽管如此,我认为你可以通过为 BFGS 例程提供一个始终递减的函数来获得相同的结果(例如,它包含一个跟踪它被调用的次数的计数器,并且总是返回一个比它小的数字你最后一次调用它)。减少量必须足够大,以便您始终通过 Armijo 规则 ( http://en.wikipedia.org/wiki/Wolfe_conditions )。

于 2013-02-08T00:06:26.473 回答
0

也许谈论一个更简单的例子会有所帮助。取一些标量 y=f(x)。y 的梯度是 df/dx 。如果你知道无处不在的导数,你可以很容易地(!!)通过解析或数值积分来确定 f(x) 的值,但具有无法确定的全局常数。旧的“积分(f(x)dx)= F(x)+ C”技巧。因此,除非您至少可以在某一点上锚定您的h功能,否则您无法解决问题。您可以追踪最小值的位置,x例如h(x)min),但不是h(x)

于 2013-02-01T12:48:54.227 回答