AI 课程网站首页
返回知识库

残差网络与归一化:训练非常深的网络

普通深层网络为何退化,跳跃连接与归一化如何解决,以及它们各自对信号的作用。

本篇目录
  1. 更深并不自动更好
  2. 残差连接
  3. 残差网络的方差
  4. 批归一化
  5. 其他归一化
  6. 残差块的设计
  7. 残差网络为什么有效
  8. 术语
  9. 小结
  10. 注释
  11. 练习
  12. 参考文献

第 7 篇说明深度能让网络的表达能力大大增强,第 8 篇推导了在训练开始时让信号保持合适大小的初始化方法。然而到 2015 年,能训练好的最深网络大约只有二十层。给普通卷积网络再加层,结果反而更差,连在训练数据上也是如此。本文解释其原因,并介绍打破这一限制的两个想法:残差连接,把每一层的输出加到它的输入上;归一化层,在网络内部重新调整激活值的尺度。两者结合,让上百层的网络成为常规,它们也是几乎所有现代架构的组成部分,包括第 12 篇的 Transformer。我们推导它们各自对前向信号和梯度的作用,用模拟验证这些推导,并把关于它们已被证明的结论与仅仅是观察到的现象区分开来。

1. 更深并不自动更好

He 等人在 CIFAR-10 图像上训练了 20 层和 56 层的普通卷积网络 [2]。56 层网络的误差比 20 层的高,在测试集上如此,在训练集上也是如此。训练误差更高,就排除了过拟合(第 9 篇)这一解释。这也不是表示能力的问题:更深的网络只要把多出来的层设为恒等映射,就能模仿较浅的网络,所以它可能达到的最低训练误差不会更高。更深的网络只是更难优化。他们称之为退化问题。

仅靠初始化治不了它。He 初始化(第 8 篇)让激活值和误差信号的大小平均保持不变,但随机矩阵的长串乘积仍会把梯度所携带的信息打乱。观察梯度如何随输入变化,是看清这一点的一种方式。图 11.1 画出了三个单输入、单输出网络的导数 ∂y/∂x\partial y / \partial x 随输入沿一条直线移动时的变化。对浅层网络,导数是 xx 的简单函数:相邻的输入梯度相近。对 100 层的普通网络,它看起来像噪声。对十个随机网络取平均,直线上相邻两点导数之间的相关系数,浅层网络为 0.98,24 层、50 层、100 层的普通网络则依次降到 0.90、0.70 和 0.50。Balduzzi 等人称之为破碎梯度问题 [9]。如果某个输入处的梯度对附近输入处的梯度几乎没有提示作用,那么在一批样本上算出的梯度步,对附近的输入来说就是很差的指引,训练进展缓慢。

三幅图,画出输出对输入的导数随 x 从 -2 到 2 的变化。a)浅层网络:一条平滑曲线,左边高、右边低,在零附近陡变。b)100 层的普通网络:一条锯齿状、像噪声一样的曲线。c)100 个块的残差网络:形状与 a 相似的曲线,在零附近有小的波动。

图 11.1 破碎梯度。 三个随机初始化、宽度为 100、标量输入和输出的 ReLU 网络,在 −2-2 到 2 之间 256 个输入上的导数 ∂y/∂x\partial y / \partial x。a)浅层网络:导数随 xx 平滑变化。b)100 层、He 初始化的普通网络:某个输入处的导数与相邻点几乎无关(相邻点相关系数 0.50,十个网络的平均)。c)100 个块的残差网络(第 2 节):浅层网络的结构得以保留(相关系数 0.97)。

图 11.1 的第三幅显示了保住这种结构的网络:一个 100 个块的残差网络。下面介绍它。

2. 残差连接

残差块计算其输入的一个函数 Fk\mathbf{F}_k,即残差分支,再把结果加到输入上:

hk+1=hk+Fk(hk)(11.1)\mathbf{h}_{k+1} = \mathbf{h}_k + \mathbf{F}_k(\mathbf{h}_k) \tag{11.1}

分支 Fk\mathbf{F}_k 是一个小网络,通常是中间夹一个激活函数的两层,它的输出必须与输入形状相同,二者才能相加。把 hk\mathbf{h}_k 绕过分支传过去的连接称为跳跃连接或捷径。用文字说:每个块计算一个修正量并加到收到的东西上,而不是替换它。如果分支输出为零,这个块就是恒等映射;因此由这种块组成的深层网络,可以表示删掉其中任意几个块所得到的较浅网络,这正是退化问题中似乎缺少的性质。

