在优化函数-R 中定义梯度函数参数

机器算法验证 r 优化
2022-04-12 06:32:33

我想使用 optim 函数根据一些参数找到函数的最小值。

我想知道; 为目标函数定义梯度函数,只是加速优化?

或者定义它会带来更好的结果。例如,在某些情况下,优化算法会产生不可靠的最佳点。定义梯度函数是否可以解决此类结果?

我会很高兴得到任何帮助。非常感谢。

1个回答

在 R 中,使用的默认方法optim是 Nelder-Mead,它不使用梯度进行优化。因此,它非常缓慢。?optim声明这种方法很可靠……但我会说这是虚假广告;对于简单的问题,它通常可以返回次优解决方案而没有警告。

由于此方法不使用梯度,因此使用默认设置 Nelder-Mead 提供梯度函数实际上根本不会改变过程。

另一方面,如果您使用准牛顿方法(BFGS 或 L-BFGS-B)或共轭梯度,这些方法确实需要在优化期间评估梯度。如果梯度函数中没有提供这些,则以数值方式估计它们,即

f(x)f(x+h)f(xh)2h

对于一些小h.

如果您正在评估的函数的评估成本相对较低,或者参数的数量不是太多,这通常可以很好地使用,您可以节省写出完整梯度的时间。

另一方面,对于具有大量参数的许多问题,以数值方式计算梯度的全向量可能会非常缓慢。记住,如果你有k参数,以上计算需要计算k次。此外,对于大二阶导数的问题,这种数值近似可能不稳定,因此提供一个分析评估导数的函数可能会稳定算法。但通常,计算单个梯度的速度是为梯度提供解析函数的动机。