我正在尝试为Python统计数据包实现automatic differentiation(问题公式类似于优化问题公式)。
计算图是使用运算符重载和工厂函数为sum(),exp()等运算生成的。我已经使用反向累加实现了梯度的自动微分。但是,我发现实现二阶导数(Hessian)的自动微分要困难得多。我知道如何进行单独的第二次部分梯度计算,但是我无法想出一种智能的方法来遍历图形并进行累积。有没有人知道那些为二阶导数或开源库提供自动微分算法的好文章,我可以尝试从中学习它们?
答案 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)