1 BN的介绍
在神经网络的训练过程中, 我们一般会将输入样本的特征进行标准化处理,使数据变成均值为0, 标准差为1的高斯分布, 或者范围在0附近的分布。 因为如果数据没有进行该处理的话, 由于样本特征分布比较散, 可能会导致学习速度慢甚至难以学习。
因此一个较好的数据分布可以使神经网络的训练速度加快, 甚至效果更好。
在模型训练的时候, 由于模型参数在发生更新, 那么除了输入层的数据之外, 后面网络的每一层的输入数据分布都是一直在发生变化的。 网络中间层的训练过程中, 数据分布的改变被称为'Internal Covariate Shift' 。 而BN的提出就是 为了解决在训练过程中, 中间层数据分布发生改变的情况
Batch Normalization Layer(BN Layer)是期望我们的结果是服从高斯分布的,所以对神经元的输出进行一下修正。 论文中建议放到卷积层/FC层后, 激励层/池化层前, 而实际应用的时候有时候会放到激励层后。
论文: Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift;
论文链接: https://arxiv.org/pdf/1502.03167v3.pdf
2 BN的步骤
2.1 BN的训练步骤
BN的训练步骤主要分为以下4步:
- 求解每个训练批次数据的均值
- 求解每个训练批次数据的方差
- 使用求得的均值和方差对该批次的数据做标准化处理, 获得0-1分布。
- 尺度变换和偏移: 使用标准化之后的x乘以γ调整数值大小, 再加上β增加偏移后得到输出值y。 这个γ是尺度因子, β是平移因子, 属于BN的核心精髓, 由于标准化后的x基本会被限制在正态分布下, 会使得网络的表达能力下降, 为了解决这个问题, 引入两个模型参数γ、 β进行平移变化。
在上述中,对于每个训练批次数据,比如说,一个批次有8个样本,一个样本中,特征图尺寸为24x24,通道数量为10,那么,就会选择每个样本的同一个通道出来作BN,对于特征图上的每个位置我们会计算这个位置上,在批次中所有样本对应位置的值的均值和方差。 例如下图
2.2 BN在测试的时候
在训练的时候我们一般使用一个批次中的样本的均值和标准差进行BN操作,但是预测的时候由于样本数目不确定(比较少), 所以不好使用预测样本的均值和方差进行BN操作, 实际上在预测的时候, 使用的是训练阶段所有batch记录下来的均值和方差的期望值作为预测时候BN的均值和方差
实际实现的时候可能采用类似momentum动量法中使用的滑动平均来进行计算测试时候的均值和方差。
3 BN的优缺点
3.1 Batch Normalization优点
1 梯度传递(计算)更加顺畅, 不容易导致神经元饱和 (防止梯度消失(梯度弥散)/梯度爆炸, 允许使用饱和性激活函数<eg: sigmoid、tanh等>)
2 学习率可以设置的大一点, 加快训练速度。
3 对于模型参数的初始化方式和模型参数取值不太敏感, 使得网络学习更加稳定, 提高模型训练精度。
4 具有一定的正则化效果, 类似Dropout、 L1、 L2等正则化的效果。
3.2 Batch Normalization缺点
1 如果网络层次比较深, 加BN层的话, 可能会导致模型训练速度很慢。
2 训练批次不能设置太小, 一般建议批次大小16以上。对batchsize大小敏感, 由于每次计算均值和方差是在同一个batch上, 如果batchsize设置的太小, 计算出来的均值和方差不足以代表整个数据分布
3 BN的计算过程中需要保存某一层神经网络batch的均值和方差等统计信息, 对于固定长度的网络结构(DNN、 CNN)比较适合, 但是对于不定长度的RNN的,训练比较麻烦