Batch Normalization

缓解神经网络“内部协方差漂移”([[Internal Covariance Shift]], ICS)

对每个隐藏层输入进行 0-1 标准化

神经网络本身是为了学习数据的分布,如果训练集和测试集分布不同,会导致学习的神经网络泛化性能大大降低

网络每次迭代需要拟合不通的数据分布,增大训练的复杂度以及过拟合的风险。

对输入的数据分布进行额外的约束,从而增强模型的泛化能力,但也降低了模型的拟合能力

[[covariate shift]] 源空间和目标空间的条件概率是一致的,但是其边缘概率不同。神经网络的各层输出由于层内操作,其分布显然与各层对应的输入信号分布不同。

在神经网络训练时遇到收敛速度很慢,或者梯度爆炸等无法训练时可以尝试使用。

batch_mean, bacth_var = tf.nn.moments(data, [0]) 求 data 数据的每一列的均值和方差

tf.nn.batch_normalization(data, mean, variance, offset, scale, variance_epsilon, name=None)

  • offset 和 scale 是参数,分别初始化为 0 和 1

批归一化也会降低模型的拟合能力,比如 sigmoid 激活函数中,批量归一化后数据整体处于函数的非饱和区,破坏之前学到的连接权重。引入 offset 和 scala 是为了能还原成最初的输入,与之前的网络层解耦。

μi=1Mxi,σi=1M(xiμi)2+ϵ\mu_{i}=\frac{1}{M} \sum x_{i}, \quad \sigma_{i}=\sqrt{\frac{1}{M} \sum\left(x_{i}-\mu_{i}\right)^{2}+\epsilon}

算法流程
image.png

原理

[[前向和反向传播]]

[[维度理解]]

如何得到预测时 BN 层使用的均值和方差?

为什么BN层一般用在线性层和卷积层后面,而不是放在非线性单元后

  • BN 层希望得到 {{c1 0-1 高斯分布}} 的数据
  • 非线性单元之后的数据分布 {{c1 不一定对称}}
  • 实践中 BN 放在 ReLU 后面 #card
    • Normalization 一般是在输入层之前对数据处理,Batch-Normalization 可以视作对传给隐藏层的输入的normalization。
  • 放在 tanh 或 sigmoid 之前,可以 {{c1 避免进入饱和区,缓解梯度衰减问题}}。

BN 和 [[ReLU]] 的顺序关系?

  • [[ResNet]]Skip -> BN -> RELU -> Conv -> BN -> RELU -> Conv -> Add
    • [[Identity Mappings in Deep Residual Networks]]
      image.png
  • BN-ReLU
    • 特点 → BN 后输入数据更接近 0 均值,或减轻数据落入负区间梯度消失现象,或更好展现 ReLU 的单侧抑制作用进行特征选择
  • ReLU-BN
    • 特点 → 激活后再 Norm,保证下一层的输入是零均值的。

[[多卡同步]]

[[Batch Normalization 为何有效]]

[[Ref]]

网络回响

作者

Ryen Xiang

发布于

2026-02-17

更新于

2026-02-17

许可协议


评论