反向传播和反向模式自动微分有什么区别?

问题描述 投票:0回答:4

通过这本书,我熟悉以下内容:

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

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

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

反向传播与反向模式自动微分有何不同?

tensorflow machine-learning deep-learning backpropagation
4个回答
10
投票

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

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

反向传播是否采用应用于标量损失函数的反向模式 AD 的更一般定义,或者应用于标量损失函数

用于训练神经网络的反向模式 AD 的更具体定义是一个问题个人品味。这个词在不同的上下文中含义略有不同,但在机器学习社区中最常用来讨论使用标量损失函数计算神经网络参数的梯度。

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


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

反向传播是指使用多个反向传播步骤训练人工神经网络的整个过程,每个反向传播步骤计算梯度并使用它们执行梯度下降步骤。

相比之下,反向模式自动比较只是一种用于有效计算梯度的技术,并且它恰好被反向传播所使用。


4
投票
自动微分与标准微积分课程中关于如何计算梯度的方法不同,并且在某些功能上有所不同,例如它获取数据结构梯度的本机能力,而不仅仅是定义明确的数学函数。我不够专业,无法详细介绍,但这是一个很好的参考,可以更深入地解释它:

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

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

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

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

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

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


0
投票
据我所知,反向模式自动比较会在表达式树的一次传递中计算所有偏导数。以下是演示这一点的 Python 代码:

class Expression: def __add__(exp1, exp2): return Plus(exp1,exp2) def __mul__(exp1, exp2): return Multiply(exp1, exp2) class Variable(Expression): def __init__(self,value): self.value = value self.partial = 0 def evaluate(self): return self.value def derive(self,seed): self.partial += seed class Plus(Expression): def __init__(self,exp1,exp2): self.a = exp1 self.b = exp2 def evaluate(self): return self.a.evaluate() + self.b.evaluate() def derive(self,seed): self.a.derive(seed) self.b.derive(seed) class Multiply(Expression): def __init__(self,exp1,exp2): self.a = exp1 self.b = exp2 def evaluate(self): return self.a.evaluate() * self.b.evaluate() def derive(self,seed): self.a.derive(seed * self.b.evaluate()) self.b.derive(seed * self.a.evaluate()) # Example: derivatives of z(x,y) at (x, y) = (2, 3) x = Variable(2) y = Variable(3) z = x * (x + y) + y * y z.derive(1) print(x.partial) # dz/dx Output: 7 print(y.partial) # dz/dy Output: 8
    
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.