2-2 李宏毅2021春季机器学习教程-类神经网络训练不起来怎么办(一)局部最小值与鞍点(Local Minima and Saddle Point)

72 篇文章 28 订阅

在文章2-1 李宏毅2021春季机器学习教程-第二节机器学习任务攻略中介绍了在机器学习训练过程如何做的更好的一些攻略,包括训练集和测试集上的分析,以及过拟合等等。接下来几篇文章具体看看类神经网络训练不起来怎么办?让我们开始吧。

目录

Training Fails because....

Warning of Math

Tayler Series Approximation

Hession

Don't afraid of saddle point

举具体的例子

Saddle Point v.s. Local Minima


Training Fails because....

现在我们要讲的是Optimization的部分,等下我们要讲的东西基本上跟Overfitting没有什么太大的关联,我们只讨论Optimization的时候,怎么把gradient descent做得更好,那为什么Optimization会失败呢

你常常在做Optimization的时候会发现,随着你的参数不断的update,你的training的loss不会再下降,但是你对这个loss仍然不满意,你可以把deep的network跟linear的model或shallow network 比较,发现说它没有做得更好,所以你觉得deep network没有发挥它完整的力量,所以Optimization显然是有问题的。但有时候你会甚至发现,一开始你的model就train不起来,一开始你不管怎么update你的参数,你的loss通通都掉不下去,那这个时候到底发生了什么事情呢

过去常见的一个猜想,是因为我们现在走到了一个地方,这个地方参数对loss的微分为零,当你的参数对loss微分为零的时候,gradient descent就没有办法再update参数了,这个时候training就停下来了,loss当然就不会再下降了。

​讲到gradient为零的时候,大家通常脑海中最先浮现的,可能就是local minima所以常有人说做deep learning,用gradient descent会卡在local minima,然后所以gradient descent不work,所以deep learning不work。​但是如果有一天你要写deep learning相关paper的时候,你千万不要讲卡在local minima这种事情,别人会觉得你非常没有水平,为什么

因为不是只有local minima的gradient是零,还有其他可能会让gradient是零,比如说 saddle point所谓的saddle point就是gradient是零,但是不是local minima,也不是local maxima的地方,像上图右边这个例子里面红色的这个点,它在左右这个方向是比较高的,前后这个方向是比较低的,它像是一个马鞍的形状,所以叫做saddle point(鞍点)。像saddle point这种地方,它也是gradient为零,但它不是local minima,那像这种gradient为零的点,统称为critical point所以你可以说你的loss,没有办法再下降,也许是因为卡在了critical point,但你不能说是卡在local minima,因为saddle point也是微分为零的点。但是今天如果你发现你的gradient,真的很靠近零,卡在了某个critical point,我们有没有办法知道,到底是local minima,还是saddle point?其实是有办法的

为什么我们想要知道到底是卡在local minima,还是卡在saddle point呢

  • 因为如果是卡在local minima,那可能就没有路可以走了,因为四周都比较高,你现在所在的位置已经是最低的点,loss最低的点了,往四周走loss都会比较高,你不知道怎么走到其他的地方去。但saddle point就没有这个问题,如果你今天是卡在saddle point的话,saddle point旁边还是有路可以走的,还可以让你的loss更低的,你只要逃离saddle point,你就有可能让你的loss更低。

​所以鉴别今天我们走到critical point的时候,到底是local minima还是saddle point,是一个值得去探讨的问题,那怎么知道今天一个critical point,到底是属于local minima还是saddle point呢?

Warning of Math

​这边需要用到一点数学,以下这段其实没有很难的数学,就只是微积分跟线性代数,但如果你没有听懂的话,以下这段skip掉是没有关系的

​那怎么知道说一个点,到底是local minima还是saddle point呢?

你要知道我们loss function的形状,可是我们怎么知道loss function的形状呢,network本身很复杂,算出来的loss function显然也很复杂。

Tayler Series Approximation

