Standard Gradient Update:沿着梯度的反方向改变参数(梯度指示增长的方向,我们通常希望最小化损失函数)。假设一个参数向量x和梯度dx,其更新公式为:
# Vanilla update
x += - learning_rate * dx
Momentum Update:这种更新方式从物理角度看待优化问题,在深度网络上往往能有更好的收敛率。具体而言,损失可以视为山丘地区的高度(因此有势能U=mgh,且U∝h),用随机数初始化参数视为给一个在某处的粒子0初始速度。那么优化过程可以视为粒子在地表滚动过程的模拟。
粒子上的作用力和势能的梯度相关,这个力正好是损失函的(负)梯度。并且F=ma,所以(负)梯度又和粒子的加速度成比例。注意这里和上面的SGD更新不同,SGD中梯度直接影响位置。而在物理视角中梯度直接影响速度,间接影响位置:
# Momentum update
v = mu * v - learning_rate * dx # integrate velocity
x += v # integrate position
这里引入了一个额外的超参数mu,它被称为动量(一般值在0.9左右),但它的物理意义更接近摩擦系数。可以看到,这个变量减小速度,并且降低系统的势能,不然粒子永远不会在山丘底部停下。
在交叉验证时,这个参数一般设置成 [0.5, 0.9, 0.95, 0.99]。类似于学习率的退火规划,优化有时也能受益于动量规划,比如初始