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