引言
上一节我们讨论了一个关键问题:权重初始值设得不好,深层网络寸步难行。为此,人们精心设计了 Xavier\text{Xavier}Xavier 和 He\text{He}He 初始值,只为让各层激活值分布保持适当的广度。但一个自然的追问是:能不能不去猜初始值,而是直接强制调整每一层的激活值分布?
批量归一化(Batch Normalization\text{Batch Normalization}Batch Normalization) 正是沿着这一思路诞生的。它由 Sergey Ioffe\text{Sergey Ioffe}Sergey Ioffe 和 Christian Szegedy\text{Christian Szegedy}Christian Szegedy 在 201520152015 年提出,问世不久便席卷了整个深度学习领域 ------ 几乎所有前沿模型都将 BN\text{BN}BN 作为标配。

Batch Norm\text{Batch Norm}Batch Norm 带来了三大核心收益:
| 收益 | 说明 |
|---|---|
| 加速训练 | 可以使用更大的学习率,收敛更快 |
| 降低对初始值的敏感度 | 不再需要小心翼翼地挑选初始化方案 |
| 抑制过拟合 | 自带轻微正则化效果,降低了对 Dropout\text{Dropout}Dropout 等方法的依赖 |
Batch Normalization\text{Batch Normalization}Batch Normalization 原理
神经元内部计算过程
一个神经元从输入到输出,经历两步:
1.1.1. 仿射变换:z=w1x1+w2x2+...+bz = w_1 x_1 + w_2 x_2 + \ldots + bz=w1x1+w2x2+...+b
2.2.2. 激活函数:a=σ(z)a = \sigma(z)a=σ(z)
神经网络的学习依赖于各层传递的值(即激活值 aaa)分布合理 ------ 不能全挤在两端(梯度消失),也不能全堆在一起(表现力受限)
问题出在 zzz 上
zzz 是仿射变换的结果,也就是激活函数的输入 ,zzz 的分布直接决定了激活值 aaa 的分布:
- zzz 太大或太小 ------ Sigmoid\text{Sigmoid}Sigmoid 饱和,σ(z)\sigma(z)σ(z) 趋近于 000 或 111,梯度消失
- zzz 全部集中在某个狭窄范围 ------ 激活值缺乏多样性
那是什么决定了 zzz 的分布?是权重 WWW
WWW 的初始化尺度直接影响 zzz 的均值和方差。Xavier\text{Xavier}Xavier 和 He\text{He}He 初始值就是通过精心设定 WWW 的尺度,来间接控制 zzz 的分布。但这种控制是间接且脆弱的 ------ 随着网络加深,zzz 的分布仍可能逐渐偏移
BN\text{BN}BN 的思路:不管 WWW 怎么初始化,直接把 zzz 拉回来
BN\text{BN}BN 的做法不再试图通过 WWW 初始化间接控制,而是在仿射变换之后、激活函数之前插入一个标准化层:
z=Wx+b→z^=z−μBσB2+ϵ→a=σ(z^) z = Wx + b \quad \rightarrow \quad \hat{z} = \frac{z - \mu_B}{\sqrt{\sigma_B^2 + \epsilon}} \quad \rightarrow \quad a = \sigma(\hat{z}) z=Wx+b→z^=σB2+ϵ z−μB→a=σ(z^)
BN\text{BN}BN 标准化的是激活函数的输入 zzz ,而不是权重 WWW 或激活函数的输出 aaa。

