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 是为了能还原成最初的输入,与之前的网络层解耦。
算法流程

原理
[[前向和反向传播]]
[[维度理解]]
如何得到预测时 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]]

- [[Identity Mappings in Deep Residual Networks]]
- BN-ReLU
- 特点 → BN 后输入数据更接近 0 均值,或减轻数据落入负区间梯度消失现象,或更好展现 ReLU 的单侧抑制作用进行特征选择
- ReLU-BN
- 特点 → 激活后再 Norm,保证下一层的输入是零均值的。
[[多卡同步]]
[[Batch Normalization 为何有效]]
[[Ref]]
网络回响
Batch Normalization