3.1.2 判断临界值种类的方法
为了判断一个临界点到底是局部最小值还是鞍点,需要知道损失函数的形状. 可是怎么才能知道损失函数的形状呢?网络本身很复杂,用复杂网络算出来的损失函数显然也很复杂.虽然无法完整知道整个损失函数的样子,但是如果给定一组参数,比如,那么附近的损失函数是有办法写出来的(虽然完整的样子写不出来). 附近的可近似为
(3.1)
式(3.1) 是泰勒级数近似(Tayler series appoximation).其中,第一项告诉我们,当和很接近的时候,应该和很接近;第二项中的代表梯度,它是一个向量,可以弥补和之间的差距.有时候,梯度会被写成 .是向量的第个元素,也就是关于的第个元素的微分:
(3.2)
光看还是没有办法完整地描述,还要看式(3.1) 中的第三项.第三项跟黑塞矩阵(Hessian matrix,也译作海森矩阵)有关. 里面放的是的二次微分,里面第行第列的值 ,就是先把的第个元素对做微分,再把的第个元素对做微分的结果,即
(3.3)
总结一下,损失函数在附近可近似为式(3.1),式(3.1)跟梯度和黑塞矩阵有关,梯度就是一次微分,黑塞矩阵里面有二次微分的项.
在临界点,梯度为零,因此为零.所以在临界点附近,损失函数可近似为
(3.4)
我们可以根据来判断附近的误差表面(error surface)到底是什么样子.知道了误差表面的“地貌”,我们就可以判断是局部最小值、局部最大值,还是鞍点.为了让符号简洁,我们用向量 来表示 ,可改写为,情况有如下三种.
(1)如果对所有,,则意味着对任意,. 换言之,只要在附近,都大于.这代表是附近最低的一个点,所以它是局部最小值.
(2)如果对所有,,则意味着对任意,. 这代表是附近最高的一个点,是局部最大值.
(3)如果对于,有时候大于零,有时候小于零,则意味着在附近,有时候,有时候 .因此在附近,既不是局部最大值,也不是局部最小值,而是鞍点.
这里有一个问题,通过判断临界点是局部最小值、鞍点,还是局部最大值,需要代入所有的 .但我们不可能把所有的都拿来试试,所以需要有一个更简便的方法来判断 的正负.算出一个黑塞矩阵后,不需要试着把它跟所有的相乘,而只要看的特征值.若的所有特征值都是正的,为正定矩阵,则 ,临界点是局部最小值.若的所有特征值都是负的,为负定矩阵,则 ,临界点是局部最大值.若的特征值有正有负,则临界点是鞍点.
如果 阶对称矩阵对于任意非零的维向量都有 ,则称矩阵为正定矩阵.如果 阶对称矩阵对于任意非零的维向量都有 ,则称矩阵为负定矩阵.
举个例子,我们有一个简单的神经网络,它只有两个神经元,而且神经元还没有激活函数和偏置.输入,将乘上以后输出,然后乘上,接着再输出,最终得到的数据就是,即
(3.5)
我们还有一个简单的训练数据集,这个数据集只有一组数据 (1,1),也就是 的标签是1. 所以输入1进去,我们希望最终的输出跟1越接近越好,如图3.3 所示.
图3.3 一个简单的神经网络
可以直接画出这个神经网络的误差表面,如图3.4 所示. 还可以取[-2.0,2.0]区间内和的数值,算出这个区间内、 的数值所带来的损失,4个角落的损失较高.我们用黑色的点来表示临界点,原点(0.0,0.0)是临界点,另外两排点也是临界点.我们可以进一步判断这些临界点是鞍点还是局部最小值.原点是鞍点,因为我们往某个方向走,损失可能会变大,也可能会变小.而另外两排临界点都是局部最小值.这是我们取[-2.0,2.0]区间内的参数得到损失函数,进而得到损失值,画出误差表面后得出的结论.
图3.4 误差表面
除了尝试取所有可能的损失之外,我们还有其他的方法,比如把损失函数写出来.对于图3.3 所示的神经网络,损失函数等于用正确答案减掉模型的输出后取平方误差(square error). 这里只有一组数据,因此不会对所有的训练数据进行加和. 令, ,损失函数为
(3.6)
可以求出损失函数的梯度,其中
(3.7)
什么时候梯度会为零(也就是到达一个临界点)呢?比如,在原点时,, ,此时的梯度为零,原点就是一个临界点,但通过黑塞矩阵才能判断它是哪种临界点.刚才我们通过取[-2.0,2.0]区间内的 和判断出原点是一个鞍点,但假设我们还没有取所有可能的损失,下面来看看能不能用黑塞矩阵判断出原点是什么类型的临界点.
黑塞矩阵收集了的二次微分:
(3.8)
对于原点,只要把, 代进去,就可以得到黑塞矩阵
(3.9)
要通过黑塞矩阵来判断原点是局部最小值还是鞍点,就要看它的特征值. 这个矩阵有两个特征值——2和 -2,特征值有正有负,因此原点是鞍点.
如果当前处于鞍点,就不用那么害怕了.不仅可以帮助我们判断是不是处在一个鞍点,还指出了参数可以更新的方向.之前我们更新参数的时候,都是看梯度,但是当来到某个地方以后,若发现变成了,就不能再看了.但如果临界点是一个鞍点,还可以再看,怎么再看呢?是怎么告诉我们如何更新参数的呢?
设为的一个特征值,为对应的特征向量.对于我们的优化问题,可令,则
(3.10)
若,则.所以.此时,,且
(3.11)
根据式(3.10) 和式(3.11),因为,所以只要沿着特征向量 的方向更新参数,损失就会变小. 虽然临界点的梯度为零,但如果我们处在一个鞍点,那么只要找出负的特征值,再找出这个特征值对应的特征向量,将其与相加,就可以找到一个损失更低的点.
在前面的例子中,原点是一个临界点,此时的黑塞矩阵如式(3.9) 所示. 该黑塞矩阵有一个负的特征值-2,特征值-2对应的特征向量有无穷多个.不妨取 ,作为-2对应的特征向量.我们其实只要沿着的方向更新参数,就可以找到一个损失比鞍点处还低的点,以这个例子来看,原点是鞍点,其梯度为零,所以梯度不会告诉我们要怎么更新参数,但黑塞矩阵的特征向量告诉我们只要往 的方向更新参数,损失就会变得更小,从而逃离鞍点.
所以从这个角度来看,鞍点似乎并没有那么可怕.但实际上,我们几乎不会把黑塞矩阵算出来,因为计算黑塞矩阵需要算二次微分,计算量非常大,何况还要找出它的特征值和特征向量. 几乎没有人用这个方法来逃离鞍点,而其他一些逃离鞍点的方法计算量都比计算黑塞矩阵要小很多.