展开残差网络

把一个块代入下一个块,就能看出残差网络在计算什么。三个块、输入为 x\mathbf{x} 时:

y=x+F1(x)+F2(x+F1(x))+F3(x+F1(x)+F2(x+F1(x)))(11.2)\mathbf{y} = \mathbf{x} + \mathbf{F}_1(\mathbf{x}) + \mathbf{F}_2\big(\mathbf{x} + \mathbf{F}_1(\mathbf{x})\big) + \mathbf{F}_3\Big(\mathbf{x} + \mathbf{F}_1(\mathbf{x}) + \mathbf{F}_2\big(\mathbf{x} + \mathbf{F}_1(\mathbf{x})\big)\Big) \tag{11.2}

每个块都可以经过或跳过,所以从输入到输出共有 23=82^3 = 8 条路径,长度为 0、1、2、3 个块,各有 1,3,3,11, 3, 3, 1 条。有 KK 个块的网络有 2K2^K 条路径,经过 kk 个块的路径有 (Kk)\binom{K}{k} 条:大多数路径的长度约为网络深度的一半。相比之下,普通网络只有一条穿过所有层的路径。

梯度总有一条直达路径

由式 11.1 可得一个块的输出对其输入的导数:

∂hk+1∂hk=I+∂Fk∂hk(11.3)\frac{\partial \mathbf{h}_{k+1}}{\partial \mathbf{h}_k} = \mathbf{I} + \frac{\partial \mathbf{F}_k}{\partial \mathbf{h}_k} \tag{11.3}

其中单位矩阵 I\mathbf{I} 来自跳跃连接,第二项是分支的雅可比矩阵。反向传播经过 KK 个块时要把这些矩阵相乘(第 8 篇,式 8.12),把乘积展开得到

∏k=1K(I+∂Fk∂hk)=I+∑k∂Fk∂hk+∑k>j∂Fk∂hk∂Fj∂hj+⋯(11.4)\prod_{k=1}^{K}\Big(\mathbf{I} + \frac{\partial \mathbf{F}_k}{\partial \mathbf{h}_k}\Big) = \mathbf{I} + \sum_{k} \frac{\partial \mathbf{F}_k}{\partial \mathbf{h}_k} + \sum_{k > j} \frac{\partial \mathbf{F}_k}{\partial \mathbf{h}_k}\frac{\partial \mathbf{F}_j}{\partial \mathbf{h}_j} + \cdots \tag{11.4}

式 11.2 的每条路径对应其中一项(矩阵乘积的顺序与块的顺序一致)。第一项是单位矩阵:无论分支做什么,输出端的误差信号都能原封不动地直接到达每个块。相比之下,普通网络中只有所有层雅可比矩阵的乘积这一项。

用标量数字可以把区别说得很具体。在一条 20 层的普通链中,如果每层导数都是 0.5,乘积为 0.520≈9.5×10−70.5^{20} \approx 9.5 \times 10^{-7};都是 0.9 时为 0.12,都是 1.1 时为 6.7。每个因子都必须非常接近 1,乘积才能保持可用。在残差链中,因子是 1+ck1 + c_k,其中 ckc_k 是分支的导数。20 个块的 ckc_k 都取 0.050.05 时,乘积为 1.0520=2.651.05^{20} = 2.65;都取 −0.05-0.05 时为 0.9520=0.360.95^{20} = 0.36。分支只需要小,不需要精确调好。如果把它们初始化为恰好为零,网络一开始就是首层与末层之间的恒等映射,训练起来毫无困难,训练再从这里逐渐让每个分支长大。

3. 残差网络的方差

式 11.1 有一个代价。每个块都把分支的输出加到信号上,所以信号会增长。在初始化时,如果每个分支最后一层的权重独立抽取、均值为零,分支输出就与 hk\mathbf{h}_k 不相关,方差相加:

Var(hk+1)=Var(hk)+Var(Fk(hk))(11.5)\mathrm{Var}(\mathbf{h}_{k+1}) = \mathrm{Var}(\mathbf{h}_k) + \mathrm{Var}\big(\mathbf{F}_k(\mathbf{h}_k)\big) \tag{11.5}

