转自知乎详解深度学习中的Normalization,BN/LN/WN,仅供自己学习记录,如有侵权,请联系删除
通用公式:
h = f ( g ⋅ x − μ σ + b ) h=f\left(\mathbf{g} \cdot \frac{\mathbf{x}-\mu}{\sigma}+\mathbf{b}\right) h=f(g⋅σx−μ+b)
BN
μ = 1 M ∑ x i \mu=\frac{1}{M} \sum x_{i} μ=M1∑xi
σ = 1 M ∑ ( x i − μ i ) 2 + ϵ \sigma=\sqrt{\frac{1}{M} \sum\left(x_{i}-\mu_{i}\right)^{2}+\epsilon} σ=M1∑(xi−μi)2+ϵ
其中, M M M是batch大小, g {g} g和 b {b} b是可训练的参数初始化为1和0。
BN比较适用的场景是:
每个 mini-batch 比较大,数据分布比较接近。在进行训练之前,要做好充分的 shuffle. 否则效果会差很多。
缺点在于:
- 如果每个 mini-batch的原始分布差别很大,那么不同 mini-batch 的数据将会进行不一样的数据变换,这就增加了模型训练的难度。
- 不适用于 动态的网络结构 和 RNN 网络
详情见 https://blog.csdn.net/ltochange/article/details/119871517
LN
μ = ∑ i x i \mu=\sum_{i} x_{i} μ=i∑xi
σ = ∑ i ( x i − μ ) 2 + ϵ \sigma=\sqrt{\sum_{i}\left(x_{i}-\mu\right)^{2}+\epsilon} σ=i∑(xi−μ)2+ϵ
其中, x i x_{i} xi 枚举了该层所有的输入神经元。对应到标准公式中,四大参数 μ \mu μ和 σ \sigma σ, g {g} g和 b {b} b均为标量(BN中是向量),所有输入共享一个规范化变换。
优点:
- LN 针对单个训练样本进行,不依赖于其他数据,因此可以避免 BN 中受 mini-batch 数据分布影响的问题,可以用于 小mini-batch场景、动态网络场景和 RNN,特别是自然语言处理领域。
- LN 不需要保存 mini-batch 的均值和方差,节省了额外的存储空间。
缺点:
LN 对于一整层的神经元训练得到同一个转换
所有的输入都在同一个区间范围内。如果不同输入特征不属于相似的类别(比如颜色和大小),那么 LN 的处理可能会降低模型的表达能力。