关于BN(batch normalization)层
# 关于BN(batch normalization)层
在DNN,RNN等网络中,有三种操作BN、WN、LN分别是Batch Normalization、Weight Normalization和Layer Normalization。
首先详解DNN中最常见的BN操作
# 1. 执行BN层的目的
# 1.1 Internal Covariate Shift(ICS)现象
首先给出原作者提出的ICS定义:
在深层网络训练的过程中,由于网络中参数变化而引起内部结点数据分布发生变化的这一过程被称作Internal Covariate Shift。
这样说很抽象,先回到一个网络本身开始说明问题。
图片来自知乎用户@天雨栗,见右下角水印
上图是一个常见的DNN模型,随着左侧输入参数向右侧传递,会产生两件事:
- 浅层网络发生微弱变化时,反应在深层网络后变化会加剧
- 参数变化时,参数变化会导致每一层的输入发生变化,而上层网络就需要不断适应这些变化。模型训练就会变得越来越困难。
这些现象就叫做Internal covariate shift。
利用公式描述ICS现象:
定义每一层的线性变换为$Z^l = W^l \times input + b^l$, 其中$l$是层数。再定义非线性变换为$A^l = g^l(Z^l)$。当梯度下降进行时,参数发生变化,即$W$和$b$会发生变化,进而导致$Z^l$发生变化,在非线性变换后$A^l$也会发生改变。而$A^l$是下一层的输入,因此下一层也要去适应这些变化。
# 1.2 ICS现象带来的问题
# 1.3 ICS问题的解决思路
ICS是网络参数变化导致下一层的输入分布发生了变化。这样一来,解决思路有明显的两条:
- 让网络参数不要变化
- 让下一层输入不要变化
显然,让网络参数不要变化是不可能的,要不然网络还训练什么。所以思路就是让下一层的输入分布不要变化了。也就是在每层输出后,加上一个操作,让下一层的输入分布保持在一个相对稳定的区间内。
就是为了执行这个稳定每一层输入的操作,人们有了两种解决方法:
# 1.3.1 白化(whitening)
白化操作是机器学习里的一种方法,它为了实现两个目的:
- 使输入特征的分布具有相同的均值和方差
- 去除特征的相关性
这种操作确实解决了ICS问题,但是也伴随着另外两个问题:
- 计算成本太高。对于简单的机器学习可以,但是对于每一层都需要操作的DNN,这种操作的成本太高。
- 白化过程改变了每一层数据的分布,进而改变了特征的表达。比如PCA白化会保证所有特征分布的均值为0,方差为1,这显然会强行扭转原有的均值和方差特征。
为了解决上述的问题,也就是解决两个痛点,简化运算+保留特征,有人就提出了Batch Normalization的操作。
# 1.3.2 Batch Normalization
借用白化操作的思路,这里的方法就是:
- 白化操作保证了所有特征同均值同方差,而BN就只保证每个特征,这样就可以简化操作。
- 由于白化操作改变了原有的分布,降低了原有的表达能力,因此要追加一个线性变换操作,让数据恢复本身的表达能力。
# 2. BN的执行细节
# 参考
[1] https://zhuanlan.zhihu.com/p/34879333