Adam可以看作是RMSprob和动量SGD的结合
目的在于抑制震荡加速收敛
Adam
\(while \theta_t 不收敛\)
计算损失函数关于\(\theta\)的梯度\(g_{\theta}\)
\(t = t + 1\)
计算一阶动量项
\(s_t=\alpha_1s_{t-1} + (1 - \alpha_1)g_{\theta}\)
计算二阶动量项
\(v_t=\alpha_2v_{t-1} + (1-\alpha_2)g_{\theta}^2\)
动量项修正
\(\hat s_t = \frac{s_t}{1 - \alpha_1^t}\)
\(\hat v_t = \frac{v_t}{1 - \alpha_2^t}\)
更新
\(\theta_t = \theta_{t-1}-\alpha \frac{\hat s_t}{\sqrt{\hat v_t}+\epsilon}\)
Adamw
带正则项的损失函数为
$$L=loss + \frac{1}{2}||\theta||^2$$
在实际更新参数时是按照权重衰减的方式进行更新的具体如下式
$$\theta_t = \theta_{t-1} - \alpha \frac{\partial loss}{\partial \theta}|_{\theta=\theta_{t-1}} - \alpha \theta_{t-1}$$
其中后面一项对应L2正则项的导数。
在实际计算时往往是直接更新未加正则项的损失函数的梯度然后减去一个权重衰减项,这只在SGD中与直接计算整体损失函数的梯度等价,而在带动量的SGD或者Adam中均不等价,比如计算带动量的SGD更新时,采用两种方式更新的方式分别为
\(v_t = \alpha v_{t-1} + (1 - \alpha)\frac{\partial loss}{\partial \theta}\)
1.\(\theta_t = \theta_{t-1} - \epsilon v_t - \epsilon \theta_{t-1}\)
2.\(\theta_t = \theta_{t-1} - \epsilon v_t - \epsilon (1 - \alpha) \theta_{t-1}\)
在Adam中的差别将会更大,Adamw则是在Adam的更新策略中采用了计算整体损失函数的梯度来进行更新而不是只计算不带正则项部分的梯度进行更新之后再进行权重衰减。