澄清NN残差层反向传播推导
Clarification on NN residual layer back-prop derivation
我找遍了所有地方,但找不到任何可以解释残差层反向传播的实际推导的内容。这是我最好的尝试,也是我被困的地方。值得一提的是,我希望的推导是从一个通用的角度出发的,不必局限于卷积神经网络。
如果计算普通隐层输出的公式为F(x)那么有残差连接的隐层计算公式为F(x)+o,其中x为a的权值调整输出前一层,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,这个比较复杂,但是数值求解好像也不是太难
如果上述推导是合理的,那么值得注意的是,推导有失败的情况,那就是Input层产生了残差连接。这是因为输入不能分解为 o*w=x 表达式(其中 x 将是输入值)。我认为这一定表明残差层不能源自输入层,但由于我已经看到具有源自输入的残差连接的网络架构图,这使我的上述推导受到质疑。我看不出哪里出了问题。如果有人能提供他们如何正确计算残差合并点梯度的推导或代码示例,我将不胜感激。
编辑:
我的问题的核心是,在使用残差层做vanilla back-propagation的时候,有没有对添加残差的层的error做特殊处理?由于在残差来自的层和添加残差的层之间有一个 'connection',错误是否需要在这个 'connection' 上向后分布?我的想法是,由于残差层提供了从网络开始到更深层的原始信息,因此更深层应该为更早的层提供原始错误。
根据我所见(阅读 googleable 论坛的前几页、阅读重要论文和观看视频讲座)和下面 Maxim 的 post,我开始认为答案是 ∂o/∂x = 0 并且我们将 o 视为常数。
有人在通过带有残差层的神经网络进行反向传播的过程中做了什么特别的事情吗?如果不是,那是否意味着残差层仅在前向传播中是网络的 'active' 部分?
我认为您将残差网络复杂化了一点。这是 Kaiming He 在 al.
的 link 到 the original paper
在第 3.2 节中,他们将 "identity" 快捷方式描述为 y = F(x, W) + x
,其中 W
是可训练参数。可以看出为什么叫"identity":将上一层的值原样加上,没有任何复杂的变换。这使得两件事:
F
现在学习残差y - x
(在3.1中讨论),总之:更容易学习。
- 网络与前一层有额外的连接,这改善了梯度流。
通过恒等映射的反向流是微不足道的:错误信息原样传递,不涉及逆矩阵(事实上,它们不涉及in any linear layer)。
现在,论文作者走得更远,考虑了稍微复杂一点的 F
版本,它改变了输出维度(您可能已经想到了)。他们一般写成y = F(x, W) + Ws * x
,其中Ws
是投影矩阵。请注意,虽然它被写成矩阵乘法,但这个操作实际上非常简单:它将额外的零添加到 x
以使其形状更大。您可以在 中阅读有关此操作的讨论。但这几乎没有向后改变:错误消息只是被剪裁成 x
.
的原始形状
我找遍了所有地方,但找不到任何可以解释残差层反向传播的实际推导的内容。这是我最好的尝试,也是我被困的地方。值得一提的是,我希望的推导是从一个通用的角度出发的,不必局限于卷积神经网络。
如果计算普通隐层输出的公式为F(x)那么有残差连接的隐层计算公式为F(x)+o,其中x为a的权值调整输出前一层,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,这个比较复杂,但是数值求解好像也不是太难
如果上述推导是合理的,那么值得注意的是,推导有失败的情况,那就是Input层产生了残差连接。这是因为输入不能分解为 o*w=x 表达式(其中 x 将是输入值)。我认为这一定表明残差层不能源自输入层,但由于我已经看到具有源自输入的残差连接的网络架构图,这使我的上述推导受到质疑。我看不出哪里出了问题。如果有人能提供他们如何正确计算残差合并点梯度的推导或代码示例,我将不胜感激。
编辑:
我的问题的核心是,在使用残差层做vanilla back-propagation的时候,有没有对添加残差的层的error做特殊处理?由于在残差来自的层和添加残差的层之间有一个 'connection',错误是否需要在这个 'connection' 上向后分布?我的想法是,由于残差层提供了从网络开始到更深层的原始信息,因此更深层应该为更早的层提供原始错误。
根据我所见(阅读 googleable 论坛的前几页、阅读重要论文和观看视频讲座)和下面 Maxim 的 post,我开始认为答案是 ∂o/∂x = 0 并且我们将 o 视为常数。
有人在通过带有残差层的神经网络进行反向传播的过程中做了什么特别的事情吗?如果不是,那是否意味着残差层仅在前向传播中是网络的 'active' 部分?
我认为您将残差网络复杂化了一点。这是 Kaiming He 在 al.
的 link 到 the original paper在第 3.2 节中,他们将 "identity" 快捷方式描述为 y = F(x, W) + x
,其中 W
是可训练参数。可以看出为什么叫"identity":将上一层的值原样加上,没有任何复杂的变换。这使得两件事:
F
现在学习残差y - x
(在3.1中讨论),总之:更容易学习。- 网络与前一层有额外的连接,这改善了梯度流。
通过恒等映射的反向流是微不足道的:错误信息原样传递,不涉及逆矩阵(事实上,它们不涉及in any linear layer)。
现在,论文作者走得更远,考虑了稍微复杂一点的 F
版本,它改变了输出维度(您可能已经想到了)。他们一般写成y = F(x, W) + Ws * x
,其中Ws
是投影矩阵。请注意,虽然它被写成矩阵乘法,但这个操作实际上非常简单:它将额外的零添加到 x
以使其形状更大。您可以在 x
.