pytorch中SGD的動(dòng)量實(shí)現(xiàn)是如下這個(gè)樣子的
if momentum != 0:
param_state = self.state[p]
if 'momentum_buffer' not in param_state:
buf = param_state['momentum_buffer'] = d_p.clone()
else:
buf = param_state['momentum_buffer']
buf.mul_(momentum).add_(1 - dampening, d_p)
if nesterov:
d_p = d_p.add(momentum, buf)
else:
d_p = buf
p.data.add_(-group['lr'], d_p)
將pytorch的實(shí)現(xiàn)翻譯為公式怜森,就是如下這個(gè)樣子:
為什么說它詭異呢蹈胡?因?yàn)樗cPolyak, Sutskever等人的論文中的表達(dá)方式是不同的:
是學(xué)習(xí)率贪染,是動(dòng)量因子廉邑。
對一下柜思,其實(shí)就是換了個(gè)位置寄雀,從傳統(tǒng)的換到了滨达。 但是其實(shí)通過展開奶稠,可以發(fā)現(xiàn),在學(xué)習(xí)率保持不變的的情況下捡遍,這兩種實(shí)現(xiàn)方式是等價(jià)的锌订。而在學(xué)習(xí)率變化的情況下,直觀的來說画株,前一種方法學(xué)習(xí)率會(huì)立馬作用在動(dòng)量上:
使得學(xué)習(xí)率的更改立馬產(chǎn)生效果辆飘,而使用原始的方法往往要好幾個(gè)batch之后學(xué)習(xí)率才生效(因?yàn)閯?dòng)量太大了)。
因此谓传,一般來說使用pytorch采用的實(shí)現(xiàn)方法會(huì)適用一些蜈项。
[1]https://zhuanlan.zhihu.com/p/43016574
[2]https://github.com/pytorch/pytorch/issues/1099