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

2024-06-01 04:11:13 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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


Tags: 方法函数智能工厂运算符数据包automatic公式
2条回答

首先,你必须决定是要计算一个稀疏的黑森函数,还是更接近于完全稠密的黑森函数。在

如果稀疏是你想要的,那么目前有两种有竞争力的方法。只有巧妙地使用计算图,计算图的一次反向扫描,才能使用边推算法计算Hessian矩阵:

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

或者你可以尝试图形着色技术,把你的黑森矩阵压缩成一个列数较少的矩阵,然后用反向累加来计算每一列

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

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

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

L-BFGS方法类似。在

Here,您可以找到在几个语言中(C、C++、VBA等)中的L BFGS(它计算Hessian作为求解ODE的中间结果)的源代码,虽然不在Python中。我认为这不容易翻译。在

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

相关问题 更多 >