最近刚刚完成了用于机器学习的基本反向模式AD,我发现自己想了解该领域,但我用更高阶的方法遇到了困难。
基本的反向广告非常简单易懂,但更先进的材料既过于抽象,又过于技术化,我在互联网上找不到任何好的解释(事实上,我花了很长时间才意识到基本的反向AD甚至存在。)
基本上,我理解如何在微积分的上下文中获取二阶导数,但我不理解如何转换反向AD图来获得二阶导数。
在像edge_pushing这样的算法中,这些虚线连接意味着什么?
我研究了DiffSharp库,注意到它使用了类似于正向对反向微分的方法来计算Hessian。通过调试器运行,我真的看到它在一次运行中混合了正向和反向步骤。该机制背后的原则是什么?
DiffSharp使用雅可比矢量乘积来计算每个变量的Hessian,这是一个R^m->R^n映射。这怎么可能从原始图表中得到呢?反向AD是一个R->R^n映射,额外的维度从哪里来?
最后,嵌套AD是如何工作的?
我写了关于edge_pushing的论文。首先从梯度的计算图开始。这里我所说的梯度是指反梯度法的计算图。edge_pushing算法简单地将反向梯度算法应用于这个梯度图,这将给你一个Hessian。这里的问题是它以一种聪明的方式做到了这一点。特别地,虚线边是人工添加的边,表示两个节点之间的非线性交互(两个节点都是图中更上层的非线性函数的输入)。非线性虚线边缘使计算梯度图上的反向梯度的主要成本发生在哪里,以及如何最好地累积总导数变得容易。这有帮助吗?
我为AD写了一个教程,简要介绍了如何在接近结尾的地方进行正向和反向操作。我还在GPU上写了一个完整的基本AD库,可以在同一个网站上找到链接。
仍然不确定边缘推送,但我认为这对神经网络来说并不重要。