【问题标题】:Implementing automatic differentiation for 2nd derivative: algorithm for traversing the computational graph?实现二阶导数的自动微分:遍历计算图的算法?
【发布时间】:2010-07-04 00:54:27
【问题描述】:

我正在尝试为 Python 统计包实现automatic differentiation(问题公式类似于优化问题公式)。

计算图是使用运算符重载和工厂函数生成的,用于 sum()、exp() 等操作。我已经使用反向累积实现了梯度的自动微分。但是,我发现实现二阶导数(Hessian)的自动微分要困难得多。我知道如何进行单独的第二部分梯度计算,但是我很难想出一种智能的方法来遍历图形并进行累积。有谁知道为二阶导数或开源库提供自动微分算法的好文章,我可能会尝试从中学习?

【问题讨论】:

  • “离题”我的脚(评论唯一这样投票的 SOer)——这都是关于编程的,“遍历计算图”还能是什么?! (虽然我不明白为什么@John 不能通过两次应用他的一阶导数功能来做二阶导数,那可能是因为我不知道“Hessian”是什么[[除了德国出生的士兵1776 年为英国人而战!-)]])。
  • 要回答您的问题,由于变量之间的相互作用,两次微分并非易事。如果您的函数是标量(具有 n 个输入),则一阶导数是向量长度 n,二阶导数是 n^2 矩阵,三阶导数是 n^3 等。对于一阶导数,您必须向上移动 1每个术语的独立因变量的路径,对于二阶导数,您必须沿着两条不同的路径前进。我/是/有点担心这是题外话,但我不知道这个问题的更好论坛是什么;这绝对不是数学溢出的事情。
  • 自动微分绝对必要吗?每次我考虑它时,我发现手动区分算法更直接,但话又说回来,我的 Hessians 通常非常简单(如对角线,或可通过解析公式计算)。
  • 这不是绝对必要的,但它是一个非常理想的功能。我正在将此功能添加到库中,因此如果用户能够使用需要二阶导数的算法而无需提供手动导数信息,那就太好了。

标签: python math hessian-matrix


【解决方案1】:

首先,您必须决定是否要计算稀疏 Hessian 矩阵或更接近完全密集 Hessian 矩阵的东西。

如果您想要稀疏,目前有两种竞争方式可以做到这一点。只有巧妙地使用计算图,对计算图进行一次反向扫描,您就可以使用 edge_pushing 算法计算 Hessian 矩阵:

http://www.tandfonline.com/doi/full/10.1080/10556788.2011.580098

或者您可以尝试图形着色技术,将您的 Hessian 矩阵压缩为包含较少列的矩阵,然后使用反向累加来计算每一列

http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.66.2603

如果您想要的是密集的 Hessian(在实践中不常见),那么您最好使用反向累积一次计算一列 Hessian(搜索 BRUCE CHRISTIANSON 和反向累积)

【讨论】:

  • 这很有趣。你有第一篇论文的 pdf 版本吗?
【解决方案2】:

在 3 维上近似 Hessian 的常用方法是 BFGS

L-BFGS 方法类似。

Here 您可以找到多种语言(C#、C++、VBA 等)的 L-BFGS(计算 Hessian 作为求解 ODE 的中间结果)的源代码,但 Python 中没有。我觉得翻译起来并不容易。

如果您要翻译另一种语言的算法,请特别注意数值错误并进行敏感性分析(您需要计算 Hessian 矩阵的逆矩阵)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-05
    • 2016-04-16
    • 2012-03-15
    • 1970-01-01
    相关资源
    最近更新 更多