我正在尝试为Python统计信息包实现automatic differentiation(问题的提法类似于优化问题的提法)。
该计算图是使用运算符重载和工厂函数生成的,用于诸如sum(),exp()等操作。我已经使用反向累加实现了梯度的自动微分。但是,我发现对二阶导数(Hessian)实现自动微分要困难得多。我知道如何进行单独的第二部分梯度计算,但是我很难找到一种智能的方法来遍历图形并进行累加。有谁知道优秀的文章为二阶导数或开源库提供自动区分算法,这些算法实现了我可以尝试学习的算法?
最佳答案
首先,您必须确定是否要计算稀疏的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(在实践中不常见),那么使用反向累积(搜索BRUCE CHRISTIANSON和反向累积)一次计算Hessian的一列可能会更好
关于python - 对二阶导数: algorithm for traversing the computational graph?实现自动区分,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3173359/