【问题标题】:Is back-propagation outdated?反向传播过时了吗?
【发布时间】:2017-02-17 11:41:37
【问题描述】:

在大学的那一天(大约 2011 年、2012 年),我被介绍到反向传播作为训练前馈人工神经网络的最先进技术。

在 Tensorflow 的示例中,我看到了梯度下降的现代自旋(例如 RMSProp、Adam)被用于一次训练所有权重,但没有使用反向传播。

从直观的角度来看,我理解反向传播是一次训练每一层,因此有多个空间可供优化,但每个空间的维度较少(层的每个权重都是一个维度)。相反,没有反向传播是在单个高维空间内进行优化。当然 RMSProp 等可以与反向传播相结合,但我看到的是它还没有完成。

例如https://www.tensorflow.org/get_started/mnist/pros 或https://github.com/aymericdamien/TensorFlow-Examples/blob/master/examples/3_NeuralNetworks/autoencoder.py

反向传播过时了吗?

【问题讨论】:

  • 他们都在使用反向传播。这不是一种学习算法,而是一种计算 Adam 和 co 的梯度的方法。上使用。也许开始阅读this。
  • @sascha:我链接到的当前代码中没有反向传播:1)神经层是明确编程的。唯一可能隐藏的地方是优化——这似乎不太可能,因为它甚至不知道我一开始正在训练一个人工神经网络——但我还是去看了代码,把我带到了 2).. .
  • 2) 在github.com/tensorflow/tensorflow/blob/master/tensorflow/python/… 中没有反向传播,并且梯度是根据github.com/tensorflow/tensorflow/blob/master/tensorflow/python/… 中def gradients 中的总损失(不是层的损失)计算的。因此:不,没有使用反向传播。如果我错过了什么,请直接指出我的显式代码。 (无论如何,感谢您的文章 - 看起来很有趣。)
  • 不。阅读this too。摘录:Because TensorFlow knows the entire graph of your computations, it can automatically use the backpropagation algorithm to efficiently determine how your variables affect the loss you ask it to minimize. + What TensorFlow actually does here, behind the scenes, is to add new operations to your graph which implement backpropagation and gradient descent.
  • @sasche:好吧,当然,这令人印象深刻。感谢您的回答。据我了解,可以在没有反向传播的情况下训练 NN,不是吗? (尽管使用反向传播可能更有效。)

标签: neural-network backpropagation


【解决方案1】:

我相信您指的是TensorFlow Autodiff 和GradientTape。或equivalent in Pytorch。它正在使用reverse mode auto-differentiation。

在此类技术之前,我们需要手动推导雅可比行列以实现自动微分(反向传播)。随着 TensorFlow 2.0 中 autodiff 的引入,我们可以只运行正向路径,而 autodiff 会处理梯度(实际上是在 TF 生成的计算图上应用链式规则)。

我们需要做的就是用 tf.GradientTape() 包围正向路径,并告诉 Tensorflow 要监控哪个变量。例如,y=x*x 的 back-prop 曾经被编码为 dy/dx = 2x,但我们现在不必这样做了。

# From https://www.tensorflow.org/api_docs/python/tf/GradientTape
x = tf.constant(3.0)
with tf.GradientTape() as g:
  g.watch(x)
  y = x * x
dy_dx = g.gradient(y, x)
print(dy_dx)

但是,有一个问题。我们需要注意并了解我们可以为 autodiff 使用什么。例如Gradients do not exist for variables after tf.concat()。浮点大小(TF 的 float32)也会在 auto-diff 过程中导致数值错误,TF 不会捕获并告诉我们这种情况,尽管手动执行也是一样的。

【讨论】:

    猜你喜欢
    • 2020-11-23
    • 2017-01-05
    • 2011-08-25
    • 2021-11-20
    • 2011-01-12
    • 1970-01-01
    • 2018-04-17
    • 1970-01-01
    • 2019-03-18
    相关资源
    最近更新 更多