参数的更新

来源:互联网 发布:c语言 生成随机数 编辑:程序博客网 时间:2024/06/03 16:54

参数的更新有许多方法;

1.Vanilla update
最简单的更新形式。假定x是参数矢量,dx是梯度。更新形式为:

 # Vanilla updatex+=-leaning_rate*dx

其中learning_rate是学习率。

2Mumentum update
在深度网络中,通常能够得到更好的收敛速率。这种更新方法来源于优化问题的物理学上的观点。特别的,损失函数可以解释为山丘的高(也可以说成是势能,因为U=mgh,其中U表示重力势能,m是质量, g是重力加速度, h是高度,Uh,即势能 正比于高度)。将参数初始化为随机的数等同于将某个粒子放在某个位置,并且速度设置为0。因此,优化的过程可以看作等价于参数矢量(例如一个粒子)在地形上滚动。

因为粒子上的力与势能的梯度相关(例如 F=UE=Fds,其中s表示距离),粒子所拥有的力等于损失函数的负梯度。此外,F=ma,因此负梯度正比于粒子的加速度。
Vanilla update 中的更新过程,将梯度直接整合位置(位置的更新直接使用了当前位置的梯度),Mumentum update中:梯度仅直接影响到速度,速度反过来才影响到位置。

#Momentum updatev=mu*v-learning_rate*dx          #integrate velocityx+=v                             #intergrate position            

上面的两个公式中,我们可以看到,第一个公式描述了梯度dx和速度v的关系,第二个公式描述了速度v和距离的关系。v是速度,我们初始化为0。mu就是我们说的动量,通常大于为0.9,其物理意义相当于摩擦系数,从效果上看,该变量抑制了速度并且降低系统的动能,否则的话,粒子不会在山低停止运动。使用交叉验证时,该参数通常设置值,如为[0.5,0.9,0.95,0.99]。

Nesterov Momentum
Nesterov Momentum与Momentum update轻微的不同。对于凸函数,其具有更强的理论上的收敛保障,并且在实际应用中,一般略优于标准的Momentum 。

Nesterov Momentum的核心思想是,当前参数矢量在某个位置x处,那么我们看一下上面Momentum update更新,可以看到动量项(mu*v)将单独地(也就是说,忽略带有梯度的第二项)通过mu*v推进参数矢量。那么我们可以试想一下,如果我们将要计算梯度,那么我们可将其未来的近似位置x+mu*v看作是“预先”,这个点是我们将要达到的点的附近。因此,我们可以计算x+mu*v处的梯度来替代“旧”位置x处的梯度。

这里写图片描述

上图(左):红色的原点表示当前位置x,绿色的箭头表示向量:mu*v,红色的箭头表示向量:-learning_rate * dx ,蓝色的箭头表示向量: v ,最终的位置为:红色的点+向量v,移动到蓝色箭头处。

上图(右):红色的原点表示当前位置x,绿色的箭头表示向量:mu*v,红色的箭头表示向量:-learning_rate * d(x+mu*v) ,蓝色的箭头表示向量: v ,最终的位置为:红色的点+向量v,移动到蓝色箭头处。

即更新过程描述如下:

x_ahead = x + mu * v# evaluate dx_ahead (the gradient at x_ahead instead of at x)v = mu * v - learning_rate * dx_aheadx += v

但是,在实际应用中,人们希望其更新表达形式类似于vanilla SGD 或者momenum update,即修改为下面的形式。

v_prev = v # back this upv = mu * v - learning_rate * dx # velocity update stays the samex += -mu * v_prev + (1 + mu) * v # position update changes form

http://cs231n.github.io/neural-networks-3/

0 0