如果分支的初始化让它保持输入的大小(He 初始化对每一层都是这样做的),那么 Var(Fk(hk))≈Var(hk)\mathrm{Var}(\mathbf{F}_k(\mathbf{h}_k)) \approx \mathrm{Var}(\mathbf{h}_k),每经过一个块方差大约翻一倍:50 个块后增长约 250≈10152^{50} \approx 10^{15} 倍。残差网络用一个爆炸的和,换掉了普通网络中消失的乘积。

图 11.2 用模拟验证这一点:50 个宽度为 100 的块,每个分支是两层 He 初始化的 ReLU 层,输入是一批 256 个随机样本。不做任何修正时(橙色),方差在 1 个块后为 2.0,10 个块后为 1,490,50 个块后为 8×10158 \times 10^{15}。实践中有三种补救办法,图中展示了其中两种:

  • **缩放分支。**把每个分支乘以 1/K1/\sqrt{K},使它只增加当前方差的 1/K1/K,于是 Var(hK)≈(1+1/K)K Var(x)≤e Var(x)\mathrm{Var}(\mathbf{h}_K) \approx (1 + 1/K)^K\,\mathrm{Var}(\mathbf{x}) \le e\,\mathrm{Var}(\mathbf{x})。模拟中 50 个块后为 2.6(绿色)。
  • 把每个分支初始化为零,即把它最后一层的权重或最后一个归一化层的缩放系数设为零 [10]。网络一开始就恰好是恒等映射,初始化时方差保持不变。
  • **对分支的输入做归一化。**如果每个分支以一个归一化层开头(第 4 节),它的输入方差总是 1,所以它增加的方差大致恒定,总方差只随深度线性增长:1 个块后为 2.1,50 个块后为 48(蓝色)。于是每个新分支相对于它所加上去的信号都很小,这使各个块在初始化时偏向恒等映射 [11]。

一幅图,画出残差流的方差随块编号从 1 到 50 的变化,纵轴为对数刻度。橙线沿直线上升到约 10 的 15 次方。蓝线缓慢上升到约 50。绿线保持在 1 到约 2.6 之间。

图 11.2 信号经过 50 个残差块时的方差。 每个块加上一个两层、He 初始化的 ReLU 分支的输出(宽度 100,一批 256 个随机输入)。橙色:分支未归一化;方差每个块大约翻倍(式 11.5)。蓝色:每个分支以批归一化开头,所以每次增加的量大致恒定,方差线性增长。绿色:每个分支乘以 1/501/\sqrt{50},方差只增长约 ee 倍。注意纵轴是对数刻度。

4. 批归一化

归一化层在网络内部重新调整激活值的尺度。第一种、也是影响最大的一种是批归一化 [3]。它对每个隐藏单元(在卷积网络中是每个通道)分别处理,使用该单元在当前批的 BB 个样本上的值。对预激活为 z1,…,zBz_1, \ldots, z_B 的一个单元,它计算:

μ=1B∑i=1Bzi,σ2=1B∑i=1B(zi−μ)2,z^i=zi−μσ2+ϵ,yi=γ z^i+β(11.6)\mu = \frac{1}{B}\sum_{i=1}^{B} z_i, \qquad \sigma^2 = \frac{1}{B}\sum_{i=1}^{B} (z_i - \mu)^2, \qquad \hat{z}_i = \frac{z_i - \mu}{\sqrt{\sigma^2 + \epsilon}}, \qquad y_i = \gamma\,\hat{z}_i + \beta \tag{11.6}

这可以分成三步。第一,计算该单元在这一批上的均值和方差。第二,减去均值、除以标准差,使归一化后的值 z^i\hat{z}_i 在批内均值为 0、方差为 1;小常数 ϵ\epsilon(如 10−510^{-5})用来避免除以零。第三,用每个单元两个可学习的参数 γ\gamma 和 β\beta 做缩放和平移,使这一层仍能表示网络所需的任何均值和方差,包括撤销归一化。在卷积网络中,一个通道的均值和方差是对批和所有位置一起计算的,这样每个位置都被同样对待。

例如,一个单元在四个样本组成的批中预激活为 (2,4,6,8)(2, 4, 6, 8),均值为 5,方差为 (9+1+1+9)/4=5(9 + 1 + 1 + 9)/4 = 5。归一化后的值为 (−1.342,−0.447,0.447,1.342)(-1.342, -0.447, 0.447, 1.342);取 γ=2\gamma = 2、β=1\beta = 1,输出为 (−1.683,0.106,1.894,3.683)(-1.683, 0.106, 1.894, 3.683)。用文字说:无论前面的层做了什么,批归一化都让每个单元在一批中的值具有受控的均值和离散程度。

预测时可能只有一个样本,所以批统计量换成训练期间累积的 μ\mu 和 σ2\sigma^2 的滑动平均。这一层于是成为一个固定的仿射函数,可以并入前面的权重。由于 β\beta 起到了偏置的作用,批归一化层之前的那一层不需要自己的偏置。

反向计算

批统计量依赖批中的每个样本,所以每个样本的梯度都依赖其他样本。记 gi=∂ℓ/∂z^i=γ ∂ℓ/∂yig_i = \partial\ell/\partial\hat{z}_i = \gamma\,\partial\ell/\partial y_i,经由 μ\mu 和 σ\sigma 应用链式法则(忽略 ϵ\epsilon),得到

∂ℓ∂zi=1σ(gi−1B∑jgj−z^i 1B∑jgj z^j)(11.7)\frac{\partial \ell}{\partial z_i} = \frac{1}{\sigma}\Big(g_i - \frac{1}{B}\sum_{j} g_j - \hat{z}_i\,\frac{1}{B}\sum_{j} g_j\,\hat{z}_j\Big) \tag{11.7}

用文字说:从传入的梯度中去掉它在批上的均值,以及它沿归一化值方向的分量,再除以标准差。两次去除各有原因。给批中每个 ziz_i 加同一个常数,或都乘以同一个正数,z^\hat{z} 都不变,所以损失不可能依赖这两个方向,梯度在这两个方向上也就没有分量。对 z=(2,4,6,8)z = (2, 4, 6, 8) 和 g=(1,0,0,0)g = (1, 0, 0, 0),式 11.7 给出 (0.134,−0.179,−0.045,0.089)(0.134, -0.179, -0.045, 0.089),它的和为零、与 z^\hat{z} 正交,并且与有限差分一致。

它为什么有用

批归一化让网络训练得更快、能用更大的学习率、对初始化也不那么敏感,很快被广泛采用。它为什么有效,远不如它有效这一点那样确定。有四种机制得到了较好的支持:

  • 它在每一层控制激活值的尺度,训练期间和初始化时都是如此,从而消除了第 3 节的方差增长,以及对初始化的大部分敏感性。
  • **它让每一层对其权重的尺度不变。**如果输入某个归一化单元的权重 Ω\boldsymbol{\Omega} 乘以 a>0a > 0,预激活也乘以 aa,而式 11.6 会消去这个因子:输出不变。于是对 aΩa\boldsymbol{\Omega} 的梯度是对 Ω\boldsymbol{\Omega} 的梯度的 1/a1/a 倍,一次梯度步改变权重方向的幅度与 1/∥Ω∥21/\|\boldsymbol{\Omega}\|^2 成正比。大的权重自动得到小的有效学习率;而缩小权重的权重衰减,会提高有效学习率 [12]。
  • **它允许更大的学习率。**Santurkar 等人 [13] 发现,批归一化让损失及其梯度随参数移动而变化得更平滑,所以更大的步长仍能保持稳定。
  • **它引入噪声。**每个样本用依赖于同批其他样本的统计量来归一化,这起到轻微的正则化作用(第 9 篇)。

原论文的解释——批归一化减少了内部协变量偏移(即随着前面的层被训练,每层输入分布的变化)——并没有得到很好的支持:Santurkar 等人在归一化层之后故意注入分布偏移,训练并未受到影响 [13]。

批归一化也有代价。它的表现依赖批大小:批小时统计量噪声大,准确率下降。训练和预测计算的是不同的函数,这是一些隐蔽错误的来源。而且同一批中的样本会相互影响彼此的输出,有些任务不允许这样。

5. 其他归一化

几种替代方法的区别在于哪些值放在一起归一化。对卷积层,一批激活值构成形状为 B×C×H×WB \times C \times H \times W 的数组。每种方法在其中一组值上计算均值和方差,并用它们归一化这一组(图 11.3):

