本文目录导读:

BatchNorm(Batch Normalization,批归一化)是深度学习中一项非常重要的技术,主要用于解决训练深层神经网络时的内部协变量偏移问题。
它的核心作用是让每一层的输入数据分布保持稳定,具体作用可以拆解为以下几点:
加速训练收敛
- 问题:在深层网络中,前一层的参数更新会导致后一层的输入分布发生变化(内部协变量偏移),这意味着后一层需要不断适应新的分布,导致训练缓慢。
- 解决方案:BatchNorm强制将每层的输出(在激活函数之前)拉回到一个标准的正态分布(均值为0,方差为1),这样,无论前一层怎么变,这一层看到的输入分布都差不多,模型可以更快地学习。
允许使用更大的学习率
- 问题:如果没有归一化,某个神经元输出的值可能非常大或非常小,导致梯度爆炸或梯度消失,使用大学习率会加剧这种不稳定。
- 解决方案:由于BatchNorm将数据限制在0附近,梯度通常处于非饱和区域(比如Sigmoid函数的中间线性段),避免梯度消失,输出值的范围被限制,不会出现极端的数值,因此可以放心使用更高的学习率,进一步加速训练。
缓解过拟合(轻微的正则化效果)
- 原理:在训练时,BatchNorm会使用当前Mini-batch的均值和方差进行归一化,由于每个Batch的数据分布略有不同(存在一定的随机噪声),这相当于给网络加入了一些随机扰动。
- 效果:这种随机性类似于Dropout,可以防止模型对训练数据中的特定模式过于敏感,从而起到轻度的正则化作用,不要完全依赖它替代Dropout或L2正则化。
减弱对初始化的依赖
- 问题:在没有BatchNorm的年代,参数初始化非常讲究(如Xavier初始化、He初始化),稍有不慎网络就无法收敛。
- 解决方案:有了BatchNorm,即使初始化不是最优,网络依然可以通过归一化保证数据分布的合理,让训练相对“容错”一些。
具体工作原理
BatchNorm核心是两步:归一化 + 缩放平移。
-
对输入进行归一化: 对于某个Mini-batch(大小为 ( m )),计算该Batch的均值 ( \mu_B ) 和方差 ( \sigma^2_B ),然后进行归一化: [ \hat{x}_i = \frac{x_i - \mu_B}{\sqrt{\sigma^2_B + \epsilon}} ] ((\epsilon) 是一个很小的数,防止分母为0)
-
引入可学习的参数:
- 如果只做归一化,会把数据限制死在0附近,这会降低网络的表达能力(比如把Sigmoid函数限制在线性区,丧失了非线性能力)。
- BatchNorm还引入了两个可学习的参数:缩放因子 (\gamma) 和 偏移因子 (\beta)。
- 最终输出: [ y_i = \gamma \hat{x}_i + \beta ]
- 网络自己学习:(\gamma = \sqrt{\sigma^2_B}) 且 (\beta = \mu_B),那就恢复成原始输入,没有什么损失;如果学习成别的值,那就是网络自己决定一个更优的数据分布。
训练 vs 推理
- 训练时:使用当前Mini-batch的均值和方差。
- 推理时:不能依赖Batch的数据(因为推理时可能Batch size=1),所以使用滑动平均记录下的全局均值和方差(即整个训练集的统计量)。
| 作用 | 通俗解释 |
|---|---|
| 加速训练 | 稳定了数据分布,让模型更好学。 |
| 解决梯度问题 | 把数据拉到非饱和区,避免梯度消失/爆炸。 |
| 放大学习率 | 数值稳定,不怕大学习率。 |
| 轻度正则化 | Batch随机性带来噪声,防止过拟合。 |
| 不用费心调初始值 | 网络能自己调整回合适分布。 |
注意:BatchNorm主要适用于计算机视觉(CNN) 和固定深度的全连接网络,在RNN/LSTM中,由于序列长度不定,通常用LayerNorm(层归一化)代替,在Transformer中,也多用LayerNorm。