Batch Normalization
称为批标准化。批是指一批数据,通常为 mini-batch;标准化是处理后的数据服从 N ( 0 , 1 ) N(0,1) N(0,1) 的正态分布。在训练过程中,数据需要经过多层的网络,如果数据在前向传播的过程中,尺度发生了变化,可能会导致梯度爆炸或者梯度消失,从而导致模型难以收敛。
假设输入的 mini-batch 数据是 B = x 1 . . . x m B={x_1...x_m} B=x1...xm,Batch Normalization 的可学习参数是 γ , β \gamma, \beta γ,β,步骤如下:
- 求 mini-batch 的均值: μ B ← 1 m ∑ i = 1 m x i \mu_B\gets \frac{1}{m} {\textstyle \sum_{i=1}^{m}}x_i μB←m1∑i=1mxi
- 求 mini-batch 的方差: σ B 2 ← 1 m ∑ i = 1 m ( x i − μ B ) \sigma_B^2\gets \frac{1}{m} {\textstyle \sum_{i=1}^{m}}(x_i-\mu _B) σB2←m1∑i=1m(xi−μB)
- 标准化: x i ^ ← x i − μ B σ B 2 + ϵ \widehat{x_i} \gets \frac{x_i-\mu_B}{\sqrt{\sigma_B^2+\epsilon } } xi ←σB2+ϵxi−μB,其中 ϵ \epsilon ϵ 是防止分母为 0 的一个数。
- affine transform(缩放和平移):
y
i
←
γ
x
i
^
+
β
≡
B
N
r
,
β
(
x
i
)
y_i\gets \gamma \widehat{x_i} +\beta\equiv BN_{r,\beta}(x_i)
yi←γxi
+β≡BNr,β(xi),这个操作可以增强模型的 capacity,也就是让模型自己判断是否要对数据进行标准化,进行多大程度的标准化。如果
γ = σ B 2 , β = μ B \gamma=\sqrt{\sigma_B^2}, \beta=\mu_B γ=σB2,β=μB,那么就实现了恒等映射(前三步做标准化
,这步做标准化的反变换
)。
Batch Normalization 层一般在激活函数前一层。
在 PyTorch 中,有 3 个 Batch Normalization 类:
- nn.BatchNorm1d(),输入数据的形状是 B × C × 1 D f e a t u r e ( L ) B \times C \times 1D feature(L) B×C×1Dfeature(L) :length
- nn.BatchNorm2d(),输入数据的形状是 B × C × 2 D f e a t u r e ( H × W ) B \times C \times 2D feature(H \times W) B×C×2Dfeature(H×W) :hight, weight
- nn.BatchNorm3d(),输入数据的形状是 B × C × 3 D f e a t u r e ( T × H × W ) B \times C \times 3D feature(T \times H \times W) B×C×3Dfeature(T×H×W) :time, hight, weight
torch.nn.BatchNorm1d(num_features, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
num_features:一个样本的
特征维度C
,这个参数最重要
eps:在进行标准化操作时的分布修正项
momentum:指数加权平均估计当前的均值和方差
affine:是否需要 affine transform,默认为 True
track_running_stats:True 为训练状态,此时均值和方差会根据每个 mini-batch 改变。False 为测试状态,此时均值和方差会固定
例如,输入数据的形状是
B
×
C
×
2
D
f
e
a
t
u
r
e
B \times C \times 2D feature
B×C×2Dfeature,(3, 2, 2, 2, 3),表示一个 mini-batch 有 3 个样本,每个样本有 2 个特征
,每个特征的维度是 2 x 2 x3。那么就会计算 2 个均值和方差,分别对应每个特征维度。momentum 设置为 0.3,第一次的均值和方差默认为 0 和 1。输入两次 mini-batch 的数据。
Layer Normalization
提出的原因:Batch Normalization 不适用于变长的网络,如 RNN
思路:每个网络层计算均值和方差, γ \gamma γ和 β \beta β 为逐样本的可学习参数。
torch.nn.LayerNorm(normalized_shape, eps=1e-05, elementwise_affine=True)
normalized_shape:该层每个样本特征的形状,可以取 C × H × W C \times H \times W C×H×W、 H × W H \times W H×W、 W W W
eps:标准化时的分母修正项
elementwise_affine:是否需要逐个样本 affine transform
例如,输入数据的形状是
B
×
C
×
f
e
a
t
u
r
e
B \times C \times feature
B×C×feature,(8, 2, 3, 4),表示一个 mini-batch 有 8 个样本
,每个样本有 2 个特征,每个特征的维度是 3 x 4。那么就会计算 8 个均值和方差,分别对应每个样本。