**
一、pytorch中优化器可以使用的最简版本为:
**
参考:https://blog.csdn.net/qq_42109740/article/details/105401197
for input, target in dataset:
optimizer.zero_grad()
output = model(input)
loss = loss_fn(output, target)
loss.backward()
optimizer.step()
构建优化器:
为单个参数进行优化时:
例子:
optimizer = optim.SGD(model.parameters(), lr = 0.01, momentum=0.9)
为多个参数设置不同学习率时:
例子:
optim.SGD([
{'params': model.base.parameters()},
{'params': model.classifier.parameters(), 'lr': 1e-3}
], lr=1e-2, momentum=0.9)
这意味着model.base的参数将会使用1e-2的学习率,model.classifier的参数将会使用1e-3的学习率,并且0.9的momentum将会被用于所 有的参数。
按照更新方法,可以分为
二、三种类型的梯度下降:
1,随机梯度下降算法(SGD):(对每个训练样本更新以此网络参数,这样使得网络更新参数速度很快,但是问题就是由于训练数据多样,容易朝偏离网络最优点方向训练,网络训练不稳定。)
**class torch.optim.SGD(params, lr=, momentum=0, dampening=0, weight_decay=0, nesterov=False)[source]**
params (iterable) – 待优化参数的iterable或者是定义了参数组的dict
lr (float) – 学习率
momentum (float, 可选) – 动量因子(默认:0)
weight_decay (float, 可选) – 权重衰减(L2惩罚)(默认:0)
dampening (float, 可选) – 动量的抑制因子(默认:0)
nesterov (bool, 可选) – 使用Nesterov动量(默认:False)
例子:
optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9)
optimizer.zero_grad()
loss_fn(model(input), target).backward()
optimizer.step()
公式:
v=ρ∗v+g
p=p−lr∗v = p - lr∗ρ∗v - lr∗g
ρ是动量,v是速率,g是梯度,p是参数。
需要注意:
其他框架中:
v=ρ∗v+lr∗g
p=p−v = p - ρ∗v - lr∗g
其实差别就是在ρ∗v这一项,pytorch中将此项也乘了一个学习率。
2,BGD批量归一化算法:
经过一个完整一轮训练后才更新以此参数,这使得梯度下降过程变得比较慢,并且需要很大内存保存中间结果。
3.小批量梯度下降(MBGD)
小批量梯度下降是批量梯度下降与随机梯度下降之间的一个折中,即经过一个小批量的训练数据更新一次参数,可以保证网络训练速度不太慢,也能使训练方向不至于偏离太多,具有一定稳定性。当使用小批量梯度下降时,通常也使用SGD这个术语。
三、梯度下降优化算法:
具体公式参考:https://blog.csdn.net/qq_42109740/article/details/105401197
1、Adam自适应学习算法:
torch.optim.Adam(params, lr=0.001, betas=(0.9, 0.999), eps=1e-08, weight_decay=0, amsgrad=False)
params (iterable) – 待优化参数的iterable或者是定义了参数组的dict
lr (float, 可选) – 学习率(默认:1e-3)
betas (Tuple[float, float], 可选) – 用于计算梯度以及梯度平方的运行平均值的系数(默认:0.9,0.999)
eps (float, 可选) – 为了增加数值计算的稳定性而加到分母里的项(默认:1e-8)
weight_decay (float, 可选) – 权重衰减(L2惩罚)(默认: 0)
2、Adadelta算法:
torch.optim.Adadelta(params, lr=1.0, rho=0.9, eps=1e-06, weight_decay=0)
params:参数的可迭代以优化或命令定义参数组(需要梯度下降的参数)
rho:用于计算平方梯度的移动平均值的系数(默认值:0.9)
eps:分母中添加的项以提高数值稳定性(默认值:1e-6)
lr:在将增量应用到参数之前缩放增量的系数(默认值:1.0)
weight_decay:重量衰减(L2惩罚)(默认值:0)
3、Adagrad算法
torch.optim.Adagrad(params,lr = 0.01,lr_decay = 0,weight_decay = 0,initial_accumulator_value = 0,eps = 1e-10 )
params(可迭代)–参数的可迭代以优化或命令定义参数组
lr(float,可选)–学习率(默认值:1e-3)
betas(Tuple [ float,float ] ,可选)–用于计算梯度及其平方的移动平均值的系数(默认值:(0.9,0.999))
eps(float,可选)–分母中添加的项,以提高数值稳定性(默认值:1e-8)
weight_decay(float,可选)–重量衰减(L2惩罚)(默认值:0)
amsgrad(boolean ,optional)–是否使用《论亚当与超越的收敛》一文中的该算法的AMSGrad变体 (默认值:False)
4、AdamW算法。
torch.optim.AdamW(PARAMS,LR = 0.001,贝塔=(0.9,0.999) ,EPS = 1E-08,weight_decay = 0.01,amsgrad =假)
params (iterable) – 参数的可迭代以优化或命令定义参数组
lr (float, optional) – 学习率(默认值:1e-3)
betas (Tuple[float, float], optional) – 用于计算梯度及其平方的移动平均值的系数(默认值:(0.9,0.999))
eps (float, optional) –分母中添加的项,以提高数值稳定性(默认值:1e-8)
weight_decay (float, optional) – 权重衰减系数(默认值:1e-2)
amsgrad (boolean, optional) – 是否使用《 On the Convergence of Adam and Beyond》一文中的该算法的AMSGrad变体 (默认值:False)
剩下的可参考
https://pytorch.org/docs/stable/optim.html?highlight=optim#module-torch.optim