1、问题的引出:我们在做optimization的时候,会发现,随着参数的不断更新,你training的loss不会再下降(如下图所示),但是你对这个loss并不满意,那这究竟是因为什么原因导致这个loss不再下降呢?
2、猜想:常见的猜想是,我们现在走到一个地方,这个地方参数对loss的微分为0,这个时候梯度下降就没有办法再更新参数了,training也就停止了,相应的loss也就不会下降了。
Gradient
先来说说Gradient是什么?
- 梯度下降的思想是通过梯度最快的收敛,而梯度就是这几个方向中变化率最大的方向和值。注意梯度有方向有值,它是一个向量!!而函数的变化率其实就是函数的导数。对于一元函数来说,函数f(x)在a点的梯度 = 该函数的导数在a点处的值。
1、那么gradient为零(统称为critical point)的时候,有哪几种情况?
(1)局部最小值(local minima)。如果是卡在local minima,那可能就没有路可以走了,因为四周都比较高,你现在所在的位置已经是最低的点,loss最低的点了,往四周走 loss都会比较高,你会不知道怎么走到其他地方去。
(2)鞍点(saddle point)。(如图可看出,左右是比红点高,前后比红点低,红点既不是local minima,也不是local maxima的地方)如果是卡在saddle point,saddle point旁边还是有其他路可以让你的loss更低的,你只要逃离saddle point,你就有可能让你的loss更低。
2、那怎么知道critical point的类型,到底是local minima,还是saddle point呢?(有数学推导)
这个地方稍微来说有一定难度。不想看的可以直接跳过看最后总结。
引入:我们没有办法完整知道整个L(θ)的形状,但是如果给定一组参数,比如说蓝色的这个θ′,在θ′附近的L(θ),是有办法被写出来的,用Tayler Series Appoximation泰勒级数展开把它写出来如下图所示:
- 第一项是L(θ′),就告诉我们说,当θ跟θ′很近的时候,L(θ)应该跟L(θ′)蛮靠近的。
- 第二项是。
- 这个g就是梯度Gradient。这个gradient会弥补θ跟θ′的差距,虽然我们刚才说θ跟θ′很接近,但它们之间还是有一定的差距。
- 第三项跟Hessian(海森)矩阵有关。这个H就是海森矩阵。第三项会再弥补θ跟θ′的差距。H里面放的是参数对L的二次微分。Hessian定义如下图:
那我们今天走到了一个critical point,也就是说gradient为0,所以绿色这一项就可以去掉了。这时候的L(θ) ≈ L(θ′) + 第三项。
我们可以第三项来判断,在θ′附近的error surface(误差曲面),到底长什么样。知道error surface,我们就可以判断θ′是属于局部最小值点还是鞍点。
分析第三项:
- 为了符号方便起见,我们把(θ−θ′)用v这个向量来表示。
- positive definite就是正定矩阵。这么看我们需要代入所有的v才能确定是大于0还是小于0,显然这很麻烦。但是相信大家都学过线性代数。正定矩阵的充分必要条件是特征值全>0。
结论
分析Hessian矩阵:
(1)如果其所有特征值都是正的,就说明是local minima(局部最小值点)。
(2)如果其所有特征值都是负的,就说明是local maxima(局部最大值点)。
(3)如果其所有特征值有正有负,就说明是saddle point(鞍点)。
举个栗子(怎么通过Hessian判断critical point的类型)
比方说我们现在有一个function,是 。目标值ŷ是1。而且只有一组data。
(1)所以有损失函数:
(2)接着求gradient,也就是w1对L的微分和w2对L的微分:
(3)那么gradient什么时候为0呢?显然代入w1=0和w2=0,得出gradient为0。也就是说原点(0,0)为critical point。
(4)接着判断critical point的类型?直接求Hessian矩阵就可以得出答案。由,即
由特征值有正有负,所以它是一个saddle point。error surface如下图所示:
3、如果是saddle point的情况:
逃离saddle point的方法一:Hessian矩阵
如果今天你卡的地方是saddle point,也许你就不用那么害怕了。因为H它不只可以帮助我们判断,现在是不是在一个saddle point,它还指出了我们参数可以update的方向。
之前我们更新参数都是看gradient,当gradient为0时,如果是saddle point的话,我们还可以看H!
由线性代数的知识:A为矩阵,α为特征向量,λ为特征值。有Aα=λα。我们假设u是H的特征向量,λ是u的特征值。所以有:
又由鞍点的特征值有正有负,所以存在特征值λ使得λ‖u‖²<0,所以小于0,也就是
L(θ)<L(θ′)。即假设θ−θ′=u,你在θ'的位置加上u,沿着u的方向做update得到θ,你就可以让loss变小。
总结:
对于saddle point,我们只需要找出特征值λ小于0的点,再找出它对应的特征向量u,用u+θ′,就可以找到一个新的点,这个点的loss比原来低
举个栗子
前面的例子,我们知道原点是saddle point。它的H有负特征值λ=-2,它对应的特征向量有很多个,我们取为特征向量u,由总结我们可以知道,只要顺着特征向量u去更新我们的参数,就可以找到比saddle pointd的loss还要低的点。
也就是(0,0)这个地方,你向(1,1)更新,就可以让你的loss更低。
但是实际上,因为涉及到二次微分,运算量大,所以实际上我们不会真的把Hessian算出来,我们有其他方法来逃离这个saddle point!!(吐血,好像白学了)
逃离saddle point的方法二:momentum
具体看我这篇博客:
批量Batch and 动量Momentum_YKbsmn的博客-CSDN博客
这里说明一下:实际上我们要走到一个critical point是很困难的一件事;大多数情况下,在还没有走到critical point的时候,我们的训练就已经停止了。所以,当我们用梯度下降来做优化的时候,我们面对的挑战往往不是critical point,而是其它原因。
如下图:
当你的loss不再下降时,gradient并没有真的变得很小。而是gradient在error surface山谷的两个谷壁间,不断的来回的震荡。
所以当你今天训练一个network,train到后来发现,loss不再下降时,你不要随便说我卡在 local minima或者我卡在saddle point,有时候根本两个都不是,你只是单纯的loss没有办法再下降而已。
资料参考:李宏毅老师的机器学习!!
如有错误,欢迎指正。