Optimization的时候,怎么把gradient descent做的更好?
1、局部最小值(Local minima)与鞍点(saddle point)
所谓的saddle point其实就是gradient是零,但是不是local minima,也不是local maxima;比如下面的saddle point,他在左右方向上是比较高的,前后的方向上是比较高的,他是一个马鞍的形状,所以叫做saddle point;
像saddle point这种地方,他也是gradient为零,但他不是local minima,像这种gradient为0的点统称为critical point,所以你可以说你的loss没有办法再下降,也许是因为卡在了critical point,但你不能说是卡在了local minima,因为saddle point也是微分为零的点;
所以当gradient为0的时候,我们就要搞清楚是卡在了local minima上还是saddle point上,如果是卡在了local minima上的话,因为四周都比较高,你现在所在的位置已经是loss最低点,往四周走loss都比较高,你会不知道怎么走到其他的地方去;但是saddle point就比较没有这个问题,如果你是卡在saddle point上的话,saddle point旁边还是有路可以让你的loss更低,只要逃离saddle point,就有可能让你的loss更低,所以当你走到critical point的时候,我们到底是在local minima上还是saddle point上,是一个值得去探讨的问题;
判断该点到底是local minima还是saddle point,需要用到数学的微积分和线性代数:
现在我们要讲的是Optimization的部分,所以我们要讲的东西基本上跟Overfitting没有什麼太大的关联,我们只讨论Optimization的时候,怎麼把gradient descent做得更好,那為什麼Optimization会失败呢?
你常常在做Optimization的时候,你会发现,随著你的参数不断的update,你的training的loss不会再下降,但是你对这个loss仍然不满意,就像我刚才说的,你可以把deep的network,跟linear的model,或比较shallow network 比较,发现说它没有做得更好,所以你觉得deepnetwork,没有发挥它完整的力量,所以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呢?
Warning of Math
这边需要用到一点数学,以下这段其实没有很难的数学,就只是微积分跟线性代数,但如果你没有听懂的话,以下这段skip掉是没有关係的
那怎麼知道说一个点,到底是local minima,还是saddle point呢?
你要知道我们loss function的形状,可是我们怎麼知道,loss function的形状呢,network本身很复杂,用复杂network算出来的loss function,显然也很复杂,我们怎麼知道loss function,长什麼样子,虽然我们没有办法完整知道,整个loss function的样子
Tayler Series Approximation
但是如果给定某一组参数,比如说蓝色的这个θ ′ ,在θ ′ 附近的loss function,是有办法被写出来的,它写出来就像是这个样子
所以这个L ( θ ) 完整的样子写不出来,但是它在θ ′ 附近,你可以用这个式子来表示它,这个式子是,Tayler Series Appoximation泰勒级数展开,这个假设你在微积分的时候,已经学过了,所以我就不会细讲这一串是怎麼来的,但我们就只讲一下它的概念,这一串裡面包含什麼东西呢?
第一项是L ( θ ′ ) ,就告诉我们说,当θ跟θ ′ 很近的时候,L ( θ ) 应该跟L ( θ ′ ) 还蛮靠近的
第二项是
g是一个向量,这个g就是我们的gradient,我们用绿色的这个g来代表gradient,这个gradient会来弥补,θ ′ 跟θ 之间的差距,我们虽然刚才说θ ′ 跟θ ,它们应该很接近,但是中间还是有一些差距的,那这个差距,第一项我们用这个gradient,来表示他们之间的差距,有时候gradient会写成∇ L ( θ ′ ) ,这个地方的g 是一个向量,它的第i个component,就是θ的第i个component对L的微分,光是看g还是没有办法,完整的描述L(θ),你还要看第三项
第三项跟Hessian有关,这边有一个$H $
https://www.bilibili.com/video/BV1Wv411h7kN?p=11
笔记:
https://blog.csdn.net/pigpigpig64/article/details/119061752
https://zhuanlan.zhihu.com/p/437609102
泰勒展开式:https://www.zhihu.com/question/25627482/answer/313088784