但是如果给定某一组参数,比如说蓝色的这个θ',在θ'附近的loss function是有办法被写出来的,它写出来就是右侧这个样子。所以这个L(θ)完整的样子写不出来,但是它在θ'附近可以用这个式子来表示它,这个式子是Tayler Series Appoximation泰勒级数展开,这个假设你在微积分的时候已经学过了,所以我就不会细讲这一串是怎么来的,但我们就只讲一下它的概念,这一串里面包含什么东西呢?

  • 第一项是L(θ'),就告诉我们说,当θ跟θ'很近的时候,L(θ)应该跟L(θ')还蛮靠近的。
  • 第二项(上图绿色框)是(θ-θ')^T*g,其中g是一个矢量,这个g就是我们的gradient,我们用绿色的g来代表gradient,这个gradient会来弥补θ'跟θ之间的差距。虽然说θ'跟θ应该很接近,但是中间还是有一些差距的。那这个差距,第一项我们用这个gradient来表示他们之间的差距,有时候gradient会写成∇L(θ'),这个地方的g是一个矢量,它的第i个component,就是θ的第i个component对L的微分,光是看g还是没有办法完整的描述L(θ),还要看第三项。
  • 第三项(上图红色框)跟Hessian有关。这个H叫做Hessian矩阵,这个第三项是(θ-θ')^TH(θ-θ'),所以第三项会再补足,再加上gradient以后与真正的L(θ)之间的差距。H里面放的是L的二次微分,它第i个row,第j个column的值,就是把θ的第i个component对L作微分,再把θ的第j个component,对L作微分,再把θ的第i个component,对L作微分,做两次微分以后的结果就是这个H_ij。

如果这边你觉得有点听不太懂的话,也没有关系。反正你就记得这个L(θ)的loss function,这个error surface在θ'附近可以写成这个样子,这个式子跟gradient和hessian两个东西有关系,gradient就是一次微分,hessian就是里面有二次微分的项目。

Hession

那如果我们今天走到了一个critical point,意味着gradient为零

如上图,g是一个zero vector,绿色的这一项完全都不见了,只剩下红色的这一项。所以当在critical point的时候,这个loss function可以被近似为L(θ')加上红色的这一项。我们可以根据红色的这一项来判断在θ'附近的error surface到底长什么样子,知道error surface长什么样子,就可以判断 θ'它是local minima、local maxima还是saddle point。

我们可以靠这一项来了解error surface的地貌大概长什么样子,知道它地貌长什么样子,我们就可以知道说,现在是在什么样的状态。

那我们就来看一下怎么根据Hessian,怎么根据红色的这一项,来判断θ'附近的地貌

(上图的PPT真的整理的特别好,一目了然!建议保存!)

我们现在为了符号方便起见,把(θ-θ')用v这个矢量来表示。分析H矩阵时,主要有如下三种情况:

  • ①如果对任何可能的v,v^THv都大于零,也就是说现在θ不管代任何值,v可以是任何的v,红色框里面通通都大于零,那意味着说 L(θ)大于L(θ')。L(θ)不管代多少,只要在θ'附近,L(θ)都大于L(θ'),代表L(θ')是附近的一个最低点,所以它是local minima。                               
  • ②如果今天反过来说,对所有的v而言,v^THv都小于零,θ不管代什么值,红色框框里面都小于零,意味着L(θ)小于L(θ'),代表L(θ')是附近最高的一个点,所以它是local maxima
  • ③第三个可能是假设,v^THv有时候大于零、有时候小于零,你代不同的v进去,代不同的θ进去,红色这个框框里面有时候大于零,有时候小于零,意味着说在θ'附近有时候L(θ)大于L(θ') 有时候L(θ)小于L(θ'),在L(θ')附近有些地方高、有些地方低,这意味着这是一个saddle point。

​但是你这边是说我们要代所有的v,看v^THv是大于零还是小于零。我们怎么有可能把所有的v,都拿来试试看呢,所以有一个更简便的方法:去确认说这一个条件或这一个条件,会不会发生

这个就直接告诉你结论,线性代数理论上是有教过这件事情的,如果今天对所有的v而言,v^THv都大于零,那这种矩阵叫做正定矩阵(positive definite ),它所有的eigen value特征值都是正的。所以如果你今天算出一个hessian,你不需要把它跟所有的v都乘起来,你只要去直接看这个H的eigen value,如果你发现:

  • ①所有eigen value都是正的,那就代表说这个条件成立,v^THv会大于零,代表说是一个local minima。所以你从hessian metric可以看出,它是不是local minima,你只要算出hessian metric以后,看它的eigen value发现都是正的,它就是local minima
  • ②那反过来说也是一样,如果今天在这个状况,对所有的v而言v^THv小于零,那H是negative definite,代表所有eigen value都是负的,就保证他是local maxima
  • 那如果eigen value有正有负,那就代表是saddle point
  • 总之,那假设在这里你没有听得很懂的话,你就可以记得结论——你只要算出hessian矩阵,这个矩阵如果它所有的eigen value都是正的,那就代表我们现在在local minima,如果它有正有负,就代表在saddle point。

那如果刚才讲的,你觉得你没有听得很懂的话,我们这边举一个例子。

我们现在有一个史上最废的network,输入一个x,它只有一个neuron,乘上w₁,而且这个neuron,还没有activation function,所以x乘上w₁以后就输出,然后再乘上w₂, 然后就输出,最终的数据就是y。总之这个function的表达式为 y= w₁×w₂×x​ 。我们有一个史上最废的training set,这个data set说,我们只有一笔data,这笔data是x,x是1的时候,它的level是1,所以输入1你希望最终的输出跟1越接近越好。

​而这个史上最废的training,它的error surface也是有办法直接画出来的,因为只有两个参数 w₁ w₂,没有bias。(假设没有bias,只有w₁跟w₂两个参数)那我们可以穷举所有w₁跟w₂的数值,算出所有w₁ w₂数值所代来的loss,然后就画出error surface 长这个样(如上图所示)。上图四个角落loss是高的。那这个图上你可以看到有一些critical point,这个黑点点的地方(0,0),原点的地方是critical point,然后事实上,右上三个黑点也是一排critical point,左下三个点也是一排critical point。如果你更进一步要分析,他们是saddle point还是local minima的呢

在原点(0,0)开始,你往左上这个方向走 loss会变大,往右下这个方向走 loss会变大,往左下这个方向走 loss会变小,往右下这个方向走 loss会变小,所以它是一个saddle point

而这两群critical point,它们都是local minima,这一排山沟里面有一排local minima,然后在原点的地方,有一个saddle point,这个是我们把error surface遍历所有的参数,得到的loss function以后,画出error surface,可以得到这样的结论。

​现在假设如果不遍历所有可能的loss,如果要直接算说一个点是local minima还是saddle point的话怎么算呢?

我们可以把loss的function写出来,这个loss function是 L=(hat{y}-w₁w₂x)^2,正确答案 ŷ减掉model的输出w₁ w₂x,这边取square error。因为这边只有一笔data,就不会summation over所有的training data,直接x代1 ,ŷ代1。那我们可以把loss function的gradient求出来,w₁对L的微分,w₂对L的微分写出来是这样 :

 

那么什么时候gradient为零呢,什么时候会到一个critical point呢?

举例来说,当w₁=0 w₂=0(原点),w₁对L的微分和w₂对L的微分,算出来就都是零,所以原点就是一个critical point,但它是local maxima。它是local maxima,local minima,还是saddle point呢,是看hessian才知道的

我们刚才已经遍历所有可能的w₁ w₂了,所以知道它是一个saddle point,但是现在假设还没遍历loss,所以我们要看看能不能用Hessian看出它是什么样的critical point,那怎么算出这个H呢?

H是一个矩阵,里面元素是L的二次微分,所以这个矩阵里面第一个row第一个coloumn的位置,就是w₁对L微分两次,第一个row第二个coloumn的位置,就是先用w₂对L作微分,再用w₁对L作微分,然后这边就是w₁对L作微分,w₂对L作微分,然后w₂对L微分两次,这四个值组合起来,就是我们的hessian,那这个hessian的值是多少呢?

如上就是H的式子,接着看它的eigen value,发现矩阵有两个eigen value,2跟-2 。回忆之前将的结论,eigen value有正有负,代表saddle point。

这个例子讲解完毕。我们可以从hessian矩阵看出一个critical point 是saddle point还是local minima

Don't afraid of saddle point

如果碰到saddle point,也许你就不用那么害怕了,因为H它不只可以帮助我们判断现在是不是在一个saddle point,它还指出了参数可以update的方向。怎么再看H呢,H怎么告诉我们update参数呢

如上图,假设u是H的特征矢量(eigenvector),然后λ是u的特征值(eigen value)

我们把v换成u的话,计算之后得到:

H乘上eigen vector特征矢量会得到特征值λ乘上eigen vector即λu。所以我们得到uᵀ乘上λu,然后再整理一下,把uᵀ跟u乘起来,得到‖u‖²,所以得到λ‖u‖²。

假设上面式子的v代表一个eigen vector,我们θ减θ'放的是一个eigen vector的话,会发现红色框就是λ‖u‖²。

当特征值λ小于零时,λ‖u‖²就会小于零,因为‖u‖²一定是正的,也就是u的transpose乘上H乘上u,它是负的,也就是红色这个框里是负的。所以假设θ-θ'=u,那这一项(θ-θ')^TH(θ-θ')就是负的,也就是L(θ)小于L(θ')。意味着你在θ'的位置加上u,沿着u的方向做update得到θ,你就可以让loss变小。

因此,虽然在critical point没有gradient,如果在一个saddle point,你也不一定要惊慌只要找出负的eigen value,再找出它对应的eigen vector,用这个eigen vector去加θ',就可以找到一个新的点,这个点的loss比原来还要低

举具体的例子

刚才我们已经知道原点是一个critical point,它的Hessian有一个负的eigen value等于-2,那它对应的eigen vector有无穷多个,我们取一个出来,取u=[1,1]^T,只要顺着这个u的方向去更新我们的参数,就可以找到一个比saddle point的loss还要更低的点。所以从这个角度来看,似乎saddle point并没有那么可怕。

如果在training的时候,你的训练停下来,你的gradient变成零,是因为saddle point的话,那似乎还有解。但是实际上,你几乎不会真的把Hessian算出来,这个是二次微分,要计算这个矩阵的computation,需要的运算量非常非常的大,更何况你还要把它的eigen value和eigen vector找出来,因此实际上你几乎没有看到有人用这一个方法来逃离saddle point

之后我们会讲其他逃离saddle point的方法。

Saddle Point v.s. Local Minima

讲到这边你就会有一个问题了,那到底saddle point跟local minima谁比较常见呢?这边我们要讲一个不相干的故事,如下图所示

这个故事发生在1543年,那一年君士坦丁堡沦陷,上图是君士坦丁堡沦陷图,君士坦丁堡本来是东罗马帝国的领土,然后被鄂图曼土耳其帝国占领了,然后东罗马帝国就灭亡了,在鄂图曼土耳其人进攻君士坦丁堡的时候,那时候东罗马帝国的国王是君士坦丁十一世,他不知道要怎么对抗土耳其人,有人就献上了一策,找来了一个魔法师叫做狄奥伦娜。

这是出自《三体》的故事。狄奥伦娜有一个能力跟张飞一样(张飞不是可以万军从中取上将首级,如探囊取物吗),他可以直接取得那个苏丹的头,他可以从万军中取得苏丹的头,大家想说狄奥伦娜怎么这么厉害,他真的有这么强大的魔法吗?所以大家就要狄奥伦娜先展示一下他的力量,这时候狄奥伦娜就拿出了一个圣杯,大家看到这个圣杯就大吃一惊,因为这个圣杯,本来是放在圣索菲亚大教堂的地下室,而且它是被放在一个石棺里面,这个石棺是密封的,没有人可以打开它。

但是狄奥伦娜从里面取得了圣杯,而且还放了一串葡萄进去,君士坦丁十一世为了要验证狄奥伦娜是不是真的有这个能力,就带了一堆人真的去撬开了这个石棺,发现圣杯真的被拿走了,里面真的有一串新鲜的葡萄。这样大家就知道狄奥伦娜真的有这个万军从中取上将首级的能力,那为什么迪奥伦娜可以做到这些事呢?那是因为这个石棺你觉得它是封闭的,那是因为你是从三维的空间来看,这个石棺是封闭的,没有任何路可以进去,但是狄奥伦娜可以进入四维的空间,从高维的空间中,这个石棺是有路可以进去的,它并不是封闭的。至于狄奥伦娜有没有成功刺杀苏丹呢,你可以想象一定是没有嘛,所以君坦丁堡才沦陷。(听得我想去看《三体》了hhhh)

总之这个从三维的空间来看,是没有路可以走的东西,在高维的空间中是有路可以走的,error surface会不会也一样呢

在一维的空间中的error surface好像到处都是local minima,但是会不会在二维空间来看,它就只是一个saddle point呢?常常会有人画类似这样的图,告诉你说Deep Learning的训练是非常复杂的,如果我们移动某两个参数,error surface的变化非常的复杂,是这个样子的,那显然它有非常多的local minima,我的这边现在有一个local minima,但是会不会这个local minima,只是在二维的空间中,看起来是一个local minima,在更高维的空间中,它看起来就是saddle point?在二维的空间中,我们没有路可以走,那会不会在更高的维度上(更高的维度我们没办法visualize它),其实有路可以走的,那如果维度越高,是不是可以走的路就越多了呢

所以今天我们在训练一个network的时候,参数往往动辄百万千万以上,error surface其实是在一个非常高的维度中,对不对?error surface竟然维度这么高,会不会其实有非常多的路可以走呢?那既然有非常多的路可以走,会不会其实local minima根本就很少呢?而经验上,如果你自己做一些实验的话,也支持这个假说。

如上图所示,这是训练某一个network的结果,每一个点代表训练那个network训练完之后,计算它的Hessian。然后把它训练训练,训练到gradient很小,卡在critical point,把那组参数出来分析,看看它比较像是saddle point还是比较像是local minima。

  • 纵轴代表training的时候,loss没办法再下降了,那个loss是多少,那很多时候,你的loss在还很高的时候,训练就不动了,就卡在critical point,那很多时候loss可以降得很低,才卡在critical point,这是纵轴的部分。
  • 横轴的部分是minimum ratio,minimum ratio是eigen value的数目分之正的eigen value的数目,又如果所有的eigen value都是正的,代表我们今天的critical point是local minima;如果有正有负代表saddle point,那在实作上你会发现说,你几乎找不到完全所有eigen value都是正的critical point,你看这边这个例子里面,这个minimum ratio代表eigen value的数目分之正的eigen value的数目,最大也不过0.5到0.6间而已,代表说只有一半的eigen value是正的,还有一半的eigen value是负的,所以今天虽然在这个图上,越往右代表我们的critical point越像local minima,但是它们都没有真的,变成local minima,就算是在最极端的状况,我们仍然有一半的case,我们的eigen value是负的,这一半的case eigen value是正的,代表说在所有的维度里面有一半的路,这一半的路,如果要让loss上升,还有一半的路可以让loss下降。

所以从经验上看起来,其实local minima并没有那么常见,多数的时候你train到一个地方,你gradient真的很小,然后所以你的参数不再update了,往往是因为你卡在了一个saddle point

说明:记录学习笔记,如果错误欢迎指正!写文章不易,转载请联系我。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值