【研究生学习】深度学习中常用的Normalization方法与其Pytorch的调用
本篇博客记录一下在深度学习中常用的Batch Normalization和Layer Normalization方法的基本原理,参考的资料的链接如下:
详解深度学习中的Normalization,BN/LN/WN
NLP中 batch normalization与 layer normalization
【深度学习】batch normalization和layer normalization区别
模型优化之Layer Normalization
独立同分布的数据可以简化常规机器学习模型的训练,提升机器学习模型的预测能力,因此把数据喂给机器学习模型之前,白化是一个重要的数据预处理步骤,其一般包含两个目的,一个是去除特征的相关性,另一个是使得所有特征具有相同的均值和方差
而在深度学习中,神经网络涉及到很多层的叠加,而每一层的参数更新会导致上一层的输入数据分布发生变化,通过层层叠加,高层的输入分布变化会非常剧烈,这就使得高层需要不断去重新适应底层的参数更新,这一现象被称为Internal Covariate Shift。而Normalization方法就是从数据的分布上进行处理,使得每层的输入数据分布范围可控
Batch Normalization
Batch Normalization是对一批样本的同一维度特征做归一化
令batch_size为m,则在一个mini batch中的值为$ B={x_{1...m}} $,γ和β是待学习的参数,则整个Batch Normalization的过程计算如下:
输出为:
mini-batch mean:$ \mu_B=\frac{1}{m}\sum_{i=1}^mx_i $
mini-batch variance:$ \sigma^ 2_B=\frac{1}{m}\sum_{i=1}^m(x_i-\mu_B) ^ 2 $
normalize:$ \hat{x_i}=\frac{x_i-\mu_B}{\sqrt{\sigma^2_B+\epsilon}} $
scale and shift:$ y_i=\gamma\hat{x_i}+\beta $
可见共有两个步骤:
- 标准化
- 尺度变换和偏移:获得新的分布\(y_i\),均值为β,方差为,这些都是需要学习的参数
Layer Normalization
Layer Normalization是对单个样本的所有维度特征做归一化
Batch Normalization和Layer Normalization的比较
关于Batch Normalization和Layer Normalization的比较(以下简称为BN和LN),下面这张图片是比较经典的:
其中N是batch size,C是通道数,H,W是特征的空间维度
在NLP中,N可以代表有N句话,C代表一句话的长度,H,W可以代表词向量的维度,假如词向量的维度为100(即立方体的高),batch size为64(即立方体中的N),则BN和LN分别计算如下:
- BN:固定每句话的第一个位置,则这个切片是(64,100)维度的矩阵
- LN:固定一句话,则切片是(一个句子的长度,100)维度的矩阵
BN取出一条(1,64)的向量并进行缩放,LN则取出一条(1,100)的向量进行缩放
BN和LN都可以较好地抑制梯度消失和梯度爆炸的情况,但是BN不适合RNN、Transformer等序列网络
Pytorch调用几种Normalization方法
这里的Pytorch
torch.nn.BatchNorm2d
torch.nn.LayerNorm
torch.nn.InstanceNorm2d