这篇讲下我对这两个方法的理解。
Momentum动量
首先讲动量方法,它的基本迭代通常可以表述为
(1)
这里的
表示衰减因子,可以理解为对以前方向的依赖程度,注意到如果
,那就变成了普通的梯度方法了。有时会看到下面这种写法:
![[公式]](https://www.zhihu.com/equation?tex=%5C%5B+%5Cbegin%7Barray%7D%7Bl%7D+v_t+%3D+%5Cmu_%7Bt-1%7Dv_%7Bt-1%7D+-+%5Cnabla+g%28%5Ctheta_%7Bt-1%7D%29+%5C%5C+%5Ctheta_t+%3D+%5Ctheta_%7Bt-1%7D+%2B+%5Cepsilon_%7Bt-1%7Dv_t+%5Cend%7Barray%7D+%5C%5D)
其实这是一样的。 这里我想推导下另外一种等价形式。
![[公式]](https://www.zhihu.com/equation?tex=%5C%5B+%5Cbegin%7Bsplit%7D+%5Ctheta_t++%26%3D+%5Ctheta_%7Bt-1%7D+%2B+v_t+%5C%5C+++++++++++++++%26+%3D+%5Ctheta_%7Bt-1%7D+%2B+%5Cmu_%7Bt-1%7Dv_%7Bt-1%7D+-+%5Cepsilon_%7Bt-1%7D%5Cnabla+g%28%5Ctheta_%7Bt-1%7D%29+%5C%5C++++++++++++++%26+%3D+%5Ctheta_%7Bt-1%7D+%2B+%5Cmu_%7Bt-1%7D%28%5Ctheta_%7Bt-1%7D+-+%5Ctheta_%7Bt-2%7D%29+-+%5Cepsilon_%7Bt-1%7D%5Cnabla+g%28%5Ctheta_%7Bt-1%7D%29++%5Cend%7Bsplit%7D+%5C%5D)
然后我们引入一个中间变量
,并令它满足
![[公式]](https://www.zhihu.com/equation?tex=y_%7Bt-1%7D+%3D+%5Ctheta_%7Bt-1%7D+%2B+%5Cmu_%7Bt-1%7D%28%5Ctheta_%7Bt-1%7D+-+%5Ctheta_%7Bt-2%7D%29)
这样我们就得到了新的迭代形式
(2)
Nesterov加速
Nesterov加速方法的基本迭代形式为
(3)
和动量方法的区别在于二者用到了不同点的梯度,动量方法采用的是上一步
的梯度方向,而Nesterov加速方法则是从
朝着
往前一步。 一种解释是,反正要朝着
方向走,不如先利用了这个信息,这个叫未卜先知。 接下来我来推导出第二种等价形式
![[公式]](https://www.zhihu.com/equation?tex=%5C%5B+%5Cbegin%7Bsplit%7D+%5Ctheta_t+%26%3D+%5Ctheta_%7Bt-1%7D+%2B+v_t+%5C%5C++++++++++++++%26+%3D+%5Ctheta_%7Bt-1%7D+%2B%5Cmu_%7Bt-1%7Dv_%7Bt-1%7D+-+%5Cepsilon_%7Bt-1%7D%5Cnabla+g%28%5Ctheta_%7Bt-1%7D+%2B+%5Cmu_%7Bt-1%7Dv_%7Bt-1%7D%29+%5C%5C++++++++++++++%26+%3D+%5Ctheta_%7Bt-1%7D+%2B%5Cmu_%7Bt-1%7D%28%5Ctheta_%7Bt-1%7D+-+%5Ctheta_%7Bt-2%7D%29+-+%5Cepsilon_%7Bt-1%7D%5Cnabla+g%28%5Ctheta_%7Bt-1%7D+%2B+%5Cmu_%7Bt-1%7D%28%5Ctheta_%7Bt-1%7D+-+%5Ctheta_%7Bt-2%7D%29%29++%5Cend%7Bsplit%7D+%5C%5D)
然后引入中间变量
,使得它满足
![[公式]](https://www.zhihu.com/equation?tex=y_%7Bt-1%7D+%3D+%5Ctheta_%7Bt-1%7D+%2B%5Cmu_%7Bt-1%7D%28%5Ctheta_%7Bt-1%7D+-+%5Ctheta_%7Bt-2%7D%29+)
然后得到第二种等价形式
(4)
这可以理解为,先走个梯度步,然后再走个加速步。 我最早了解到Nesterov加速方法就(4)这种形式,看很多优化方面的文章,都是(4)这种形式,比如在FISTA方法中。 (3)这种形式是在看深度学习相关文献时了解到的,一开始看到二者的不同有点懵逼,后面才知道二者是等价的,这下就舒畅了。