Normalization-归一化是数据处理多不开的技术,那么这个东西究竟是干吗用的呢?
Normalization就是把数据特征缩放到相同的范围,通常是均值为0,方差为1的标准正态分布。
为什么要把数据缩放到较小的范围呢?
减少数据的噪声以及异常值影响。
避免梯度消失/爆炸。激活函数的导数通常都在0到1之间,因此在反向传播过程中,梯度可能会因为连乘效应而变得非常小(梯度消失)或非常大(梯度爆炸)。通过对输入数据进行归一化处理,可以使得神经网络中的激活值分布更加均匀,减少梯度消失/梯度爆炸的问题
防止个别特征数值过大,引起模型过度关注导致的过拟合现象。
便于比较不同的特征。不同特征的含义会导致他取值数量级的不同,所以将特征缩放到统一范围内会更方便进行特征的比较。
便于比较相同的特征。相同的特征在不同的取样组内会具有不同的取值范围,比如工资。所以将特征缩放到统一范围内方便同一特征在不同组别内进行比较。
.......
总之Normalization就是好,有事没事搞一搞。
那问题来了,花样Normalization应该使用哪一个?
Batch Normalization(BN)
对每个batch的数据进行归一化。
BN实际使用时需要计算并且保存某一层神经网络batch的均值和方差等统计信息,对于对一个固定深度的前向神经网络(DNN,CNN)使用BN,很方便;但对于RNN来说,sequence的长度是不一致的,换句话说RNN的深度不是固定的,不同的time-step需要保存不同的statics特征,可能存在一个特殊sequence比其他sequence长很多,这样training时,计算很麻烦。
缺点:
batchsize的大小比较敏感,由于每次计算均值和方差是在一个batch上,所以如果batchsize太小,则计算的均值、方差不足以代表整个数据分布
使用范围:
BN实际使用时需要计算并且保存某一层神经网络batch的均值和方差等统计信息。
适用:DNN,CNN(固定深度前向网络)
不适用:RNN(深度不固定)
Layer Normalization
对每个样本进行归一化,不依赖batch大小。
LN中同层神经元输入拥有相同的均值和方差,不同的输入样本有不同的均值和方差
LN不依赖于batch的大小RNN和输入sequence的深度,因此可以用于batchsize为1和RNN中对边长的输入sequence的normalize操作。
使用范围:
适用:RNN
不适用:CNN
Instance Normalization
在每个样本上进行归一化,而不是在每个批次或每个层上进行归一化。
可以避免样本之间的数据分布差异导致的训练问题,可以提高图像生成任务的性能和稳定性,并且可以适用于各种图像生成模型,包括生成对抗网络(GAN)、变分自编码器(VAE)等。
使用范围:
适用:图像生成任务,例如风格迁移、图像翻译等任务
Group Normalization
将特征分成若干组,对每组特征进行归一化处理,从而降低了对批次大小的依赖,适用于小批次训练和大规模并行训练。
优点:
a. 对批次大小不敏感,与BN和LN不同,GN将特征分成若干组,对每组特征进行归一化处理,因此不需要依赖于批次大小,可以适用于小批次训练和大规模并行训练。
b. 适用于多尺度输入,GN可以适用于多尺度输入的深度学习模型,例如图像分类、目标检测和语义分割等任务。
c. 稳定性更好,GN可以减少模型中的内部协变量偏移问题,从而提高模型的稳定性和泛化性能。
d. 计算速度更快,与BN相比,GN的计算速度更快,因为对于每个特征,只需要计算其所在组的均值和方差。