我到处寻找,找不到任何可以解释残余层的反推的实际推导的东西。这是我最好的尝试,也是我被困的地方。值得一提的是,我希望的推导是从一般的角度来看,不需要局限于卷积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仅来自前一层,那么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来自网络的后面,那么,我认为,推导变得稍微复杂一些。这是一个例子,残差来自网络中的一层。网络架构是输入 - 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将是输入值)。我认为这必须表明残留层不能来自输入层,但是因为我看到网络架构图具有源自输入的剩余连接,这使我对上述推导产生怀疑。我无法看到我出错的地方。如果有人能够提供推导或代码样本来正确计算剩余合并点的梯度,我将深表感激。
编辑:
我的问题的核心是,当使用残留层并进行香草反向传播时,是否在添加残差的层上对错误进行了特殊处理?由于残差来自的层与添加残差的层之间存在“连接”,因此错误是否需要通过此“连接”向后分布?我的想法是,由于残留层提供了从网络开始到更深层的原始信息,因此较深层应该为较早的层提供原始错误。
基于我所看到的(阅读googleable论坛的前几页,阅读基本论文,观看视频讲座)和Maxim的帖子,我开始认为答案是∂o/ ∂x= 0,我们将o视为常数。
有没有人在通过具有剩余层的NN进行反击时做任何特殊事情?如果不是,那么这是否意味着残留层只是前向传递的网络的“活跃”部分?
答案 0 :(得分:3)
我认为你过度复杂的残留网络有点过分了。以下是Kaiming He at al。
与the original paper的链接在3.2节中,他们描述了"身份"快捷方式为y = F(x, W) + x
,其中W
是可训练的参数。您可以看到为什么它被称为" identity&#34 ;:上一层的值按添加,没有任何复杂的转换。这有两件事:
F
现在可以学习剩余y - x
(在3.1中讨论),简而言之:它更容易学习。通过标识映射的向后流是微不足道的:错误消息未更改,不涉及反向矩阵(事实上,它们不涉及in any linear layer)。
现在,论文作者更进一步,考虑一个稍微复杂的F
版本,它会改变输出维度(这可能是你想到的)。他们通常将其写为y = F(x, W) + Ws * x
,其中Ws
是投影矩阵。请注意,尽管它被写为矩阵乘法,但这个操作实际上非常简单:它为x
增加了额外的零以使其形状更大。您可以在this question中阅读有关此操作的讨论。但这只会对后退做出很少的改动:错误信息只会被剪切为x
的原始形状。