
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)
例如,输入数据的形状是  
     
      
       
       
         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)
例如,输入数据的形状是  
     
      
       
       
         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 个均值和方差,分别对应每个样本。










