反向传播和反向模式 autodiff 有啥区别?

Posted

技术标签:

【中文标题】反向传播和反向模式 autodiff 有啥区别?【英文标题】:What is the difference between backpropagation and reverse-mode autodiff?反向传播和反向模式 autodiff 有什么区别? 【发布时间】:2018-09-30 06:13:07 【问题描述】:

通过这个book,我熟悉了以下内容:

对于每个训练实例,反向传播算法首先生成一个 预测(前向传递),测量误差,然后遍历每个 反向层以测量每个层的误差贡献 连接(反向传递),最后稍微调整连接 权重以减少误差。

但是我不确定这与 TensorFlow 的反向模式 autodiff 实现有何不同。

据我所知,反向模式 autodiff 首先正向遍历图形,然后在第二遍中计算输出相对于输入的所有偏导数。这与传播算法非常相似。

反向传播与反向模式 autodiff 有何不同?

【问题讨论】:

【参考方案1】:

感谢 David Parks 的有效贡献和有用链接的回答,但是我已经找到了本书作者本人对这个问题的回答,这可能会提供更简洁的答案:

反向传播是指使用多个反向传播步骤训练人工神经网络的整个过程,每个反向传播步骤计算梯度并使用它们执行梯度下降步骤。 相比之下,反向模式自动差异只是一种用于有效计算梯度的技术,它恰好被反向传播使用。

【讨论】:

这是一种递归定义:反向传播由多个反向传播步骤组成。我会说这是一个相当糟糕的定义。【参考方案2】:

反向传播和反向模式 AD 之间最重要的区别是,反向模式 AD 从 R^n -> R^m 计算向量值函数的向量-雅可比积,而反向传播从 R^n -> R 计算标量值函数的梯度。因此,反向传播是反向模式 AD 的子集。

当我们训练神经网络时,我们总是有一个标量值损失函数,所以我们总是使用反向传播。由于反向传播是反向模式 AD 的子集,所以我们在训练神经网络时也使用反向模式 AD。

反向传播是否采用更一般的反向模式 AD 定义应用于标量损失函数,或者更具体的反向模式 AD 定义应用于标量损失函数用于训练神经网络 是个人喜好问题。这是一个在不同语境中含义略有不同的词,但在机器学习社区中最常用于谈论使用标量损失函数计算神经网络参数的梯度。

为了完整性:有时反向模式 AD 可以在一次反向传递中计算完整的雅可比,而不仅仅是向量雅可比积。此外,向量为向量 [1.0] 的标量函数的向量雅可比积与梯度相同。

【讨论】:

聚会有点晚了,但这是一个很好的解释!【参考方案3】:

自动微分不同于标准微积分课程中教授的关于如何计算梯度的方法,并且在某些特性上有所不同,例如它采用数据结构的梯度的本机能力,而不仅仅是一个定义明确的数学函数。我不够专业,无法进一步详细说明,但这是一个很好的参考资料,可以更深入地解释它:

https://alexey.radul.name/ideas/2013/introduction-to-automatic-differentiation/

这是我刚刚找到的另一个看起来很不错的指南。

https://rufflewind.com/2016-12-30/reverse-mode-automatic-differentiation

我相信反向传播可能正式指的是用于计算梯度的手动微积分算法,至少它最初是这样派生的,并且是在该主题的课堂上教授的方式。但在实践中,反向传播与上述指南中描述的自动微分方法可以互换使用。因此,将这两个术语分开在语言学中可能与数学一样多。

我还注意到这篇关于反向传播算法的好文章,以便与上述关于自动微分的指南进行比较。

https://brilliant.org/wiki/backpropagation/

【讨论】:

以上是关于反向传播和反向模式 autodiff 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

SGD 和反向传播有啥区别?

反向传播算法和生成对抗网络的区别

反向传播梯度求解推导

Torch反向传播时出错或者梯度为NaN的问题排查

反向代理和网关有啥区别? [复制]

反向传播