在文章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
现在我们要讲的是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呢?
所以鉴别今天我们走到critical point的时候,到底是local minima还是saddle point,是一个值得去探讨的问题,那怎么知道今天一个critical point,到底是属于local minima还是saddle point呢?
这边需要用到一点数学,以下这段其实没有很难的数学,就只是微积分跟线性代数,但如果你没有听懂的话,以下这段skip掉是没有关系的。
那怎么知道说一个点,到底是local minima还是saddle point呢?
你要知道我们loss function的形状,可是我们怎么知道loss function的形状呢,network本身很复杂,算出来的loss function显然也很复杂。
但是如果给定某一组参数,比如说蓝色的这个θ',在θ'附近的loss function是有办法被写出来的,它写出来就是右侧这个样子。所以这个L(θ)完整的样子写不出来,但是它在θ'附近可以用这个式子来表示它,这个式子是Tayler Series Appoximation泰勒级数展开,这个假设你在微积分的时候已经学过了,所以我就不会细讲这一串是怎么来的,但我们就只讲一下它的概念,这一串里面包含什么东西呢?
如果这边你觉得有点听不太懂的话,也没有关系。反正你就记得这个L(θ)的loss function,这个error surface在θ'附近可以写成这个样子,这个式子跟gradient和hessian两个东西有关系,gradient就是一次微分,hessian就是里面有二次微分的项目。
那如果我们今天走到了一个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而言,v^THv都大于零,那这种矩阵叫做正定矩阵(positive definite ),它所有的eigen value特征值都是正的。所以如果你今天算出一个hessian,你不需要把它跟所有的v都乘起来,你只要去直接看这个H的eigen value,如果你发现:
那如果刚才讲的,你觉得你没有听得很懂的话,我们这边举一个例子。
我们现在有一个史上最废的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。
如果碰到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跟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。
所以从经验上看起来,其实local minima并没有那么常见,多数的时候你train到一个地方,你gradient真的很小,然后所以你的参数不再update了,往往是因为你卡在了一个saddle point。
说明:记录学习笔记,如果错误欢迎指正!写文章不易,转载请联系我。