【Python】科研代码学习:十一 Optimization (Optimizer, Scheduler)

Optimizer 前置知识

在这里插入图片描述

按照这里的学习文章,说一下重要的内容,讲一下基本逻辑;优点;缺点
Optimizer 优化器就是有如下不同的版本,主要解决的是关于梯度、学习率、样本批次、权重等计算

  • SGD (Stochastic Gradient Descent) 随机梯度下降法
    每次选取哪个样本是随机的;更新速度快;损失波动大
  • BGD (Batch Gradient Descent) 批量梯度下降法
    每次将所有样本的梯度求和;梯度更新平滑;内存消耗大,容易进入局部最优解
  • MBGD (Mini-batch Gradient Descent) 小批量梯度下降法
    每一次利用一小批样本 n 梯度计算;收敛更稳定,速度较快;没有考虑数据集的稀疏度影响
    一般 n=50~256
  • Momentum 动量梯度下降法
    考虑了梯度方向的惯性;减少权重优化中的震荡问题;缺少一些减速的适应性
  • NAG (Nesterov Accelerated Gradient) 牛顿动量梯度下降法
    Momentum 的改进,用了二阶指数平滑;表现更好;没有考虑不同参数的重要程度
  • AdaGrad (Adaptive Gradient Algorithm) 自适应学习率梯度下降法
    可以对学习率自动调整;减少了学习率的手动调节;学习率会收缩到很小
  • Adam
    学习了 AdagradMomentum ;能适应系数梯度,缓解梯度震荡;
  • AdamW
    将权重衰减和学习率解耦;实验结果显示比 Adam 有更好的泛化性能

优化器在 torch 中的调用

  • PyTorch 中最常用的优化器是:
torch.optim.SGD:随机梯度下降优化器
torch.optim.Adam:自适应矩估计优化器
torch.optim.Adagrad:自适应梯度优化器

optimizer = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.9)

优化器在 transformers 中的调用

AdamW 优化器

  • 首先看一下源码,哦,他就是从 torch.Optimizer 继承过来的,实现了自己的一个类 AdamW。看一下参数
    params(Iterable[nn.parameter.Parameter]):提供模型的参数
    lr(float):学习率,默认为 0.001
    betas(Tuple[float,float]),即Adam中的 (b1,b2),默认为 (0.9,0.999)
    eps:epsilon,默认为 1e-06
    weight_decay:解耦后的权重缩减,默认为 0.0
    correct_bias(bool):是否修复 Adam 中的偏差值 bias,默认为 True
    在这里插入图片描述
  • 方法:step(),表示一步优化步骤。
  • 用法一:可以作为 torch.optimizer 类,自己实现一个 torch.nn,直接使用
  • 用法二:比较方便的是搭配 transformers 中的 trainingArguments
    参考 【Python】科研代码学习:七 TrainingArguments,Trainer
    TrainingArguments 中,可以设置 optim 属性,默认即为 adamw_torch;可以设置 weight_decay, adam_beta1, adam_beta2, adam_epsilon 等属性的值

Scheduler 前置知识

  • 而什么又是 Scheduler 调度器呢?
    Scheduler 调度器主要是,对于已经选择好的优化器 Optimizer,利用epoch、时间等变化对学习率进行调整
    【学习率】torch.optim.lr_scheduler学习率10种调整方法整理
    可以看一下 torch.optim.lr_scheduler 中为我们提供的一些调度器
    LambdaLR:初始 lr 乘以给定函数
    MultiplicativeLR:当前 lr 乘以给定函数
    StepLR:以固定间隔成倍衰减初始 lr
    MultiStepLR:以设定的时间间隔成倍衰减初始 lr
    ExponentialLR:指数衰减初始 lr
    CosineAnnealingLR:余弦函数式变化 lr
    ReduceLROnPlateau:当某一指标不再提升时,降低 lr
    CyclicLR:周期调整 lr
    CosineAnnealingWarmRestarts:余弦退火

调度器在 transformers 中的调用

  • 首先最重要的一个,是 SchedulerType
    相当于,我们通过这个类似枚举类,来指明我们使用的是哪种调度器
    可以看一下,有线性的,余弦的,多项式的,常数的,带预热的等
    ※详细可以看官网API,每个调度器如何影响lr
    在这里插入图片描述

  • 比如这个是带预热的余弦调度器
    在这里插入图片描述

  • 最主要的还是配合 TrainingArguments 使用
    参考 【Python】科研代码学习:七 TrainingArguments,Trainer
    TrainingArguments 中,可以设置 lr_scheduler_type ,无需我们自己创建一个调度器,HF会按照输入的调度器名字,自动创建对应的调度器。

  • 31
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值