【问题标题】:How does l_bfgs optimization method approximate the gradientl_bfgs优化方法如何逼近梯度
【发布时间】:2014-02-01 03:43:02
【问题描述】:

我在可用作黑盒的二维函数上使用 scipy 的 fmin_l_bfgs_b 优化方法。梯度不能直接评估,所以我要求方法通过设置approx_grad = True来近似梯度。

我想知道近似梯度是如何计算的。我的猜测是,在每个点,对于每个维度,梯度都是通过前向差来近似的。因此对于 N 维中的每个点,进行 N 次评估以获得偏导数。它是否正确?

【问题讨论】:

    标签: python numpy scipy mathematical-optimization


    【解决方案1】:

    Jacobian 逼近是使用 scipy.optimize.approx_fprime 函数完成的,docs

            f(xk[i] + epsilon[i]) - f(xk[i])
    f'[i] = ---------------------------------
                       epsilon[i]
    

    其中 epsilon 是 fmin_l_bfgs_b 的参数

    epsilon : 浮动

    approx_grad 为 True 时使用的步长,用于数值计算梯度

    【讨论】:

    • 感谢您的链接。看来我的猜测是正确的。在每个点进行 N 次函数评估以获得梯度,其中 N 是维数(向量 x 的大小)
    【解决方案2】:

    我不知道 scipy 是怎么做到的。一种流行的方法是按如下方式计算它们:

    (f(x+e)-f(x-e)/(2*e) (显然这里不支持 LaTex)

    这可以让您精确到二次项(只需计算每个项的泰勒展开并减去它们)

    【讨论】:

      猜你喜欢
      • 2023-03-29
      • 2017-04-09
      • 2015-04-17
      • 1970-01-01
      • 2019-06-19
      • 1970-01-01
      • 1970-01-01
      • 2018-08-18
      • 1970-01-01
      相关资源
      最近更新 更多