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

本文介绍了优化器(如SGD、Momentum、Adam和AdamW)在PyTorch中的使用,以及在transformers库中的AdamW优化器的应用。同时讲解了调度器(如StepLR、CosineAnnealingLR等)的作用和在transformers中如何通过TrainingArguments自动配置。
摘要由CSDN通过智能技术生成

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会按照输入的调度器名字,自动创建对应的调度器。

train with base lr in the first 100 epochs # and half the lr in the last 100 epochs To train with a base learning rate for the first 100 epochs and half the learning rate for the last 100 epochs, you can use a learning rate scheduler in PyTorch. Here's an example of how you can modify the training loop in your code: import torch import torch.nn as nn import torch.optim as optim from torch.optim.lr_scheduler import MultiStepLR # Define your model, criterion, and optimizer model = YourModel() criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(model.parameters(), lr=0.01) # Define the number of epochs and the milestone epochs num_epochs = 200 milestones = [100] # Create a learning rate scheduler scheduler = MultiStepLR(optimizer, milestones=milestones, gamma=0.5) # Train the model for epoch in range(num_epochs): # Train with base lr for the first 100 epochs, and half the lr for the last 100 epochs if epoch >= milestones[0]: scheduler.step() for inputs, labels in train_loader: # Forward pass outputs = model(inputs) loss = criterion(outputs, labels) # Backward pass and optimization optimizer.zero_grad() loss.backward() optimizer.step() # Perform validation or testing after each epoch with torch.no_grad(): # Validation or testing code # Print training information print(f"Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item()}, LR: {scheduler.get_last_lr()[0]}") # Save the model or perform other operations after training In this code snippet, we create a MultiStepLR scheduler and specify the milestones as [100] and gamma as 0.5. The learning rate is halved at the specified milestone epochs. Inside the training loop, we check if the current epoch is greater than or equal to the milestone epoch, and if so, we call scheduler.step() to update the learning rate. Remember to adjust the num_epochs and other hyperparameters according to your specific requirements. 翻译成中文
07-16
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值