了解高阶自动微分

Understanding higher order automatic differentiation

最近刚刚完成我自己的机器学习基础 reverse mode AD,我发现自己想了解这个领域,但我在高阶方法方面遇到了困难。

基本的反向广告非常简单易懂,但是更高级的material太抽象,太技术化,我在网上找不到很好的解释(事实上,我花了很多时间才意识到甚至存在基本的反向 AD。)

基本上,我了解如何在微积分的背景下进行二阶导数,但我不了解如何转换反向 AD 图以获得二阶导数。

在像 edge_pushing 这样的算法中,那些虚线连接是什么意思?

我研究了 DiffSharp 库,发现它使用正向反向微分之类的东西来计算 Hessian。 运行,通过调试器,我确实看到它确实在单个 运行 中混合了正向和反向步骤。该机制背后的原则是什么?

DiffSharp 使用 jacobian-vector 乘积为每个变量计算 Hessian,这是一个 R^m -> R^n 映射。怎么可能从原始图中得到它? Reverse AD是一个R -> R^n的映射,额外的维度从哪里来?

最后,嵌套广告是如何工作的?

我为 AD 写了一个教程,在结尾处简要说明了如何进行正向和反向操作 here。我还在 GPU 上为基本 AD 编写了一个完整的库,可以在同一站点找到链接。

仍然不确定 edge_pushing,但我认为无论如何这对神经网络来说并不重要。

我在 edge_pushing 上写了论文。首先你从梯度的计算图开始。而我这里所说的梯度是指反向梯度法的计算图。 edge_pushing 算法然后简单地将反向梯度算法应用于此梯度图,这将为您提供 Hessian。这里的问题是它以一种智能的方式做到了这一点。特别是,虚线边是人为添加的边,表示两个节点之间的非线性交互(两个节点都是图中更上方的非线性函数的输入)。非线性虚线边缘可以很容易地看到在梯度图上计算这个反向梯度的主要成本发生在哪里,以及如何最好地累积总导数。有帮助吗?