损失函数和优化器

损失函数

神经网络优化,即优化网络权值使得损失函数值变小。
具体可采用的损失函数参考pytorch教程。

例子
#选定损失函数
criterion = nn.CrossEntropyLoss()  
#....省略次要代码
#在训练过程中调用,计算损失
loss = criterion(outputs, labels)

优化器基类: Optimizer

pytorch 中所有优化器都是Optimizer子类, eg: optim.Adadelta,optim.SGD
还定义了一些常用的方法

参数组

optimizer对参数的管理是基于组,为每一组参数配置lr,momentum,weight_decay
参数组在 optimizer 中表现为一个 list(self.param_groups),
其中每个元素是字典,表示一个参数及其相应配置,在 dict 中包含’params’、‘weight_decay’()、‘lr’(学习率) 、‘momentum’(动量)等字段。

优化器基类中定义的方法
  1. zero_grad()
    用于将梯度清零,pytorch不会自动清零梯度,所以每次更新前会进行该操作

  2. state_dict()
    获取当前模型的当前参数,返回一个字典,key为各层参数名,value为参数值

  3. load_state_dict(state_dict)
    用于将state_dict 中的参数加载到当前网络,常用于迁移学习

  4. add_param_group()
    给 optimizer 管理的参数组中增加一组参数,可为该组参数定制 lr, momentum, weight_decay 等,在 finetune 中常用。

  5. step(closure)
    执行一步权值更新, 其中可传入参数 closure(一个闭包)。如,当采用 LBFGS优化方法时,需要多次计算,
    因此需要传入一个闭包去允许它们重新计算 loss

常用优化器

调用 import torch.optim as optim

1. torch.optim.SGD(params,lr,momentum,dampening,weight_decay,nesterov=False)

可实现 SGD 优化算法,带动量 SGD 优化算法,带 NAG(Nesterov accelerated gradient)动量 SGD 优化算法,并且均可拥有 weight_decay 项。

参数:
lr-学习率
momentum-动量
dampening-不了解,定义为0.1就好,采用了nesterov,dampening必须为0
weight_decay-权值衰减系数,L2正则项的系数
nesterov- 是否使用NAG

2. torch.optim.ASGD(params, lr=0.01, lambd=0.0001, alpha=0.75, t0=1000000.0, weight_decay=0)

ASGD 也成为 SAG,均表示随机平均梯度下降
详细看论文 http://riejohnson.com/rie/stograd_nips.pdf

参数:
lr- 初始学习率,可按需随着训练过程不断调整学习率。
lambd- 衰减项,默认值 1e-4。
alpha- power for eta update ,默认值 0.75。
t0- point at which to start averaging,默认值 1e6。
weight_decay- 权值衰减系数,也就是 L2 正则项的系数。

3. torch.optim.Adadeltaa(params, lr=1.0, rho=0.9, eps=1e-06, weight_decay=0)

实现 Adadelta 优化方法。Adadelta 是 Adagrad 的改进。Adadelta 分母中采用距离当前时间点比较近的累计项,这可以避免在训练后期,学习率过小。

4. torch.optim.RMSprop(params, lr=0.01, alpha=0.99, eps=1e-

08, weight_decay=0, momentum=0, centered=False)

实现 RMSprop 优化方法,RMS 是均方根的意思。RMSprop 和 Adadelta 一样,也是对 Adagrad 的一种改进。这可以避免在训练后期,学习率过小

5. torch.optim.Adam(params, lr=0.001, betas=(0.9, 0.999), eps=1e-08, weight_decay=0, amsgrad=False)

实现 Adam(Adaptive Moment Estimation))优化方法。
Adam 是一种自适应学习率的优化方法,Adam利用梯度的一阶矩估计和二阶矩估计动态的调整学习率。吴老师课上说过,Adam 是结合了 Momentum 和 RMSprop,并进行了偏差修正。

参数:
amsgrad- 是否采用 AMSGrad 优化方法

6. torch.optim.Adamax(params, lr=0.002, betas=(0.9, 0.999), eps=1e-08, weight_decay=0)

实现 Adamax 优化方法。Adamax 是对 Adam增加了一个学习率上限的概念,所以也称之为 Adamax。

7. torch.optim.LBFGS(params, lr=1, max_iter=20, max_eval=None, tolerance_grad=1e-05, tolerance_change=1e-09, history_size=100, line_search_fn=None)

实现 L-BFGS优化方法。L-BFGS 属于拟牛顿算法。L-BFGS 是对 BFGS 的改进,特点就是节省内存。

