通过ResNet跳过连接进行梯度反向传播


22

我很好奇如何使用ResNet模块/跳过连接通过神经网络向后传播梯度。我已经看到了关于ResNet的几个问题(例如,具有跳过层连接的神经网络),但是这个问题专门询问了训练过程中梯度的反向传播。

基本架构在这里:

在此处输入图片说明

我读了这篇论文《残差网络的图像识别研究》,在第2部分中,他们讨论了ResNet的目标之一是如何为梯度提供更短/更清晰的路径,使其反向传播至基础层。

谁能解释梯度如何流过这种类型的网络?我不太了解加法运算以及加法后缺少参数化图层如何实现更好的梯度传播。它是否与流经加法运算符时渐变不发生变化以及是否以无乘法方式重新分布有关?

此外,我可以理解,如果梯度不需要流过权重层,那么如何减轻消失的梯度问题,但是如果没有梯度流经权重,那么在向后传递之后如何更新它们?


只是一个愚蠢的问题,为什么我们将x作为跳过连接传递,而不计算inverse(F(x))以获得x到底是不是因为计算复杂?
Yash Kumar Atri

我不明白你的意思the gradient doesn't need to flow through the weight layers,你能解释一下吗?
阿努

Answers:


13

加法将梯度平均发送回两个输入。您可以通过在tensorflow中运行以下命令来说服自己:

import tensorflow as tf

graph = tf.Graph()
with graph.as_default():
    x1_tf = tf.Variable(1.5, name='x1')
    x2_tf = tf.Variable(3.5, name='x2')
    out_tf = x1_tf + x2_tf

    grads_tf = tf.gradients(ys=[out_tf], xs=[x1_tf, x2_tf])
    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())
        fd = {
            out_tf: 10.0
        }
        print(sess.run(grads_tf, feed_dict=fd))

输出:

[1.0, 1.0]

因此,渐变将是:

  • 通过跳过层连接传递回前一层,保持不变
  • 传递给具有权重的块,并用于更新那些权重

编辑:存在一个问题:“在高速公路连接和神经网络模块再次结合在一起的时候,在图2的底部执行什么操作?”

答案是:它们相加。您可以从图2的公式中看到这一点:

输出FX+X

这说明的是:

  • X
  • XFX
  • 输出

编辑2:

用略有不同的词重写:

  • 在正向,输入数据沿总线向下流动
    • 在总线上的各个点,残差块可以学习向总线矢量添加/删除值
  • 在向后的方向上,梯度向下流回总线
    • 一路上,梯度会更新它们经过的残差块
    • 剩余块本身也会稍微修改渐变

残差块确实会修改向后流动的梯度,但是没有梯度流过的“挤压”或“激活”功能。“挤压” /“激活”功能是导致爆炸/消失梯度问题的原因,因此,通过从总线本身上移除这些功能,我们可以大大缓解此问题。

编辑3:就个人而言,我想像一下下面的图所示。它的拓扑结构与图2相同,但可能更清楚地显示了总线是如何直接流经网络的,而剩余的块只是从总线中提取值,并针对总线添加/删除了一些小矢量:

在此处输入图片说明


1
如果梯度也通过权重块传递(就像在常规网络中一样),那么resnet收益从何而来?当然,它允许渐变直接跳到基本输入,但是当另一条路径仍正常训练时,如何提高性能呢?
西蒙(Simon)

3
我懂了。因此,一个梯度直接跳回x,另一个梯度通过权重传播回x。由于x分成2条路径,它们到达x时会求和吗?如果是这样,梯度在移回这些图层时是否还没有改变?
西蒙(Simon)

1
梯度一直沿堆栈向下流动,没有变化。但是,每个块在应用其权重更新并生成自己的梯度集之后,将自己的梯度变化贡献到堆栈中。每个块都具有输入和输出,并且渐变将从输入中流出,然后返回到渐变“高速公路”中。
休·帕金斯

1
@RonakAgrawal添加了一个编辑,其中显示了图2中的求和操作符,并对其进行了解释
Hugh Perkins

1
添加了第二个编辑,稍微修改了我的解释:)
休·珀金斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.