Batch Normalization 批量归一化
- motivation
-
- 深度神经网络面临的问题
- BN达到的效果
- BN层
-
- 如何对批量数据归一化
- BN层的训练与推理
motivation
深度神经网络面临的问题
在深度神经网络的训练过程中,由于前面网络层的参数在不断发生改变,导致每一层的输入分布随着训练进行也在不断改变,这使得深度网络训练变得复杂。神经网络学习的本质就是在学习数据的分布,这也是为什么要求训练数据集与测试数据集的分布一致。每一批训练数据的分布各不相同,网络就要在每次迭代去学习适应不同的分布。这将会降低网络训练速度,因为每层输入分布的改变要求更小的学习率和更细致的参数初始化。SGD是一种简单高效的优化方法,但是其需要细致的超参调整,例如学习率、模型参数初始值。BN(batch normalization)的出现,将允许我们使用更大的学习率与更“随意”的参数初始值。
内部协变量偏移(Internal Covariate Shift)定义为:在训练过程中,神经网络的隐藏层结点的输入分布不断发生改变。批量归一化是将每个training mini-batch的结点输入分布进行归一化到均值为0,方差为1的分布,从而减少内部协变量偏移,从而加速深度网络的训练。
考虑一个以sigmoid为激活函数的神经网络层。各维度:z=g(Wu+b),x=Wu+b除了那些|x|接近于零的维度,其余在传播过程中梯度趋向于0.x又受W,b与之前网络层的影响,所以这些维度x将会趋于非线性饱和区。尤其在网络层数增加时更加显著。实践中解决饱和问题与梯度消失问题一般使用ReLU(x)=max(x,0),细致的初始化,小的学习率。BN的出现使得模型不会陷于饱和区。
批量处理的优势:
1.使用一个batch的梯度方向进行迭代,是对整个训练集的估计,避免向错误的梯度方向迭代。
2.每一个batch进行一次迭代,由于并行性处理,比逐一样本迭代更加高效。
BN达到的效果
1.由于对内部输入分布进行归一化,减少了内部协变量偏移,可以有效加速深度网络的训练过程。
2.BN将会减少梯度对参数尺度大小与其初始值的依赖,从而可以使用更大的学习率而又不至于模型发散。
B N ( W u ) = B N ( ( a W ) u ) BN(Wu)=BN((aW)u) BN(Wu)=BN((aW)u)
3.BN能够对模型进行正则化,减少dropout的应用,并避免陷于饱和区。
4.加速学习率的衰减。
5.打乱训练数据,可以防止同一个样本不断的出现在batch中。
BN层
如何对批量数据归一化
批量归一化就像激活函数层、卷积层、全连接层一样,是一个加在神经元结点输入和激活函数之前的操作。
对输入x=Wu+b的每个维度进行独立处理:
其中 x ( k ) x^{(k)} x(k)表示输入的第k个维度,均值与方差分别在mini-batch上求得。这样一来,输入分布将会被迁移到零值附近,激活函数sigmoid零值附近近似线性区,这会降低网络的表达能力,因为Wu+b都是线性操作,激活函数引入非线性操作,如果没有非线性操作,那么多层神经网络与单层神经网络的表达能力无差。所以,在BN算法中对每一个神经元结点引入了一对参数,用来偏置以恢复部分非线性信息。这对参数由网络训练得出。
所以BN层的输入为x=Wu+b,输出为y。算法1列出了BN层所进行的操作。
BN的反向传播:
BN层的训练与推理
应用了批量归一化的模型可以使用批量梯度下降与批量随机梯度下降进行训练。对于一个训练完成的网络,在测试时,并没有批量的概念,所以BN操作的批量均值与批量方差不存在。此时,使用整个训练数据的均值与方差替代之。这要求在训练过程中,对于每个批量数据,除了对参数进行更新之外,还要记录它们的均值与方差。用来计算:
其中BN偏置参数对使用训练得到的参数。所以对于一个baseline神经网络,在各个神经元增加BN层,并对参数 θ ∪ { γ , β } \theta \cup \{\gamma,\beta\} θ∪{
γ,β}进行训练。测试时,直接在训练网络上以整个训练集均值与方差代替批量均值与方差,输入测试样本,进行测试。算法2列出了BN网络的训练与推理过程: