本文从最基础的部分讲起,并包含很多对理解过程中的问题的思考。最近深度学习入门,读文献常常很多不懂,批量归一化这部分很重要,学习中有很多思考,写出来与大家分享。其中的问题或理解的错误之处拜托大家批评指正。
(Batch Normalization: Acceleration Deep Network Training by Reducing Internal Covariate Shift 研读笔记)
什么是批量归一化?
深度神经网络的训练在训练时先前的层的权值参数改变会导致层间输入值的分布情况也随之改变,这就使神经网络的训练变得困难。也使我们只能使用较小的学习率、更谨慎的参数初始化,且训练非线性模型变得非常困难。
文章作者把这种现象称为内部协变量偏移。
而批量归一化便是作者为了解决这一问题而提出的方案:将层间输入值进行归一化。而“批量”则是因为归一化操作是对训练的小批量数据进行的。
批量归一化这一操作极大地提高了训练的学习率,也使初始化的参数可以不那么谨慎,是加速训练的好方法。
下面让我们来看看到底为什么会有协变量偏移问题,这一问题是如何影响神经网络的训练的,以及批量归一化是如何操作的,又是为什么可以提高学习率、加速训练的。
1.相关背景知识:深度学习
1.1 神经网络的结构
我们知道,神经网络是如图所示的结构,具有输入层、输出层以及中间的隐含层。我们以前馈神经网络为例,前馈网络的目标是近似某个函数 f* 。例如对于分类器,y = f*(x) 将输入x映射到一个类别y。前馈网络定义了一个映射 y = f(x ; θ \theta θ ),并且学习参数 θ \theta θ 的值,使它能够得到最佳的函数近似。
因为线性模型具有很大的局限性,为了扩展线性模型来表示非线性函数,我们考虑对输入x进行非线性变换 ϕ \phi ϕ ,再将线性模型作用于 ϕ \phi ϕ(x)。此时的 ϕ \phi ϕ 就定义了一个隐藏层。
那么如何选择映射 ϕ \phi ϕ ? 此前人们会使用通用的 ϕ \phi ϕ 或是相关领域专家去手动设计它。而深度学习的策略是去学习 ϕ \phi ϕ ,我们有一个模型 y = f(x ; θ \theta θ , ω \omega ω) = ϕ \phi ϕ (x ; θ \theta θ ) T )^{T} )T ω \omega ω 。可以看出我们有两个参数, 用于从一大类函数中学习 ϕ \phi ϕ 的参数 θ \theta θ ,以及用于将 ϕ \phi ϕ(x) 映射到所需的输出的参数 ω \omega ω 。
1.2 神经网络是如何训练的?
在神经网络的训练中,我们会先设定损失函数,这个损失函数表征预测结果和实际标注之间的差距,因此我们的训练过程就是寻找损失函数的最小值,我们知道最小值处肯定是梯度为零的,因此可以通过梯度方法如随机梯度下降法去寻找。
下面我们来看神经网络的训练过程。在训练多层神经网络的时候,简单感知机的训练方法不再适用,从而需要更加强大的算法——逆误差传播算法。
假设训练集D={(x1,y1),(x2,y2)…(xm,ym)}。且定义如上形式的多层前馈网络。其中,输入层的权重用ν表示,隐含层到输出层的权重用ω表示。那么第h个隐藏层的神经元的输入为:
α h = ∑ i = 1 d v i h x i \alpha_{h} = \sum_{i=1}^{d} v_{ih} x_{i} αh=i=1∑dvihxi
第j个输出层神经元的输入值为
β j = ∑ h = 1 q w h j b h \beta_{j} = \sum_{h=1}^{q} w_{hj} b_{h} βj=h=1∑qw