这样做的好处是:无论 WWW 的初始值是 0.010.010.01 还是 111,无论前一层输出的数值尺度如何,每一层激活函数前的 zzz 都被强制固定在均值为 000、方差为 111 的分布。这就从根源上解决了权重初始化敏感的问题。
但标准化只是把分布限制成标准正态,这本身也是一种约束 ------ 如果激活函数恰好需要非零均值、非单位方差的输入才能发挥最佳性能,强行标准化反而限制了表达能力。因此,BN\text{BN}BN 在标准化之后又增加了两个可学习参数 γ\gammaγ 和 β\betaβ:
y=γz^+β y = \gamma \hat{z} + \beta y=γz^+β
让网络自己决定最合适的分布形态:初始时 γ=1\gamma=1γ=1、β=0\beta=0β=0 维持标准化效果,训练中根据任务需要自动调整。
标准化:强制归零归一
具体的,设 mini-batch\text{mini-batch}mini-batch 中有 mmm 个样本,对该批数据在第 ddd 维上的值 B={x1,x2,...,xm}B = \{x_1, x_2, \ldots, x_m\}B={x1,x2,...,xm}:
μB=1m∑i=1mxi(批次均值)σB2=1m∑i=1m(xi−μB)2(批次方差)x^i=xi−μBσB2+ϵ(标准化,ϵ 是微小值,防止除以零的情况) \begin{aligned} \mu_B = \frac{1}{m} \sum_{i=1}^{m} x_i \quad \text{(批次均值)} \\ \sigma_B^2 = \frac{1}{m} \sum_{i=1}^{m} (x_i - \mu_B)^2 \quad \text{(批次方差)}\\ \hat{x}_i = \frac{x_i - \mu_B}{\sqrt{\sigma_B^2 + \epsilon}} \quad \text{(标准化,}\epsilon\text{ 是微小值,防止除以零的情况)} \end{aligned} μB=m1i=1∑mxi(批次均值)σB2=m1i=1∑m(xi−μB)2(批次方差)x^i=σB2+ϵ xi−μB(标准化,ϵ 是微小值,防止除以零的情况)
这一步,先求均值 μB\mu_BμB 和方差 σB2\sigma_B^2σB2,再将数据分布调整为均值为 000、方差为 111 的正规化
就像是把各种歪歪扭扭的分布一把拉到同一个基准线上,保证每层收到的数据不会太分散也不会太集中。
缩放与平移:恢复表达能力
标准化虽然统一了分布,但也限制了数据的表达范围 ------ 如果每一层都被强制限制在标准正态分布,网络的表达能力反而会受到削弱。
因此,BN\text{BN}BN 在标准化之后引入了两个可学习参数:γ\gammaγ (缩放)和 β\betaβ (平移),让网络自己决定最合适的分布形态。
yi=γx^i+β y_i = \gamma \hat{x}_i + \beta yi=γx^i+β
- 初始时 γ=1\gamma=1γ=1,β=0\beta=0β=0,即维持标准化后的分布
- 随着训练推进,γ\gammaγ 和 β\betaβ 通过学习自动调整到最优值
标准化是"强制管教" ------ 把每层数据都被拉到同一基准线
γ\gammaγ 和 β\betaβ 是"给予自由" ------ 让网络仍能学到最适合当前任务的数据分布
计算图
整个 Batch Norm\text{Batch Norm}Batch Norm 的正向传播可以表示为一个计算图,包含均值计算、方差计算、标准化、缩放平移四个步骤。

反向传播的数学推导较为复杂,具体可参考 Frederik Kratzert\text{Frederik Kratzert}Frederik Kratzert 的博客"Understanding the backward pass through Batch Normalization Layer\text{Understanding the backward pass through Batch Normalization Layer}Understanding the backward pass through Batch Normalization Layer"获取详细推导过程
BN\text{BN}BN 层插入位置
Batch Norm\text{Batch Norm}Batch Norm 层通常插入在 Affine\text{Affine}Affine 层(全连接或卷积层)之后、激活函数之前,即:

关于应该放在激活函数之前还是之后,学术界有过不少讨论和实验,目前的标准实践是放在激活函数之前
Batch Normalization\text{Batch Normalization}Batch Normalization 评估
学习速度对比
用 MNIST\text{MNIST}MNIST 数据集进行实验,对比加入 BN\text{BN}BN 前后的学习曲线:

- 使用 Batch Norm\text{Batch Norm}Batch Norm:训练准确率快速攀升,短时间内达到较高精度
- 不使用 Batch Norm\text{Batch Norm}Batch Norm :准确率上升缓慢,需要更多 epoch\text{epoch}epoch 才能追平
结论很直观:加入 BN\text{BN}BN 后,学习速度显著加快。
对初始值的鲁棒性
更有说服力的实验是------用不同标准差初始化权重,观察有无 BN\text{BN}BN 的表现:


- 不使用 BN\text{BN}BN:初始值标准差太大或太小,学习完全无法进行;只有精心挑选的初始值才能正常收敛
- 使用 BN\text{BN}BN:无论初始值标准差如何,学习都能顺利进行,且速度相近
这说明 BN\text{BN}BN 让网络对权重初始值不再"神经质" ------ 即使初始值设得不太理想,BN\text{BN}BN 也能自动将数据分布调整到合适范围,让训练稳定推进
参考文献:
1 斋藤康毅. 深度学习入门:基于Python的理论与实现M. 陆宇杰, 译. 北京: 人民邮电出版社, 2018.