方法 统计量的计算范围 依赖批吗? 主要用途
批归一化 [3] 一个通道,所有样本和位置 是 大批量的卷积网络
层归一化 [5] 一个样本,所有通道(和位置) 否 Transformer、循环网络
组归一化 [6] 一个样本,一组通道 否 小批量的卷积网络
实例归一化 [7] 一个样本,一个通道 否 图像风格迁移

四个 4 行(样本)6 列(通道)的方格。a)批归一化:一列高亮。b)层归一化:一行高亮。c)组归一化:一行中相邻的三格高亮。d)实例归一化:只有一格高亮。

图 11.3 每种归一化使用哪些值。 每个方格表示一批 4 个样本(行)、6 个通道(列);每一格代表一个样本的一个通道的全部 H×WH \times W 个位置。橙色格子放在一起,用同一个均值和方差归一化。a)批归一化:一个通道跨整批。b)层归一化:一个样本的全部通道。c)组归一化:一个样本的一组通道。d)实例归一化:一个样本的一个通道。

一个小表可以说明区别。取一批四个样本,每个有三个特征,每行一个样本:

[204420624844] → 批归一化(按列)  [−1.342−1.4140.577−0.4470−1.7320.44700.5771.3421.4140.577],→ 层归一化(按行)  [0−1.2251.2251.2250−1.2251.225−1.22501.414−0.707−0.707]\begin{bmatrix} 2 & 0 & 4 \\ 4 & 2 & 0 \\ 6 & 2 & 4 \\ 8 & 4 & 4 \end{bmatrix} \ \xrightarrow{\ \text{批归一化(按列)}\ }\ \begin{bmatrix} -1.342 & -1.414 & 0.577 \\ -0.447 & 0 & -1.732 \\ 0.447 & 0 & 0.577 \\ 1.342 & 1.414 & 0.577 \end{bmatrix}, \qquad \xrightarrow{\ \text{层归一化(按行)}\ }\ \begin{bmatrix} 0 & -1.225 & 1.225 \\ 1.225 & 0 & -1.225 \\ 1.225 & -1.225 & 0 \\ 1.414 & -0.707 & -0.707 \end{bmatrix}

批归一化让每一列均值为 0、方差为 1;每个样本的输出依赖另外三个样本。层归一化让每一行均值为 0、方差为 1;每个样本单独归一化,所以训练和预测时计算同一个函数,适用于任何批大小,包括 1。正因为这种独立性,生成时常常一次只处理一个序列的 Transformer 使用层归一化。RMSNorm [8] 进一步简化了层归一化:不减均值,只除以均方根。第一行 (2,0,4)(2, 0, 4) 变成 (0.775,0,1.549)(0.775, 0, 1.549)。它更便宜,在大型语言模型中效果相差无几。

6. 残差块的设计

残差的想法并没有规定分支里放什么、归一化和激活放在哪里。三种设计涵盖了大部分实践(图 11.4)。

三个竖直的结构图,每个底部是输入,中间一叠方框,上方是一个加法节点和输出,一条橙线绕过方框直达加法节点。a)原始残差块:卷积、批归一化、ReLU、卷积、批归一化,然后相加,再接 ReLU。b)预激活残差块:批归一化、ReLU、卷积、批归一化、ReLU、卷积,然后相加,之后没有 ReLU。c)瓶颈残差块:从 256 到 64 通道的 1 乘 1 卷积,批归一化和 ReLU,64 到 64 的 3 乘 3 卷积,批归一化和 ReLU,64 到 256 的 1 乘 1 卷积,批归一化,然后相加并接 ReLU。

图 11.4 三种残差块。 橙线是跳跃连接。a)He 等人的原始残差块 [2]:两个 3×33 \times 3 卷积,各接批归一化,相加之后再施加 ReLU。b)预激活残差块 [4]:归一化和 ReLU 放在每个卷积之前,相加之后什么也不做,所以跳跃连接在整个网络中构成一条干净的恒等路径。c)较深网络使用的瓶颈残差块:1×11 \times 1 卷积先把 256 个通道减到 64,供代价高的 3×33 \times 3 卷积使用,之后再恢复。

