-
Batchnormalization
批量标准化
深度学习有个本质性的问题:随着网络深度加深,训练起来困难,本质是反向传播的时候梯度消失。
比如我们看sigmoid函数
图源百度百科
显而易见的就是在大于4的时候,函数已经变化非常平缓了,也就是再训练下去就要梯度消失了。在训练的时候,非线性映射后,特征数据会逐渐向激活函数的输出区间的上下两端靠近,此时BN就是对这些逐渐向饱和区冲过去的数据拉回来。拉回到均值为0,方差为1的正态分布。使得输入神经元的数据可以进入到激活函数比较敏感的区域。
那BN又要怎么做呢
步骤如下
先求这一批数据的均值,然后求出方差,将其标准化,最后再做一个扩展和平移。扩展和平移的参数 和
是网络学习得到的。
我一直不是很明白这个 和
的作用。
有人这样说:会与其他待训练参数一同被训练化,使标准正态分布后的特征数据通过缩放因子和偏移因子,优化了特征数据分布的宽窄和偏移量。保证了网络的非线性表达力(如果不加入这两个参数,相当于这一层所学习的特征分布被搞坏了)。
也有人这样说:scale、shift是两个独立的参数,也即和数据是没有依赖关系的,它们完全有可能将BN的作用给抵消掉,然而这恰好也是这个方法的优势,可以根据具体情况由网络自身在训练过程中来决定需不需要BN。
还有人这样说:原来这是为了让神经网络自己去学着使用和修改这个扩展参数 gamma, 和 平移参数 β, 这样神经网络就能自己慢慢琢磨出前面的 normalization 操作到底有没有起到优化的作用, 如果没有起到作用, 我就使用 gamma 和 beta来抵消一些 normalization 的操作。
可能最后一个好理解一点。但还是有点模糊。
接下来 面试时候可能会问到关于BN的哪些问题呢?
BN训练和测试时的参数是一样的嘛?
对于BN,在训练时,是对每一批的训练数据进行归一化,也即用每一批数据的均值和方差。而在测试时,比如进行一个样本的预测,就并没有batch的概念,因此,这个时候用的均值和方差是全量训练数据的均值和方差,这个可以通过移动平均法求得。当一个模型训练完成之后,它的所有参数都确定了,包括均值和方差。
BN训练时为什么不用全量训练集的均值和方差呢?
因为用全量训练集的均值和方差容易过拟合,对于BN,其实就是对每一批数据进行归一化到一个相同的分布,而每一批数据的均值和方差会有一定的差别,而不是用固定的值,这个差别实际上能够增加模型的鲁棒性,也会在一定