学习率调整方法
1. torch.optim.lr_scheduler.StepLR(optimizer, step_size, gamma=0.1, last_epoch=-1)

等间隔调整学习率,调整倍数为 gamma 倍,调整间隔为 step_size。间隔单位是step。需要注意的是,step 通常是指 epoch,不要弄成 iteration 了

参数:

step_size(int)- 学习率下降间隔数,若为 30,则会在 30、60、90…个 step 时,将学习率调整为 lr*gamma。
gamma(float) - 学习率调整倍数,默认为 0.1 倍,即下降 10 倍。

2. torch.optim.lr_scheduler.MultiStepLR(optimizer, milestones, gamma=0.1, last_epoch=-1)

按设定的间隔调整学习率。这个方法适合后期调试使用,观察 loss 曲线,为每个实验定制学习率调整时机。

参数:
milestones(list)- 一个 list,每一个元素代表何时调整学习率,list 元素必须是递增的。如 milestones=[30,80,120]
gamma(float)- 学习率调整倍数,默认为 0.1 倍,即下降 10 倍。
last_epoch(int)- 上一个 epoch 数,这个变量用来指示学习率是否需要调整。当last_epoch 符合设定的间隔时,就会对学习率进行调整。当为-1 时,学习率设置为初始值。

3.torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma, last_epoch=-1)

按指数衰减调整学习率,调整公式: lr = lr * gamma ** epoch

参数:
gamma- 学习率调整倍数的底,指数为 epoch,即 gamma ** epoch
last_epoch(int)- 上一个 epoch 数,这个变量用来指示学习率是否需要调整。当
last_epoch 符合设定的间隔时,就会对学习率进行调整。当为-1 时,学习率设置为初始值。

4.torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode=‘min’,factor=0.1, patience=10, verbose=False, threshold=0.0001, threshold_mode=‘rel’, cooldown=0, min_lr=0, eps=1e-08)

当某指标不再变化(下降或升高),调整学习率,这是非常实用的学习率调整策略。
例如,当验证集的 loss 不再下降时,进行学习率调整;或者监测验证集的 accuracy,当accuracy 不再上升时,则调整学习率。

参数:
mode(str)- 模式选择,有 min 和 max 两种模式,min 表示当指标不再降低(如监测loss),max 表示当指标不再升高(如监测 accuracy)。

factor(float)- 学习率调整倍数(等同于其它方法的 gamma),即学习率更新为 lr = lr * factor

patience(int)- 直译——“耐心”,即忍受该指标多少个 step 不变化,当忍无可忍时,调整学习率。

verbose(bool)- 是否打印学习率信息

threshold(float)- Threshold for measuring the new optimum,配合 threshold_mode 使用。

threshold_mode(str)- 选择判断指标是否达最优的模式,有两种模式,rel 和 abs。

cooldown(int)- “冷却时间“,当调整学习率之后,让学习率调整策略冷静一下,让模型再训练一段时间,再重启监测模式

min_lr(float or list)- 学习率下限,可为 float,或者 list,当有多个参数组时,可用 list 进行设置

eps(float)- 学习率衰减的最小值,当学习率变化小于 eps 时,则不调整学习率。

5. torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda, last_epoch=- 1)

为不同参数组设定不同学习率调整策略。调整规则为,lr = base_lr * lmbda(self.last_epoch)

参数:
lr_lambda(function or list)- 一个计算学习率调整倍数的函数,输入通常为 step,当有多个参数组时,设为 list。

last_epoch(int)- 上一个 epoch 数,这个变量用来指示学习率是否需要调整。当为-1 时,学习率设置为初始值

学习率调整小结

pytorch学习率调整方法分三类

  1. 有序调整
    依一定规律有序进行调整,这一类是最常用的
  2. 自适应调整
    该法通过监测某一指标的变化情况,当该指标不再怎么变化的时候,就是调整学习率的时机
  3. 自定义调整
    Lambda 方法ᨀ供的调整策略十分灵活,我们可以为不同的层设定不同的学习率调整方法,这在 fine-tune 中十分有用,我们不仅可为不同的层设定不同的学习率,还可以为其设定不同的学习率调整策略。
step

在 PyTorch 中,学习率的更新是通过 scheduler.step()

  1. 在执行一次 scheduler.step()之后,epoch 会加 1,因此scheduler.step()要放在 epoch 的 for 循环当中执行。
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值