原始残差块与预激活残差块。 在原始残差块中(图 11.4a),相加之后接一个 ReLU,所以传给下一个块的信号并不恰好是 hk+Fk(hk)\mathbf{h}_k + \mathbf{F}_k(\mathbf{h}_k)。预激活残差块(图 11.4b)把归一化和激活移到分支内部。于是对任意两个块,hK=hk+∑j=kK−1Fj(hj)\mathbf{h}_K = \mathbf{h}_k + \sum_{j=k}^{K-1}\mathbf{F}_j(\mathbf{h}_j) 严格成立,式 11.4 中的恒等项不受影响。He 等人发现,这种设计训练 1,000 层的网络比原始设计更好 [4]。Transformer 也采用同样的模式,只是用层归一化(第 12 篇)。

瓶颈残差块。 由两个 256 通道的 3×33 \times 3 卷积组成的块有 2×9×256×256=1,179,6482 \times 9 \times 256 \times 256 = 1{,}179{,}648 个权重。瓶颈残差块(图 11.4c)在 64 个通道上做 3×33 \times 3 卷积,前后各有一个 1×11 \times 1 卷积减少和恢复通道数,共有 256×64+9×64×64+64×256=69,632256 \times 64 + 9 \times 64 \times 64 + 64 \times 256 = 69{,}632 个权重,少了 17 倍。由 16 个这样的块构成的 ResNet-50 约有 2560 万个参数,不到 VGG-16 的五分之一,而在 ImageNet 上更准确。

改变形状。 式 11.1 要求分支输出与输入形状相同。在网络下采样或改变通道数的地方,跳跃连接使用一个步幅为 2 的 1×11 \times 1 卷积(投影捷径)使形状匹配。

相关设计。 高速公路网络 [14] 早于残差网络,使用带门控的跳跃连接,门是学习得到的。DenseNet [15] 把前面所有层的输出拼接起来,而不是相加。U-Net(第 10 篇)的跳跃连接把细节跨越整个网络传过去,而不是只绕过一个块。

7. 残差网络为什么有效

有三种解释得到了较好的支持,但没有一种是完整的。

恒等路径让梯度保持有用的信息。 这就是第 2 节的推导,它是精确的:式 11.4 中有一项把输出端的误差信号原封不动地送到每个块。图 11.1c 显示了它对第 1 节梯度破碎问题的影响:100 个块时相邻梯度的相关系数为 0.97,几乎与浅层网络相同。

残差网络的行为像较浅网络的集成。 Veit 等人 [16] 从经验上研究了式 11.2 中的路径。从训练好的残差网络中删掉单个块,准确率几乎不变;而从 VGG 这样的普通网络中删掉一层,网络就失效了,所以没有哪一条路径是必不可少的。在一个 110 层的残差网络中,训练时大部分梯度来自只有 10 到 34 层深的路径。这说明残差网络之所以能避开深度带来的困难,部分原因在于它并不依赖最长的路径。

损失曲面更平滑。 Li 等人 [17] 沿参数空间中的随机方向可视化了损失曲面。没有跳跃连接的深层网络曲面混乱,有许多尖锐的局部起伏;同样的网络加上跳跃连接后,训练找到的极小值附近的曲面平滑、近乎凸。这类可视化只是极高维曲面的低维切片,所以它们是例证而不是证明。

8. 术语

  • 残差块计算 h+F(h)\mathbf{h} + \mathbf{F}(\mathbf{h})。F\mathbf{F} 是残差分支,绕过它的连接是跳跃连接、捷径或恒等路径。由这种块构成的网络是残差网络(ResNet)。hk\mathbf{h}_k 的序列有时称为残差流。
  • 预激活块在分支内每个权重层之前做归一化和激活;后激活块在之后做。
  • 瓶颈块在代价高的层之前用 1×11 \times 1 卷积减少通道数,之后再恢复。投影捷径是带 1×11 \times 1 卷积、用来改变形状的跳跃连接。
  • 批、层、组和实例归一化的区别在于放在一起归一化的值的集合(图 11.3)。RMSNorm 不减均值,只除以均方根。可学习的 γ\gamma 和 β\beta 分别是缩放和平移(或称增益和偏置)。

小结

