optim优化器的使用

12 篇文章 1 订阅
3 篇文章 0 订阅

**

一、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

  • 0
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值