Normalization(BN and LN) in NN

Normalization(BN and LN) in NN_第1张图片

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 μBm1i=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) σB2m1i=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 个均值和方差,分别对应每个样本。

你可能感兴趣的:(人工智能,深度学习)