层数很多的普通网络训练得比浅层网络差,连在训练数据上也是如此,因为梯度要穿过一长串层雅可比矩阵的乘积,被打乱了。残差连接把每个块的输出加到它的输入上。于是梯度中包含一个直达每个块的恒等项(式 11.4),网络的行为在一定程度上像较浅路径的集成。代价是方差在块与块之间相加,若不加处理,每个块大约翻一倍;缩放分支、把分支初始化为零或对分支输入做归一化,都能控制这一点。批归一化在批上对每个单元做标准化,再用可学习的参数重新缩放;它让激活值保持在合适的范围内,使每一层对其权重的尺度不变,允许更大的学习率,并带来一点正则化噪声,但原论文对其成功的解释并没有得到支持。层归一化对每个样本做同样的事,是 Transformer 的选择。有了这些工具,上百层甚至更深的网络都能可靠地训练。第 12 篇把残差连接和层归一化与一种新的层——注意力——结合起来,构建 Transformer。

注释

无归一化网络。 精心地初始化和缩放残差分支,可以完全取代归一化。Fixup [10] 把每个分支的最后一层初始化为零,并重新缩放其他层,无需归一化就能训练有数千层的残差网络。后来的工作使用缩放后的权重标准化和自适应梯度裁剪,在 ImageNet 上不用任何归一化层就达到了批归一化网络的准确率 [18]。

权重归一化。 也可以不归一化激活值,而是归一化权重:把每个权重向量写成长度乘以单位方向,两者分别学习。这在不依赖批的情况下,得到了第 4 节的尺度不变性 [19]。

实践中的深度。 残差连接让深度变得可训练,但深度并不因此免费。非常深的残差网络常常不如代价相同、更宽更浅的网络准确,最佳深度要靠实验确定。He 等人在 CIFAR-10 上训练了一个 1,202 层的网络;它拟合了训练集,但测试误差比他们的 110 层网络高,他们把这归因于过拟合 [2]。

延伸阅读。 Understanding Deep Learning [1] 第 11 章讲解了残差网络、第 3 节的方差分析、批归一化以及第 1 节的破碎梯度。

练习

练习 11.1 对 (1,3,5,7)(1, 3, 5, 7) 施加批归一化(γ=1\gamma = 1,β=0\beta = 0,ϵ=0\epsilon = 0)。与第 4 节的例子比较,并解释结果。(答案:均值为 4,方差为 5,所以输出仍是 (−1.342,−0.447,0.447,1.342)(-1.342, -0.447, 0.447, 1.342);输入是那个例子的输入减 1,而批归一化会消去任何平移。)

练习 11.2 有 4 个块的残差网络中有多少条路径?其中恰好经过两个块的有多少条?(答案:24=162^4 = 16;(42)=6\binom{4}{2} = 6。)

练习 11.3 证明在 ϵ=0\epsilon = 0 时,对任意 a>0a > 0 和任意 cc,批归一化对 azi+ca z_i + c 的输出与对 ziz_i 的相同。(提示:均值变为 aμ+ca\mu + c,标准差变为 aσa\sigma。)

练习 11.4 如果 10 个残差分支中每一个增加的方差都与其输入的方差相同,方差增长多少倍?如果每个分支乘以 1/101/\sqrt{10} 呢?(答案:210=1,0242^{10} = 1{,}024;1.110≈2.591.1^{10} \approx 2.59。)

练习 11.5 对特征为 (1,2,3,6)(1, 2, 3, 6) 的一个样本施加层归一化(γ=1\gamma = 1,β=0\beta = 0,ϵ=0\epsilon = 0)。(答案:均值为 3,方差为 3.5,输出为 (−1.069,−0.535,0,1.604)(-1.069, -0.535, 0, 1.604)。)

练习 11.6 外层 512 个通道、内层 128 个通道的瓶颈残差块有多少个权重(不计偏置和归一化参数)?(答案:512×128+9×128×128+128×512=278,528512 \times 128 + 9 \times 128 \times 128 + 128 \times 512 = 278{,}528。)

练习 11.7 在一条有 100 个块、分支导数都等于 cc 的标量残差链中,分别对 c=0.01c = 0.01 和 c=−0.01c = -0.01 计算式 11.4 的乘积。(答案:1.01100≈2.701.01^{100} \approx 2.70 和 0.99100≈0.3660.99^{100} \approx 0.366。)

参考文献