通过这本书,我熟悉以下内容:
对于每个训练实例,反向传播算法首先生成一个 预测(前向传递),测量误差,然后遍历每个 反向层来测量每个层的误差贡献 连接(反向传递),最后稍微调整连接 权重以减少误差。但是我不确定这与 TensorFlow 的反向模式自动差异实现有何不同。
据我所知,反向模式自动微分首先向前遍历图表,然后在第二遍中计算输出相对于输入的所有偏导数。这与传播算法非常相似。
反向传播与反向模式自动微分有何不同?
反向传播和反向模式 AD 之间最重要的区别是反向模式 AD 计算 R^n -> R^m 的向量值函数的向量雅可比积,而反向传播计算标量值的梯度R^n -> R 的函数。因此,反向传播是反向模式 AD 的子集。
当我们训练神经网络时,我们总是有一个标量值损失函数,所以我们总是使用反向传播。由于反向传播是反向模式 AD 的子集,因此我们在训练神经网络时也使用反向模式 AD。反向传播是否采用应用于标量损失函数的反向模式 AD 的更一般定义,或者应用于标量损失函数
用于训练神经网络的反向模式 AD 的更具体定义是一个问题个人品味。这个词在不同的上下文中含义略有不同,但在机器学习社区中最常用来讨论使用标量损失函数计算神经网络参数的梯度。
为了完整性:有时反向模式 AD 可以在一次反向传递中计算完整的雅可比行列式,而不仅仅是矢量雅可比行列式积。此外,向量为向量 [1.0] 的标量函数的向量雅可比积与梯度相同。
反向传播是指使用多个反向传播步骤训练人工神经网络的整个过程,每个反向传播步骤计算梯度并使用它们执行梯度下降步骤。相比之下,反向模式自动比较只是一种用于有效计算梯度的技术,并且它恰好被反向传播所使用。
https://alexey.radul.name/ideas/2013/introduction-to-automatic-differiation/
这是我刚刚找到的另一篇看起来很不错的指南。
https://rufflewind.com/2016-12-30/reverse-mode-automatic-differiation
我相信反向传播可能正式指的是用于计算梯度的手动微积分算法,至少这是它最初的推导方式以及在该主题的课堂上的教学方式。但在实践中,反向传播与上述指南中描述的自动微分方法可以互换使用。因此,将这两个术语分开可能是语言学和数学中一样的努力。我还注意到这篇关于反向传播算法的好文章,以与上述自动微分指南进行比较。
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