Batch Normalization深度学习第八章(二)
前面一篇(深度学习优化算法比较——深度学习第八章(一))总结了常见的优化算法SGD以及其改进方法Momentum,Adagrad,Adam等,这篇继续总结最近优化深度神经网络的一种高效的方法——Batch Normalization,该方法有Ioffe和Szegedy在2015年提出(Accelerating Deep Network Training by Reducing Internal Covariate Shift)。
深度神经网络模型由于层数很多,通常可以表示为若干个函数组合的结果,而计算关于每个参数的梯度时,我们通常假设了其他层不会改变,但实际上,我们常常同时改变很多层的参数。例如一个简单的例子,假设我们有一个简单的神经网络每层只有一个节点且没有激活函数,则输出可以表示为对输入的线性形式 ,其中
为第i层的权重,第i层的输出为
。
虽然是
的线性函数,但不是
的线性函数。对于参数w的梯度表示为
,当我们做梯度下降更新时
,通过一阶泰勒展开可得到预测值
下降为
,如果我们希望
下降0.1,则所选取的学习率
应等于
,但是实际上我们还要更考虑二阶三阶直至
阶展开项的影响,新的预测值为
。
例如其中一个二阶展开项为 ,依赖于
的大小,这一项可以忽略不计或者指数级大(假如第3到第
层权重都大于1),由于包含有对于其他参数的依赖,这使得选取一个合适的学习率很困难。为了解决二阶展开的问题,就有各种二阶优化方法如牛顿法等,但这些方法计算量大且忽略了更高阶项,效果不是很理想,所以我们需要找到一种可以将不同层之间的影响分离开的方法。
Batch Normalization就是为了解决这一问题而提出的。其基本思想是对于每一层的值进行标准化,将其转化为期望为0,方差为1的单位高斯形式,从而刨除之前层对当前层的影响。即
其中m为batch的大小。注意这里的 不是指学习率,而是一个微小的正值如
以防止出现分母为零的情况。
可以看到无论之前层的参数如何变化,经过batch normalization后,第 层仍是单位高斯形式,而输出y可以写作
的形式,而不需要考虑其他层参数的高阶项的影响,所以我们可以更高效的进行学习过程。
当然,以上是训练过程,我们做inference的时候只是对单一带测数据,没有期望和方差,所以需要将训练时的期望和方差的平均值记录下来,代入到模型里。
可能这里会有疑问,我们将每层值都标准化会不会降低模型的表达能力,为了解决这一问题,通常我们会对激活函数引入新的超参数 使得其可以表示任意的期望和方差,即其激活函数输出为
。注意这里的
的引入虽然改变了期望和方差,使其输出不再是单位高斯形式,但是
并不依赖于其他层的参数
因而不会引入高阶项,所以训练过程的高效性并未受影响。
实际效果上,原作者比较了对于Inception模型利用batch normalization的效果,可看出它能以更少的训练步数达到更高的准确度,是非常有效的方法。
总结一下,batch normalization是解决梯度下降更新时会依赖更多层的参数而造成学习效率降低的问题而提出的,利用将每层进行标准化,分离了之前层参数对当前层的影响,从而提高了学习效率。至此,通过第六章前馈神经网络(前馈神经网络初探——深度学习花书第六章(一),神经网络损失函数、输出层、隐藏层详解——深度学习第六章(二),反向传播算法——深度学习第六章(三))第七章正则化方法(深度学习中的正则化方法总结——深度学习第七章)以及第八章优化方法的总结,我们已经具备了基本的深度神经网络模型框架及训练方法的知识,接下来两章会总结一些特殊的模型结构如卷积神经网络和循环神经网络,第八章总结的优化方法基本上可以不经修改就应用到这些网络中。
注:截图均来自Ian Goodfellow等合著的Deep Learning一书以及原作者论文Accelerating Deep Network Training by Reducing Internal Covariate Shift。