Advertisement

Batch Normalization —— 加速深度神经网络收敛利器

阅读量:

Batch Normalization

Batch Normalization 提出自《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》。其效果主要是加速网络收敛速度,并简化超参数的调节。

论文中列举的优势如下:

  • 可以使用更高的学习率。如果每层的scale不一致,实际上每层需要的学习率是不一样的,同一层不同维度的scale往往也需要不同大小的学习率,通常需要使用最小的那个学习率才能保证损失函数有效下降,Batch Normalization将每层、每维的scale保持一致,那么我们就可以直接使用较高的学习率进行优化。
  • 移除或使用较低的dropout。 dropout是常用的防止overfitting的方法,而导致overfit的位置往往在数据边界处,如果初始化权重就已经落在数据内部,overfit现象就可以得到一定的缓解。论文中最后的模型分别使用10%、5%和0%的dropout训练模型,与之前的40%-50%相比,可以大大提高训练速度。
  • 降低L2权重衰减系数。 还是一样的问题,边界处的局部最优往往有几维的权重(斜率)较大,使用L2衰减可以缓解这一问题,现在用了Batch Normalization,就可以把这个值降低了,论文中降低为原来的5倍。
  • 取消Local Response Normalization层。 由于使用了一种Normalization,再使用LRN就显得没那么必要了。而且LRN实际上也没那么work。
  • 减少图像扭曲的使用。 由于现在训练epoch数降低,所以要对输入数据少做一些扭曲,让神经网络多看看真实的数据。

要解决的问题

Batch Normalization主要是为了解决internal covariate shift的问题。

什么是internal covariate shift问题呢?简单的说就是后一层要去处理前一层给的数据,而由于前一层的参数变化,后一层的输入分布会跟着变化,后一层的训练也要跟着分布的变化而变化。在深度神经网络中,往往有多层神经元,而前一层参数的变化会造成后层的剧烈变化。
我们可以想象,后一层好不容易把前一层给的数据训练的差不多了,前一层的参数一调,后面的神经元又得从头学习。这个过程很浪费时间,特别是在早期训练过程中。

基本思想

所以我们的基本思想就是,能不能让每一层输入的分布不要剧烈变动?最好它是同分布的。

如何让他们同分布呢?我们可以很容易想到利用normalization、白化这些方法来进行处理,就像我们对数据进行预处理一样。

好的,那么我们先来回顾一下normalization的作用。我们为什么要对数据进行normalization处理?
Markdown
一般来说,我们得到的数据都是Figure 1, 而我们的随机化参数一般都在零点附近,所以如果不做任何操作的话,我们要先一路摸到数据均值点附近,才能进行比较好的分类。如果这个数据离原点比较远,那么我们就要花费很多的时间来摸到数据均值点附近了,这个其实是没什么意义的。
好,那么我们现在把数据拉到原点附近,这样就可以比较快的训练了。如figure 2.
Markdown
还有的时候,特别是处理图片数据时,数据样本之间的相关性很大,所以得到的数据样本分布比较狭长,如Figure 3。这也是不利于我们训练的。想象一下,你对W稍微一调整分界超平面就飞出了样本外,真是糟糕。所以这个时候我们还对它进行一个操作,使它的方差为1,让它的分布比较均匀,如Figure 4.

如果我们再对它进行白化操作,使它的方差最大,数据和数据之间分布尽可能大,那我们的效果会更好。

好,既然我们知道了normalization的神奇作用,那我们就可以利用它来对付我们的internal covariate shift问题了。那想法很简单,我们在每次要送到激活函数前,进行一下normalization就可以了。

真的吗?

我们来观察一下sigmoid函数和relu函数
Markdown
想一想,如果我们在送到激活函数前,对它进行了normalization,会发生什么?
对了,对于sigmoid函数,我们的数据会集中在-1,1这样的区间里。恩,它的变化很剧烈,收敛很快。但我们发现中间是近似于线性的,也就是说,我们相当于在用一层又一层的线性函数去做了训练。天哪,我们在干什么,难道我们不知道多层的线性和单层的线性效果是一样的吗。我们削弱了模型的刻画能力。
我们再看看relu,对relu来说,有人说我们产出了一堆随机0,1的,这个..我再求证一下。论文里并没有提到这个。

那可如何是好?论文引入了scal and shift,简单的说,就是在normalization之后,再进行一些移动和放缩,让它避免之前提到的那个问题。而这个参数,则由模型训练得到。
事实上,我觉得还是有点不讲理的,好不容易把大家的分布都进行了一个归一化,整到了一起,又特别来一个移动和放缩操作来把大家的分布脱离归一化。这也是这篇论文的争议之一。
我目前是这样理解的:
事实上,我们的目的是让每一层拿到一个稳定的分布进行处理,但我们直接进行归一化操作是“粗暴的”。我们让所有层要处理的“稳定分布”指定为均值为0,方差为1的分布。加入这样一个可训练的参数后,我们就允许每一层拥有一个属于它自己的稳定分布,并且这个分布是有效的,没有让激活函数失去非线性。
不过只是我目前的理解。欢迎讨论,如果以后有新的理解会再补充在这里。

算法

Markdown

效果

该算法虽然理论还有争议的地方,但实验效果很好,目前已经在深度神经网络中广泛应用。

Reference

Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift
解读Batch Normalization
机器学习(七)白化whitening
深度学习(二十九)Batch Normalization 学习笔记
Batch Normalization导读
Batch Normalization Accelerating Deep Network Training by Reducing Internal Covariate Shift》阅读笔记与实现

全部评论 (0)

还没有任何评论哟~