我到处寻找,找不到任何可以解释残余层的背撑的实际推导的东西。这是我最好的尝试,也是我被困的地方。值得一提的是,我希望的推导是从一般性的角度来看,不必局限于卷积NN。
如果计算普通隐藏层输出的公式为F(x),那么具有残差连接的隐藏层的公式为F(x)+ o,其中x是前一层的权重调整输出,o为前一层的输出,F是激活功能。为了在反向传播期间获得正常层的delta,需要计算输出的梯度∂F(x)/∂x。对于残余层,这是∂(F(x)+ o)/∂x,它可分为∂F(x)/∂x+∂o/∂x(1)。
如果所有这些都是正确的,那么如何处理∂o/∂x?在我看来,这取决于网络o的后退距离。
如果上述推导是合理的,那么值得注意的是,存在导出失败的情况,即剩余连接源自输入层的情况。这是因为输入不能分解为o * w = x表达式(其中x将是输入值)。我认为这必须表明残留层不能来自输入层,但是因为我看到网络架构图具有源自输入的剩余连接,这使我对上述推导产生怀疑。我无法看到我出错的地方。如果有人能够提供一个推导或代码样本来正确计算剩余合并点的梯度,我将深表感激。
编辑:
我的问题的核心是,当使用残留层并进行香草反向传播时,是否在添加残差的层中对误差进行了特殊处理?由于残差来自的层与添加残差的层之间存在“连接”,因此错误是否需要通过此“连接”向后分布?我的想法是,由于残留层提供了从网络开始到更深层的原始信息,因此较深层应该为较早的层提供原始错误。
基于我所看到的(阅读googleable论坛的前几页,阅读必要的论文,观看视频讲座)和Maxim的帖子,我开始认为答案是∂o/∂x= 0,我们将o视为常数。
有没有人在通过具有剩余层的NN进行反击时做任何特殊事情?如果不是,那么这是否意味着剩余层只是前向传递的网络的“活跃”部分?
我认为你的遗留网络过于复杂了一点点。这里是Kaiming He在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
的原始形状。