neural-network - NN 残差层反向传播推导说明

标签 neural-network deep-learning bigdata deep-residual-networks generic-derivation

我到处找,找不到任何可以解释残差层反向传播的实际推导的东西。这是我最好的尝试,也是我卡住的地方。值得一提的是,我希望的推导是从通用角度出发的,不必局限于卷积神经网络。

如果计算普通隐藏层输出的公式是 F(x),那么带有残差连接的隐藏层的计算公式是 F(x) + o,其中 x 是前一层的权重调整后的输出,o 是前一层的输出,F是激活函数。为了在反向传播期间获得正常层的增量,需要计算输出 ∂F(x)/∂x 的梯度。对于残差层,这是∂(F(x) + o)/∂x,它可以分离为∂F(x)/∂x + ∂o/∂x (1)。

如果所有这些都是正确的,那么如何处理∂o/∂x?在我看来,这取决于网络 o 来自多远。

  • 如果 o 只是来自前一层,那么 o*w=x 其中 w 是连接前一层和 F(x) 层的权重。取每一边相对于 o 的导数给出 ∂(o*w)/∂o = ∂x/∂o,结果是 w = ∂x/do,它正好是 (1 ) 以上。在这种情况下,残差层的梯度只是 ∂F(x)/∂x + 1/w 有意义吗?将 1/w 解释为矩阵逆是否准确?如果是这样,那么实际上是由使用残差连接的 NN 框架计算出来的,还是有一些捷径可以添加来自残差的误差?
  • 如果 o 来自网络中更靠后的位置,我认为,推导会稍微复杂一些。这是一个示例,其中残差来自网络中更靠后的一层。网络架构为Input--w1--L1--w2--L2--w3--L3--Out,L1到L3层有残差连接。为了明确起见,第一个示例中的符号 o 被层输出 L1 替换。我们试图在反向传播期间计算 L3 处的梯度,它具有 F(x)+L1 的前向函数,其中 x=F(F(L1*w2)*w3)。这种关系的导数是∂x/∂L1=∂F(F(L1*w2)*w3/∂L1,虽然比较复杂,但数值求解似乎不太难。

  • 如果上述推导是合理的,那么值得注意的是,存在推导失败的情况,即残差连接源自输入层。这是因为输入不能分解为 o*w=x 表达式(其中 x 将是输入值)。我认为这一定表明残差层不能源自输入层,但由于我已经看到具有源自输入的残差连接的网络架构图,这使我对上述推导产生怀疑。我看不出我哪里出错了。如果有人可以提供有关如何正确计算残差合并点的梯度的推导或代码示例,我将不胜感激。

    编辑:

    我的问题的核心是,在使用残差层并进行vanilla反向传播时,是否对添加残差的层处的错误进行了特殊处理?由于残差来自的层与添加残差的层之间存在“连接”,因此错误是否需要通过此“连接”向后分布?我的想法是,由于残差层提供从网络开始到更深层的原始信息,更深的层应该向较早的层提供原始错误。

    根据我所看到的(阅读可搜索论坛的前几页、阅读基本论文和观看视频讲座)和下面的 Maxim 帖子,我开始认为答案是 ∂o/∂x = 0 并且我们将 o 视为常数。

    有没有人在通过带有残差层的 NN 进行反向传播的过程中做任何特别的事情?如果不是,那么这是否意味着残差层仅在前向传递中是网络的“事件”部分?

    最佳答案

    我认为您使残差网络过于复杂了一点。这是 Kaiming He at al 的 the original paper 链接。

    在 3.2 节中,他们将“身份”快捷方式描述为 y = F(x, W) + x ,其中 W 是可训练的参数。你可以看到为什么它被称为“身份”:上一层的值按原样添加,没有任何复杂的转换。这使得两件事:

  • F 现在学习残差 y - x(在 3.1 中讨论),简而言之:它更容易学习。
  • 网络获得了与前一层的额外连接,从而改善了梯度流。

  • 通过恒等映射的后向流是微不足道的:错误消息原封不动地传递,不涉及逆矩阵(实际上,它们不涉及 in any linear layer )。

    现在,论文作者更进一步,考虑了一个稍微复杂一点的 F 版本,它改变了输出维度(你可能已经想到了)。他们通常将其写为 y = F(x, W) + Ws * x ,其中 Ws 是投影矩阵。请注意,虽然它被写成矩阵乘法,但这个操作实际上非常简单:它向 x 添加额外的零以使其形状更大。您可以在 this question 中阅读有关此操作的讨论。但这对后向的改变很少:错误消息只是简单地裁剪为 x 的原始形状。

    关于neural-network - NN 残差层反向传播推导说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46639188/

    相关文章:

    sdk - 深度学习 DJI Mavic Pro 和 Guidance SDK 编程语言

    c++ - 频繁变化的大型数据集的最佳数据结构

    mysql - 针对架构不断变化的大型数据库的策略

    hadoop - 为什么在一个 Hadoop 作业中只使用 1 个 map 和 1 个 reduce 任务以及 1 个节点?

    neural-network - 如何使用 Keras 构建词性标注器?

    python - 使用 pytorch 进行多类句子分类(使用 nn.LSTM)

    python - 使用 PyTorch nn.Sequential() 以灵活的方式定义网络,但结果超出预期

    python - dropout 中的 keep_prob 值以及通过 dropout 获得最差结果

    python-3.x - 从 Tensorflow Keras 检查点重新加载最佳权重

    machine-learning - 除了深度学习以外,还有什么方法可以使问答机器人更好地表现?