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》阅读笔记与实现

发布了24 篇原创文章 · 获赞 12 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/Woolseyyy/article/details/74712946