【发布时间】: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