Normalization in DL
归一化
注意:归一化
与 标准化
不是同一个概念。
为什么要进行归一化?
- 去除不同特征之间由于单位不同导致的差别(比如身高用m,体重用kg)。
归一化的作用
归一化的方法
min-max
z score
应用场景说明
概率模型不需要归一化,因为这种模型不关心变量的取值,而是关心变量的分布和变量之间的条件概率。
SVM、线性回归之类的最优化问题需要归一化,是否归一化主要在于是否关心变量取值。
神经网络需要标准化处理,一般变量的取值在 $ -1 $ 到 $ 1 $ 之间,这样做是为了弱化某些变量的值较大而对模型产生影响。一般神经网络中的隐藏层采用tanh激活函数比sigmod激活函数要好些,因为tanh双曲正切函数的取值 $ [-1,1] $ 之间,均值为 $ 0 $ 。
在 K 近邻算法中,如果不对解释变量进行标准化,那么具有小数量级的解释变量的影响就会微乎其微。
参考
Batch Normalization
传统的归一化方法:白化。但是有不足:
计算量非常大(第一步进行
PCA
)。不是处处可微的,所以不能在神经网络中使用。
这种单纯的归一化可能会破坏掉某一层网络学到的特征。
这些原因导致无法用到
DNN
中。
Batch Normalization:即在每次
SGD
时,通过 mini-batch 来对相应的 activation 做规范化操作,使得输出信号各个维度的均值为 $ 0 $ ,方差为 $ 1 $ 。而最后的scale and shift
操作则是为了让因训练所需而“刻意”加入的BN
能够有可能还原最初的输入(即当),从而保证整个 network 的 capacity。(有关 capacity 的解释:实际上BN
可以看作是在原模型上加入的“新操作”,这个新操作很大可能会改变某层原来的输入。当然也可能不改变,不改变的时候就是“还原原来输入”。如此一来,既可以改变同时也可以保持原输入,那么模型的容纳能力(capacity)就提升了。)BN
相当于弄了一个可以 学习 的归一化层,这种“学习”体现在:如果网络认为不需要对这一层的输出做归一化,可以通过 $ \beta $,$ \gamma $ 来控制归一化后的结果和原始的输出相近似。$ \beta $,$ \gamma $ 起到了 de-normalization 的作用。如果不用 $ \beta $,$ \gamma $ 的话,就只是单纯的做了归一化,此时网络无法把归一化的特征转化回去(这层学到的、一化之前的特征),此时就已经不是
BN
了。BN
本质上解决的是反向传播过程中的梯度问题。把得到的特征进行 “零均值, $ 1 $ 方差”,相当于把数据压缩到了原点为中心,此时对于
sigmoid/tanh
,梯度是比较大的时候。BN
有一种理解是每个 batch 的均值和方差由于 shuffle 都会改变,所以可以理解做了一种数据增强。参考1,参考2BN
放在激活函数的前面还是后面,没有一个确定的答案。(原论文中提到放到激活函数的前面,ResNet
的改进版本也是放到了激活函数的前面。)BN
存在的问题:BN
的优势在batch size > 32/64
的时候才会凸显出来。BN
在 image to image translation 中,必须不能区分 train 和 test 阶段,否则效果很差。BN
在 classification 当中的效果较好,主要原因是因为 classification 对于 scale 不敏感。但是 superresolution 这样图片到图片的变换,per image 的 scale 还是一个有效信息。
BN
无法用到RNN
中因为本质上
BN
是对每个神经元/卷积核
单独做 normalization,应用到RNN
的环境中,就是在每个 time step 都需要进行BN
,这就会浪费很大的计算资源和存储资源。使得网络更为复杂,更难训练。所以导致无法用到RNN
中。(并不是不能用到RNN
中,而是用了之后效果可能不好。参考:CNN和RNN中如何引入BatchNorm - CSDN博客)在每次迭代中引进了随机性,使梯度增加了 noise,这一点使得
BN
对于 generative model(例如 lstm 网络)或者 reinforcement learning(例如 DQN )都是不适用的。
Batch Normalization 基于一个mini batch的数据计算均值和方差,而不是基于整个Training set来做,相当于进行梯度计算式引入噪声。因此,Batch Normalization不适用于对噪声敏感的强化学习、生成模型(Generative model:GAN,VAE)使用。相反,Weight Normalization对通过标量g和向量v对权重W进行重写,重写向量v是固定的,因此,基于Weight Normalization的Normalization可以看做比Batch Normalization引入更少的噪声。<深度学习优化策略-3> 深度学习网络加速器Weight Normalization_WN
参考
Layer Normalization
同一层的所有神经元(卷积核)得到的 feature map 进行归一化。
BN
是对同一个神经元(卷积核)在不同的样本得到的 feature map 进行归一化。这里一层网络共享一个均值和方差,不同训练样本对应不同的均值和方差,这是和
BN
的最大区别。参考1LN
针对单个训练样本进行,不依赖于其他数据,因此可以避免BN
中受 mini-batch 数据分布影响的问题,可以用于小 mini-batch 场景、动态网络场景和RNN
,特别是自然语言处理领域。此外,LN
不需要保存 mini-batch 的均值和方差,节省了额外的存储空间。但是,
BN
的转换是针对单个神经元可训练的——不同神经元的输入经过再平移和再缩放后分布在不同的区间,而LN
对于一整层的神经元训练得到同一个转换——所有的输入都在同一个区间范围内。如果不同输入特征不属于相似的类别(比如颜色和大小),那么LN
的处理可能会降低模型的表达能力。参考1
Instance Normalization
在
image-to-image translation
(Super resolution,Style transfer)、GAN
等任务中,BN
的效果并不好(比如:CycleGAN
,DualGAN
中使用的BN
没有区分训练和测试阶段)。使用BN
的时候,如果测试阶段设置is_training=False
,生成的图片是噪点,设置成is_training=True
,可以得到和IN
相近的效果。IN
可以理解成为每个图片自己做BN
,这样比BN
能保留更多scale信息。更新的研究表明如果训练收敛不是问题的话,进一步去掉IN
的效果也会更好。参考
参考
对比:BN vs LN vs IN
上图的
C
可以看成是某一层中神经元的数目(对于FC
)或卷积核的数目(对于CNN
)。一开始z轴方向的
H,W
看不懂什么意思,其实这里可以理解为H*W
。这种设计很合理:对于FC
,垂直于C
的一个纵列可以看做是某个神经元的输出向量;对于CNN
,垂直于C
的一个纵列可以看成把某一个feature map
拉伸后得到的一个向量。Batch Normalization
是对某一个隐藏层中的 每一个 神经元/卷积核的输出(即垂直于C
的每一列)单独(即不同神经元/卷积核的输出之间不会有关联,这里是相对于LN
所说的)做cross sample
的normalization。Layer Normalization
是对某一个隐藏层中的 所有 神经元/卷积核的输出(即垂直于C
的每一列)一起 做。Instance Normalization
是对某一个隐藏层中的 每一个 神经元/卷积核的输出(即垂直于C
的每一列)单独(即不同神经元/卷积核的输出之间不会有关联,这里是相对于LN
所说的)做 normalization。(这里和Batch Normalization
最像,相当于去掉了cross sample
的BN
)
Conditional Batch Normalization
相对于
BN
,这里的mean
和variance
不再是通过计算训练数据集得到,而是采用类似于 word embedding 的方式训练一个 lookup table,然后查表得到mean
和variance
。实验效果比传统的
Conditional GAN
的效果好(传统的方法:把 condition 信息和Generator/Discriminator
的feature map
进行concat)。Conditional GAN
更好的方法:cGANs with Projection Discriminator (Generator
用的是Conditional Batch Normalization
来引入 condition 信息,没有使用 concat)。