Sutskever 30 #17:残差的 skip 上不能随便乘个数
#16 结尾我说那根 skip 现在到处都是,每个 Transformer block 里都躺着一个。那篇把它当成一个干净的 +x 用。可它真得是 +x 吗?把它换成 +0.9·x 或者 +1.1·x,差这么一点,按说无所谓。He、Sun 他们 2016 年的后续论文(Identity Mappings)专门为这点较了真,结论是差这一点,深网络就重新训不动了。原因还是那个老问题——你又在沿着深度乘东西了,而 skip 当初就是为了让你别再乘。 给 skip 乘上一个数 干净的残差块是 x ← x + F(x)。一路堆上去,第 l 层到第 L 层之间,主干就是一串加法: $$x_L = x_l + \sum_{i=l}^{L-1} F(x_i)$$反向也就跟着干净。x_l 收到的梯度是 $$\frac{\partial x_L}{\partial x_l} = I + \sum_{i=l}^{L-1}\frac{\partial F(x_i)}{\partial x_l}$$那个 I 就是 #16 里反复说的直通线,梯度原样递回去,不管中间几十层。 现在在 skip 上压个常数 λ,块变成 x ← λ·x + F(x)。把它展开,主干上每过一块就多乘一次 λ,到第 L 层: $$x_L = \lambda^{\,L-l}\, x_l + \cdots$$梯度也一样,x_l 那一项前面挂上了 λ^{L-l}。λ 只要不等于 1,这就是深度的指数。50 层下来,λ=1.1 是 1.1^50 ≈ 117,λ=0.8 是 0.8^50 ≈ 1.4e-5。skip 本来是用那个 I 把连乘掐断的,你给它乘个 0.9,连乘原封不动地回来了。 ...