Datawhale × 李宏毅苹果书 AI夏令营-深度学习进阶##AI夏令营Datawhale#夏令营第五期 Task3 批量归一化
该笔记分为三个部分:
一、批量归一化介绍
二、考虑深度学习
三、测试时的批量归一化
四、内部协变量偏移
一、批量归一化介绍
如下图,当误差表面崎岖不平,即优化问题变得困难时,批量归一化可以通过改变误差表面的地貌,使其更加平坦,从而更容易训练。这种方法的思想是不要低估优化问题的难度,即使误差表面看起来像是凸的(碗状),也可能存在斜率差别很大的情况,即在w1个方向上的变化很慢,而在w2方向上的变化很快。批量归一化的目标是通过调整输入数据的均值和方差,使得每一层的输入保持恒定的分布(如图中红色箭头),从而加速训练过程。
1、做归一化的原因
如果学习率固定不变,上图中的红色箭头会固定朝着一个方向走动,可能会很难得到好的结果,所以我们需要自适应的学习率。Adam等比较先进的优化方法,才能够得到好的结果。从另一个方面想,我们要做的是让梯度消失得慢一点,那就要从哪里找呢?其中一个想法就是让所有的梯度都一样大。如下图它的输入是一个维度x1,x2,对应的参数是w1,w2,没有激活函数。则它们经过点乘,加权求和就能得到y^ ,即 w1*x1+w2*x2+b = y^。计算y^与y之间的差距e,并把所有训练数据得出来的e加起来作为损失,然后我们就要使损失最小化。而归一化可以帮助模型更有效地找到最小化损失函数所需的参数设置。
2、特征归一化
假设 x1 的值都很小,w1 有一个变化的时候,因为x1 是直接乘上 w1,所以它对 y 的影响也是小的,对 e 的影响也是小的。反之,如果是x2 的值很大的话(如下图),当 w2 有一个小小的变化的时候,那 y 的变化也会很大,e 的变化就会很大。当输入的特征,每一个维度的值,它的范围差距很大的时候,我们就可能产生像这样子的误差表面,就可能产生不同方向,斜率非常不同,坡度非常不同的误差表面。出现这种状况我们应该怎么办呢。有没有可能给特征里面不同的维度,让它有同样的数值的范围。如果我们可以给不同的维度,同样的数值范围的话,那我们可能就可以制造比较好的误差表面,让训练变得比较容易一点其实有很多不同的方法,这些不同的方法往往就合起来统称为特征归一化(feature normalization)。
3、Z 值归一化
Z值归一化(也称为标准化)是一种特征归一化的方法,它通过对数据进行中心化和缩放,使得每个特征的平均值为0,标准差为1。具体做法如下图,对每个特征分别计算其平均值(mean)和标准差(standard deviation),然后将原始数据减去该特征的平均值,并除以其标准差。下图公式是对第 r 个特征向量的第 i 维度的值做Z值归一化,,其中
是第 r 个特征向量的第 i 维度的值,
是第 i 维度的平均值,
是第 i 维度的标准差。这个过程可以看作是将数据映射到一个新的坐标系中,使得新坐标系的原点位于旧坐标系的均值处,单位长度等于旧坐标系的标准差。这样做的目的是消除不同特征之间的尺度差异,使得模型在训练过程中更容易收敛,避免由于特征值范围的不同而导致的梯度消失或爆炸的问题。归一化后的特征值分布在0附近,有助于加快训练速度和提高模型的泛化能力。
二、考虑深度学习
对于深度学习来说,特征归一化是非常必要的,因为不同维度的范围不同,会导致激活函数的输出有很大的差异,进而造成难以优化,如下左图。虽然 已经做归一化了,但是通过 W1 得到的
,而
不同的维度间,它的数值的分布仍然有很大的差异,训练 W2 第二层的参数也会有困难。对于 W2,a和z 也是一种特征,也应该要做归一化。一般而言,特征归一化,要放在激活函数之前,之后都是可以的,在实现上,没有太大的差别。深度学习的中间层归一化过程如下右图,公式
=
,其中u是均值,
是方差。
三、测试时的批量归一化
上述过程的归一化都是训练的部分,批量归一化在测试的时候,会有什么样的问题呢?在测试的时候,我们一次会得到所有的测试数据,确实也可以在测试的数据上面,制造一个一个批量。在做批量归一化的时候u,是用一个批量的数据算出来的。但如果在测试的时候,根本就没有批量,如何算 u,
呢?
在训练的时候,如果有在做批量归一化,每一个批量计算出来的u,,都会拿出来算移动平均(moving average)
,
。因为测试的时候,在真正应用上也没有批量,就可以就直接拿跟 ,也就是
,
在训练的时候,得到的移动平均来取代原来的u跟
,如下图。这就是批量归一化在测试的时候的运作方式。
四、内部协变量偏移
接下来的问题就是批量归一化为什么会有帮助呢?原始的批量归一化论文里面提出内部协变量偏移(internal covariate shift)概念。协变量偏移(covariate shift),训练集和预测集样本分布不一致的问题就叫做协变量偏移现象。如下图所示,假设网络有很多层,-x 通过第一层后得到 a,a 通过第二层以后得到 b;计算出梯度以后,把 A 更新成 A′,把 B 这一层的参数更新成 B′。但是作者认为说,我们在计算 B 更新到 B′ 的梯度的时候,这个时候前一层的参数是 A,或者是前一层的输出是 a。那当前一层从 A 变成 A′ 的时候,其输出就从 a 变成 a′ 。但是我们计算这个梯度的时候,是根据 a 算出来,所以这个更新的方向也许它适合用在 a 上,但不适合用在 a′ 上面。因为我们每次都有做批量归一化,就会让 a 和a′ 的分布比较接近,也许这样就会对训练有帮助。
为什么批量归一化会比较好呢,那在这篇“How Does Batch Normalization Help Optimization?”这篇论文从实验和理论上,至少支持批量归一化可以改变误差表面,让误差表面比较不崎岖这个观点。所以这个观点是有理论的支持,也有实验的佐证的。如果要让网络误差表面变得比较不崎岖,其实不一定要做批量归一化,还有很多其他的方法都可以让误差表面变得不崎岖,这篇论文就试了一些其他的方法,发现跟批量归一化表现也差不多,甚至还稍微好一点,这篇论文的作者也觉得批量归一化是一种偶然的发现,但无论如何,其是一个有用的方法。其实批量归一化不是唯一的归一化,还有很多归一化方法,比如批量重归一化(batchrenormalization)、层归一化(layer normalization)、实例归一化(instance normalization)、组归一化(group normalization)、权重归一化(weight normalization)和谱归一化(spectrum normalization)。
参考文献:
[1] IOFFE S, SZEGEDY C. Batch normalization: Accelerating deep network training byreducing internal covariate shift[C]//International conference on machine learning. pmlr,2015: 448-456.
[2] SANTURKAR S, TSIPRAS D, ILYAS A, et al. How does batch normalization helpoptimization?[J]. Advances in neural information processing systems, 2018, 31.
[3] IOFFE S. Batch renormalization: Towards reducing minibatch dependence in batchnormalized models[J]. Advances in neural information processing systems, 2017, 30.
[4] BA J L, KIROS J R, HINTON G E. Layer normalization[J]. arXiv preprintarXiv:1607.06450, 2016.
[5] ULYANOV D, VEDALDI A, LEMPITSKY V. Instance normalization: The missingingredient for fast stylization[J]. arXiv preprint arXiv:1607.08022, 2016.
[6] WU Y, HE K. Group normalization[C]//Proceedings of the European conference oncomputer vision (ECCV). 2018: 3-19.
[7] SALIMANS T, KINGMA D P. Weight normalization: A simple reparameterization toaccelerate training of deep neural networks[J]. Advances in neural information processingsystems, 2016, 29.
[8] YOSHIDA Y, MIYATO T. Spectral norm regularization for improving the generalizability of deep learning[J]. arXiv preprint arXiv:1705.10941, 2017.