实现二阶导数的自动微分:遍历计算图的算法?

时间:2010-07-04 00:54:28

标签: python math hessian-matrix

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

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

2 个答案:

答案 0 :(得分: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和反向积累)

答案 1 :(得分:-1)

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

L-BFGS方法类似。

Here你可以找到L-BFGS的源代码(它以几种语言(C#,C ++,VBA等)计算Hessian作为解决ODE的中间结果),尽管不是在python中。我认为翻译并不容易。

如果您要将alg翻译成另一种语言,请特别注意数值误差并进行灵敏度分析(您需要计算Hessian矩阵的逆矩阵)