一、局部极小值和鞍点
1.1 临界点及其种类
做深度学习训练神经网络时,经常会碰见训练损失在经历一定的更新次数后不再下降的情况。我们常常会认为此时参数对于损失函数的微分,也就是梯度为0,从而使得模型无法再通过梯度下降法来获得更好的训练效果。
这类梯度为0的点可以被称之为临界点。过去最常见想到的符合这类条件的点是局部极小值和局部极大值。然而,还存在着一种称为鞍点的临界点。顾名思义,鞍点的叫法是因为靠近鞍点的临界区域形状像马鞍而得名的。例如在下图b中,红色的临界点虽然在y轴方向较高,但在x轴方向较低。因此,临界点类型的判断有助于我们决定现有神经网络结构的参数是否还有进一步优化的可能。
1.2 判断临界点类型的方式
既然了解了临界点的类型对参数优化的意义,那如何才能快捷方便的一个临界点属于那个类型呢。神经网络虽然结构复杂,难以获得完整损失函数的图像。但对某一点附近的损失函数可以通过泰勒级数近似来获取。
给定一组参数,在它附近的损失函数可以近似写为:
g表示梯度,是一个向量,用以弥补和之间的主要差距。第三项中的为海森矩阵(Hessian matrix),里面存放有L的二次微分。矩阵中每一位的元素如下式计算:
当处于临界点时,由于梯度g为0,近似公式的第二项可被舍去。我们可以根据第三项来判断附近的误差表面(error surface)。
- 若对于所有,,这表示所有附近的点,都要大于,此时,位于局部极小值。
- 若对于所有,,这表示所有附近的点,都要小于,此时,位于局部极大值。
- 若对于,有时大于0有时小于0,这表示所有附近的点,有时大于,有时小于,此时,位于鞍点的位置。
为了便于计算和判断,我们不需要代入所有的来进行计算,只需要看的特征值即可。若的所有特征值均为正数,则为正定矩阵,此时,临界点为局部极小值。反之,则为负定矩阵,临界值为局部最大值。若的特征值有正有负,则为鞍点。
1.3 逃离鞍点的方法
当我们判断出来当前正处于鞍点时,就知道参数其实还有进一步优化的可能。海森矩阵不仅可以帮助我们判断当前的临界点是否为鞍点,还可以指出参数更新的方向。
设(< 0)为的一个特征值,为其对应的特征向量,使得,则
由于取的特征值,所以。此时要小于,。因此只要沿着的方向更新,损失函数就可以进一步变小,从而进一步优化参数。
不过,由于海森矩阵需要计算二次微分,计算这个矩阵并找出它们的特征值和特征向量的过程过于繁琐,因此还有一些其他运算量更小的逃离鞍点的方式。
如下图a所示的一维空间中,误差表面存在有一个局部极小值。但在二维空间(图b)里,这个点可能就是一个鞍点。图c经常被用于说明深度学习训练的复杂性,在二维空间中存在着非常多局部极小值。然而,低维度空间中的局部极小值,在更高维的空间中可能是鞍点。虽然更高的维度难以被可视化它,但我们在训练一个网络的时候,参数数量动辄达百万千万级,所以误差表面其实有非常高的维度(参数的数量代表了误差表面的维度)。既然维度这么高,其实可能就有非常多的路可以走。既然有非常多的路可以走,那么局部极小值可能就很少。
下图是训练某不同神经网络的结果,每个点对应一个神经网络。纵轴代表训练网络时,损失收敛到临界点,损失没法下降时的损失。我们常常会遇到两种情况:损失仍然很高,却遇到了临界点而不再下降;或者损失降得很低,才遇到临界点。
图中,横轴代表最小值比例(minimum ratio),最小值比例定义为正特征值数量与总特征值数量的比值。在上图所示的例子中,最小值比例最大也不过处于 0.5 ~ 0.6 的范围,代表只有约一半的特征值为正,另一半的特征值为负,代表在所有的维度里面有约一半的路可以让损失上升,还有约一半的路可以让损失下降。虽然在这个图上,越靠近右侧代表临界点“看起来越像”局部极小值,但是这些点都不是真正的局部极小值。所以从经验上看起来,局部极小值并没有那么常见。多数的时候,我们训练到一个梯度很小的地方,参数不再更新,往往只是遇到了鞍点。