【问题标题】:Checkgradient without solving optimization problem in MATLABCheckgradient没有解决MATLAB中的优化问题
【发布时间】:2021-09-09 18:11:29
【问题描述】:

我有一个比较复杂的函数,我计算了这个函数的雅可比的解析形式。但是,有时,我会搞砸这个雅可比行列式。

当使用here 所述的一些优化技术时,MATLAB 有一种很好的方法来检查雅可比行列式的准确性。

但问题在于,看起来 MATLAB 解决了优化问题,然后返回雅可比行列式是否正确。这非常耗时,尤其是考虑到我的一些优化问题需要数小时甚至数天的时间来计算。

Python 在 scipy 中具有与 here 描述的有点相似的功能,它只是将分析梯度与一些用户提供的输入的梯度的有限差分近似值进行比较。

我可以做些什么来检查 MATLAB 中雅可比行列式的准确性,而不必解决整个优化问题?

【问题讨论】:

    标签: python matlab scipy mathematical-optimization


    【解决方案1】:

    您是否考虑过使用复杂步长微分来检查您的梯度?见this description

    【讨论】:

    • 这非常有用。我会试一试
    • 也许您可能想考虑使用符号代数包来检查您的分析雅可比行列式。
    【解决方案2】:

    我用于这类事情的一个费力但有用的方法是检查所谓导数的(数值)积分是否是函数在端点处的差。我发现这比比较 (f(x+h)-f(x))/h 和 f'(x) 之类的分数更方便,因为选择 h 很困难,因此一方面 h 不是那么小该分数不受舍入误差的支配,另一方面 h 足够小,以至于该分数应接近 f'(x)

    在单个变量的函数 F 的情况下,假设您有代码 f 来评估 F 和 fd 说来评估 F'。那么测试就是,对于不同的区间[a,b]来看差异,微积分基本定理说应该是0,

    Integral{ 0<=x<=b | fd(x)} - (f(b)-f(a))
    

    用数值计算积分。间隔不需要很小。 当然,部分误差是由于积分的数值近似中的误差。出于这个原因,我倾向于使用,例如,订购 40 Gauss Legendre 积分器。

    对于多个变量的函数,您可以一次测试一个变量。对于多个功能,可以一次测试一个。

    我发现这些测试当然不是详尽无遗的,它们很容易显示计算导数时出现的各种错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-04
      相关资源
      最近更新 更多