1 局部极小值与鞍点
神经网络训练时优化失败的表现:
- Loss下降但是降不到足够小;
- 不管怎么训练Loss都降不下去。
出现这种情况的原因是参数对LOSS的微分接近零,即梯度约等于零。此时由于梯度下降法更新参数时使用,导致参数更新幅度很小甚至不变。
1.1 临界点
将梯度为零的点统称为临界点(critical point),局部极大值、局部极小值、鞍点都是临界点。
- 局部极小值(local minimum):无论向哪个方向走都会导致损失变大,但不一定是全局最小值点。
- 局部极大值(local maximum):无论向哪个方向走都会导致损失变小;
- 鞍点(saddle point):往任意方向损失可能变大,可能变小。
处于临界点时,损失没有办法再下降。若该临界点是局部极小值,则可能无处可走,因为周围的点的损失都更高;若该临界点为鞍点,则是有方向能够使得损失更低的(如图3.2所示)。因此,判断临界点种类就存在其必要性了。
1.2 判断临界值种类
给定一组参数,我们可以近似损失函数为:
- 梯度(gradient) g = ,其元素由一阶微分组成,即;
- 海森矩阵(Hessian matirx) H,其元素由二阶微分组成,即。
走到临界点时时,梯度g为0,则。此时,损失函数近似为:
此时我们可以根据来判断处于哪类临界点。设为,改变的取值时,改变,若对于所有,
- ,则为局部极小值,因为其附近所有其他参数取值的损失都比当前要大;
- ,则为局部极大值;
- 若有时,有时,则为鞍点。
但是,穷尽所有的取值难以实现,因此,可以通过计算海森矩阵H的特征值来简便判断,
- 若H的所有特征值都大于0,此时,则为局部极小值;
- 若H的所有特征值都小于0,此时,则为局部极大值;
- 若H的特征值有正有负,则为鞍点。
1.3 逃离鞍点的方法
由于鞍点周围实际存在降低损失的方向,而局部极小值附近不存在这样的方向,因此,遇到鞍点实际上比遇到局部极小值更好。如图3.5所示,一维空间中的误差表面有一个局部极小值,但是在二维空间这个点就可能只是一个鞍点。同理,低维空间的局部极小值,在高一维度的空间中可能也只是个鞍点。
在实际情况中,几乎找不到局部极小值,而鞍点较多。若定义最小值比例为:
则当最小值比例为1时,该点为局部极小值,图3.6是训练某不同神经网络的结果,每个点对应一个神经网络。纵轴代表训练网络时,损失收敛到临界点,损失没法下降时的损失,横轴是最小值比例。可以发现,这些临界点中几乎不存在特征值都为正的,即基本不存在局部极小值。因此,多数时候,训练到梯度很小,参数不再更新时,往往是遇到了鞍点。
2 批量与动量
实际计算梯度时,不是对所有数据的损失L计算梯度,而是将所有数据分成一个个批量(batch),遍历所有批量的过程称为一个回合(epoch)。如图3.7所示,N笔数据被分为多个批量,每个批量大小为B,每次更新参数时,取其中一批(B笔数据)来计算损失和梯度以更新参数,再用新的参数根据下一批的数据进行更新。
2.1 批量大小对梯度下降法的影响
给定N笔训练数据,考虑两种极端情况:
- 批量大小 = 数据大小 = N,这种使用全部数据来更新一次参数的方法称为批量梯度下降法(Batch Gradient Descent,BGD)。此时,模型根据所有数据来计算损失和梯度,再进行一次参数更新。
- 批量大小 = 1,这种方法称为随机梯度下降法(Stochastic Gradient Descent,SGD)。在一个回合内,共要对N笔数据一笔笔进行更新,需更新N次参数。由于单个数据具有随机性,即存在更多噪声,其更新的方向是曲折的。
相对而言,大的批量更新比较稳定,小的批量梯度方向存在一定的噪声,有噪声的梯度反而可以帮助训练。
2.2 动量法
动量法(momentum method)是另外一个可以对抗鞍点或局部最小值的方法。使用梯度下降时,模型计算完梯度后,根据 往梯度的反方向移动一步,再依次类推下去。
引入动量后,每次更新参数时,不仅考虑当前的梯度,还要考虑之前的移动,将之前的移动用m来表示,其中为第i步之前所有计算的梯度的加权和,即 (为学习率,为前一个方向的权重参数),初始。可以从两个角度理解这个方法:
- 一个角度,动量是梯度的负反方向加上前一次移动的方向;
- 另一个角度,当加上动量的时候,更新的方向不是只考虑现在的梯度,而是考虑过去所有梯度的总和。而且由于权重参数的存在,可以发现,若设置,越远的移动对现在的影响越小,类似于LSTM。
原本模型根据梯度下降走到一个局部极小值或者鞍点时会停下不动,但由于动量的存在,其会继续向前走,这可能可以帮助其翻过一个小丘,走到更好的局部最小值处。或是往鞍点能够使得损失下降的方向走下去。