优化器
优化的目的是找到一组使得损失最小的参数,一般是使用梯度下降的方式。
SGD
随机梯度下降。
SGD更新参数的方式是简单地用原值减去学习率*梯度。
θ
t
=
θ
t
−
1
−
η
Δ
L
(
θ
t
−
1
)
\theta^t = \theta^{t-1} - ηΔL(\theta^{t-1})
θt=θt−1−ηΔL(θt−1)
这样更新参数最为直接简单,但是会导致 梯度为0时参数不更新,但这个参数并不是全局最优解只是一个局部最优解,卡在local minima的问题。
import torch
torch.optim.SGD(params,lr)
SGDM
目的是防止梯度消失从而导致参数不会更新的情况
在SGD的基础上引入了动量,参数更新不仅受梯度的影响还受先前的动量的影响,即使梯度为0,参数还是会继续更新。
v
0
=
0
v
1
=
λ
v
0
−
η
L
(
θ
0
)
θ
1
=
θ
0
+
v
1
.
.
.
.
.
.
.
.
v
t
=
λ
v
t
−
1
−
η
L
(
θ
t
−
1
)
θ
t
=
θ
t
−
1
+
v
t
v^{0} = 0 \\ v^{1} = λv^{0} -\eta L(\theta^{0}) \\ \theta^1 = \theta^{0} +v^{1} \\ ........ \\ v^{t} = λv^{t-1} -\eta L(\theta^{t-1}) \\ \theta^t = \theta^{t-1} +v^{t}
v0=0v1=λv0−ηL(θ0)θ1=θ0+v1........vt=λvt−1−ηL(θt−1)θt=θt−1+vt
λ,η都是超参数,λ为动量的权重0<λ<1,η为学习率
这种方法的优点是可以防止卡在local minma 甚至是鞍点,下降更快。
import torch
torch.optim.SGD(params,lr,momentum)
Adagrad
目的是通过改变学习率的权重方式加快收敛的速度,以较大的learning rate 快速下降,后续learning rate 变小更精确的找到最优解。
这个方法的缺点很明显,如果learning rate 一开始就很大,没走几步就会变得很小,然后可能会卡住,这是因为η下面的分母是无限累加的。
import torch
torch.optim.Adagrad(params,lr)
RMSProp
RMSProp则是针对Adagrad的学习率下面的状态变量无无限变大的情况做出的改进。
这里根据Adagrad 对学习率下面的状态变量做出改变,状态变量是指数加权移动平均,引入了超参数α,这样在更新参数时学习率不会一直累加,有可能是只加一点点或者不变。
import torch
torch.optim.RMSprop(params,lr,alpha)
Adam
Adam 则是结合了RMSProp和SGDM,也是当前用的最多的一个优化器。
import torch
torch.optim.Adam(params,lr)
SWATS: begin with Adam(fast) ,end with SGDM
这里可以选择手动切换,开始用Adam判断多少个epoch后使用SGDM,或达到什么要求切换优化器
文章中的图片均来自李宏毅老师的上课幻灯片