在做Optimization的时候,会发现,随着参数不断的update,training的loss不会再下降,但是这个loss不够小, 甚至有些时候会发现,一开始model就train不起来,不管怎么update参数,loss通通都掉不下去,那这个时候到底发生了什么事情呢?过去常见的一个猜想:因为我们现在走到了一个地方,这个地方参数对loss的微分为零,当参数对loss微分为零的时候,gradient descent就没有办法再update参数了,这个时候training就停下来了,loss就不会再下降了。
不是只有local minima的gradient是零,还有其他可能会让gradient是零,比如说saddle point。saddle point就是gradient是零,像在右边这个例子里面红色的这个点,它在左右这个方向是比较高的,前后这个方向是比较低的,它就像是一个马鞍的形状,所以叫做saddle point,中文叫鞍点。
如果发现gradient很靠近零,但卡在了某个critical point,我们有没有办法知道,到底是local minima,还是saddle point?
为什么要辨别到底是卡在local minima,还是卡在saddle point呢
• 因为如果是卡在local minima,那可能就没有路可以走了,因为四周都比较高,你现在所在的位置已经是最低的点,loss最低的点了,往四周走loss都会比较高,你会不知道怎么走到其他的地方去
• saddle point没有这个问题,如果是卡在saddle point的话,saddle point旁边还是有路可以走的,还是有路可以让loss更低。
Momentum,这是一个有可以对抗 Saddle Point或 Local Minima 的技术。
假设 Error Surface 就是真正的斜坡,而我们的参数是一个球,把球从斜坡上滚下来,如果是Gradient Descent它走到 Local Minima 就停住了,走到 Saddle Point 就停住了,但是在物理的世界里一个球如果从高处滚下来,就算滚到 Saddle Point,因为惯性的关系它还是会继续往右走,甚至它走到一个 Local Minima,如果今天它的动量够大的话,它还是会继续往右走,甚至翻过这个小坡然后继续往右走
所以在物理的世界里面,一个球从高处滚下来的时候,不一定会被 Saddle Point,或 Local Minima 卡住。我们可以将惯性的概念用在 Gradient Descent 里面呢,这个就是Momentum 这个技术
Vanilla Gradient Descent
原来的 Gradient Descent 长得是什么样子,这个是 Vanilla 的 Gradient Descent,Vanilla 的意思就是一般的的意思,那一般的 Gradient Descent 长什么样子呢
一般的 Gradient Descent 是说,我们有一个初始的参数叫做Gradient我们计算一下 Gradient,然后计算完这个 Gradient 以后呢,我们往 Gradient 的反方向去 Update 参数,我们到了新的参数以后,再计算一次 Gradient,再往 Gradient 的反方向,再 Update 一次参数,到了新的位置以后再计算一次 Gradient,再往 Gradient 的反方向去 Update 参数,这个 Process 就一直这样子下去
Gradient Descent + Momentum
加上 Momentum 以后,每一次我们在移动我们的参数的时候我们不是只往 Gradient 的反方向来移动参数,我们是 Gradient 的反方向,加上前一步移动的方向,两者加起来的结果,去调整我们的参数,
那具体说起来是这样,找一个初始的参数,然后我们假设前一步参数的 Update 量为 0接下来计算 Gradient 的方向,然后要决定下一步怎么走,它是 Gradient 的方向加上前一步的方向,不过因为前一步正好是0,所以 Update 的方向,跟原来的 Gradient Descent 是一样的,但从第二步开始有加上 Momentum,接下来我们 Update 的方向,不是G的反方向,而是根据上一次 Update 方向,也就是 m1 减掉 g1,当做我们新的 Update 的方向,这边写成 m2
那我们就看下面这个图
加上 Momentum 以后,我们不是只根据 Gradient 的反方向,来调整我们的参数,我们也会看前一次 Update 的方向
• 如果前一次说要往蓝色及蓝色虚线这个方向走
• Gradient 说要往红色反方向这个方向走
• 把两者相加起来,走两者的折中,也就是往蓝色这一个方向走,所以我们就移动了 m2,走到 θ2 这个地方
每一步的移动,我们都用 m 来表示,那这个 m 其实可以写成之前所有算出来的Gradient 的 Weighted Sum ,m0 我们把它设为 0,m1 是 m0 减掉 g0,m0 为 0,所以 m1 就是 g0 乘上负的 η,m2 是 λ 乘上 m1,λ 就是另外一个参数, η 是 Learning Rate 我们要调,λ 是另外一个参数,这个也是需要调的,m2 等于λ 乘上 m1,减掉 η 乘上 g1,然后 m1 在哪里呢,m1 在这边,你把 m1 代进来,就知道说 m2,等于负的 λ 乘上 η 乘以 g0,减掉 η 乘上 g1,它是 g0 跟 g1 的 Weighted Sum