优化器
- 优化器
- SGD
- Adagrad
- Adadelta
- RMSprop
- Adam
- AdamW
SGD
随机梯度下降
问题:训练轨迹会呈现锯齿状,这无疑会大大延长训练时间。同时,由于存在摆动现象,学习率只能设置的较小,才不会因为步伐太大而偏离最小值。
Momentum:将一段时间内的梯度向量进行了加权平均,分别计算得到梯度更新过程中参数的大致走向,一定程度上消除了更新过程中的不确定性因素(如摆动现象),使得梯度更新朝着一个越来越明确的方向前进。\(\beta\) 常取0.9,0.9 的 60 次方约等于 0.001,相当仅考虑最近的60轮迭代所产生的的梯度。
Adagrad
AdaGrad对学习率进行了一个约束,对于经常更新的参数,我们已经积累了大量关于它的知识,不希望被单个样本影响太大,希望学习速率慢一些;对于偶尔更新的参数,我们了解的信息太少,希望能从每个偶然出现的样本身上多学一些,即学习速率大一些。
AdaGrad引入了二阶动量。二阶动量是迄今为止所有梯度值的平方和,即\(v_t=\sum_{i=1}^{t}g_i^2\)
优点:AdaGrad消除了手动调整学习率的需要。AdaGrad在迭代过程中不断调整学习率,并让目标函数中的每个参数都分别拥有自己的学习率。
缺点:1. 分母会不断积累,这样学习率就会收缩并最终会变得非常小。2. 需要设置全局学习率
Adadelta
这个算法是对 Adagrad 的改进,主要从两个方面进行改进:
-
解决学习率逐渐下降至 0 的问题:
Adadelta 在一个窗口 w 中对梯度进行求和,而不是对梯度一直累加。但由于需要存储前w个状态,比较麻烦。AdaDelta使用了类似动量因子的平均方法(分母相当于使用了梯度的均方根 \(RMS\)):\[ v_t=\beta * v_{t-1} + (1-\beta) * g_t^2 \]\[ \theta_t=\theta_{t-1} - \frac{\eta}{\sqrt{v_t+\epsilon}}*g_t \] -
解决依赖全局学习率的问题:
将学习率 \(\eta\) 换成了 \(RMS[\Delta \theta]\):\[ \theta_t=\theta_{t-1}-\frac{RMS[\Delta \theta]_{t-1}}{RMS[g]_t}*g_t \]修改为动量形式(\(\beta\) 一般取 0.9):
\[ \begin{align*}v_t&=\beta * v_{t-1}+(1-\beta)* g_t^2 \\\theta_t&=\theta_{t-1}- \frac{\sqrt{u_{t-1}+\epsilon}}{\sqrt{v_t+\epsilon}}g_t\\u_t&=\beta * u_{t-1}+(1-\beta)*\Delta \theta_t^2 \\\end{align*} \]
RMSprop
RMSprop是为了解决 Adagrad 学习率急剧下降问题,与 Adadelta 的第1个形式相同(\(\beta\) 常取 0.9):
Adam
Adam 计算每个参数的自适应学习率,相当于 RMSprop + Momentum,并进行了偏差修正
因为 \(m_t\) 和 \(v_t\) 被初始化为 0 向量,所以在刚开始迭代的时候是有偏的,需要进行偏差修正,修正系数分别为 \(1-\beta_1^t\) 和 \(1-\beta_2^t\) ,随着迭代的进行(\(t\) 增加),估计逐渐变为无偏估计,修正强度逐渐降低为1。
分子表示在过去一段时间内各分量的平均值,即梯度更新的大致走向,分母表示在过去一段时间内各分量的平均大小。相当于分两步走,第一步是确定一个合适的下降方向(即分子项),第二步,对这个选定的方向上的各个子方向做一下微调(分母项),这样,推进较快的子方向会慢下来,推进较慢的子方向会加快速度,动态调整了各个子方向的学习率。因此,Adam结合了Momentum和RMSprop两种算法的优点。
AdamW
Adam+权重衰减