赞
踩
学习率策略:学习率预热(warmup)和学习率衰减(Learning Rate Decay)
通过这样的学习率预热机制,可以使模型在训练初期更好地适应数据,提高训练的稳定性和性能。根据实际需求,可以根据预热阶段的迭代次数、初始学习率和最终学习率来调整预热效果。
需要注意的是,学习率 warm-up 的设置可以根据实际情况进行调整。如果初始学习率过大或 warm-up 过短,可能会导致模型训练不稳定或出现梯度爆炸的问题;而如果初始学习率过小或 warm-up 过长,可能会导致模型训练速度过慢。因此,建议根据具体任务和模型特点进行实验和调优,找到适合的学习率 warm-up 设置。
学习率预热是在训练开始阶段逐渐增加学习率,以帮助模型更好地收敛。预热阶段通常在训练的前几个epoch中进行,随后再根据预定义的衰减策略进行学习率衰减。
import torch import torch.optim as optim import torch.optim.lr_scheduler as lr_scheduler # 定义优化器和学习率调度器 model = YourModel() optimizer = optim.SGD(model.parameters(), lr=0.1) scheduler = lr_scheduler.StepLR(optimizer, step_size=1, gamma=0.1) # 学习率预热参数 warmup_epochs = 5 warmup_lr_init = 0.01 warmup_lr_end = 0.1 # 在训练循环中更新学习率 for epoch in range(warmup_epochs): # 计算当前预热阶段的学习率 warmup_lr = warmup_lr_init + (warmup_lr_end - warmup_lr_init) * epoch / warmup_epochs # 设置当前阶段的学习率 for param_group in optimizer.param_groups: param_group['lr'] = warmup_lr # 训练模型的代码 # 更新学习率调度器 scheduler.step() # 正常训练阶段,学习率衰减 for epoch in range(warmup_epochs, num_epochs): # 训练模型的代码 # 更新学习率调度器 scheduler.step()
def adjust_learning_rate(optimizer, epoch):
"""Sets the learning rate to the initial LR decayed by 10 every 30 epochs"""
lr = args.lr * (0.1 ** (epoch // 30))
for param_group in optimizer.param_groups:
param_group['lr'] = lr
常用的学习率衰减策略包括按照固定时间间隔衰减、按照验证集上的性能进行动态衰减或根据训练损失的变化情况自适应调整学习率等。选择合适的学习率衰减策略取决于具体问题和数据集的特点,以及模型训练的需求。
常见的学习率衰减方法包括:
class torch.optim.lr_scheduler.StepLR(optimizer, step_size, gamma=0.1, last_epoch=-1)
等间隔调整学习率,调整倍数为gamma倍,调整间隔为step_size。间隔单位是step。需要注意的是,step通常是指epoch,而不是iteration。
import torch
import torch.optim as optim
import torch.optim.lr_scheduler as lr_scheduler
# 定义优化器和学习率调度器
optimizer = optim.SGD(model.parameters(), lr=0.1)
scheduler = lr_scheduler.StepLR(optimizer, step_size=10, gamma=0.1)
# 在训练循环中更新学习率
for epoch in range(num_epochs):
# 训练模型的代码
# 更新学习率
scheduler.step()
class torch.optim.lr_scheduler.MultiStepLR(optimizer, milestones, gamma=0.1, last_epoch=-1)
在指定的epoch处衰减
import torch
import torch.optim as optim
import torch.optim.lr_scheduler as lr_scheduler
# 定义优化器和学习率调度器
optimizer = optim.SGD(model.parameters(), lr=0.1)
milestones = [30, 90, 120] # 里程碑(epoch)列表
scheduler = lr_scheduler.MultiStepLR(optimizer, milestones=milestones, gamma=0.1)
# 在训练循环中更新学习率
for epoch in range(num_epochs):
# 训练模型的代码
# 更新学习率
scheduler.step()
class torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max, eta_min=0, last_epoch=-1)
import torch import torch.optim as optim import torch.optim.lr_scheduler as lr_scheduler # 定义模型和优化器 model = YourModel() optimizer = optim.SGD(model.parameters(), lr=0.1) # 定义学习率调度器 T_max = 10 # 周期数 eta_min = 0.01 # 最小学习率 scheduler = lr_scheduler.CosineAnnealingLR(optimizer, T_max=T_max, eta_min=eta_min) # 在训练循环中更新学习率 for epoch in range(num_epochs): # 训练模型的代码 # 更新学习率调度器 scheduler.step()
class torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma, last_epoch=-1)
按指数衰减调整学习率,调整公式: lr = lr * gamma**epoch
import torch
import torch.optim as optim
import torch.optim.lr_scheduler as lr_scheduler
# 定义优化器和学习率调度器
optimizer = optim.SGD(model.parameters(), lr=0.1)
scheduler = lr_scheduler.ExponentialLR(optimizer, gamma=0.95)
# 在训练循环中更新学习率
for epoch in range(num_epochs):
# 训练模型的代码
# 更新学习率
scheduler.step()
class 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不变化,当忍无可忍时,调整学习率。注,可以不是连续5次。
verbose(bool)-:是否打印学习率信息
threshold(float): Threshold for measuring the new optimum,配合threshold_mode使用,默认值1e-4。作用是用来控制当前指标与best指标的差异。
threshold_mode(str): 选择判断指标是否达最优的模式,有两种模式,rel和abs。
当threshold_mode = rel,并且mode = max时,dynamic_threshold = best * ( 1 + threshold ); 当threshold_mode = rel,并且mode = min时,dynamic_threshold = best * ( 1 - threshold ); 当threshold_mode = abs,并且mode = max时,dynamic_threshold = best + threshold ; 当threshold_mode = rel,并且mode = max时,dynamic_threshold = best - threshold
cooldown(int): “冷却时间“,当调整学习率之后,让学习率调整策略冷静一下,让模型再训练一段时间,再重启监测模式。
min_lr(float or list):学习率下限,可为float,或者list,当有多个参数组时,可用list进行设置。
eps(float): 学习率衰减的最小值,当学习率变化小于eps时,则不调整学习率。
import torch import torch.optim as optim import torch.optim.lr_scheduler as lr_scheduler # 定义优化器和学习率调度器 optimizer = optim.SGD(model.parameters(), lr=0.1) scheduler = lr_scheduler.ReduceLROnPlateau(optimizer, mode='min', factor=0.1, patience=5) # 在训练循环中更新学习率 for epoch in range(num_epochs): # 训练模型的代码 # 计算损失 loss = ... # 更新学习率 scheduler.step(loss)
class torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda, last_epoch=-1)
import torch import torch.optim as optim import torch.optim.lr_scheduler as lr_scheduler # 定义模型和优化器 model = YourModel() optimizer = optim.SGD(model.parameters(), lr=0.1) # 定义学习率调度器 lambda_fn = lambda epoch: 0.5 ** epoch # 自定义衰减函数 scheduler = lr_scheduler.LambdaLR(optimizer, lr_lambda=lambda_fn) # 在训练循环中更新学习率 for epoch in range(num_epochs): # 训练模型的代码 # 更新学习率调度器 scheduler.step()
在上述示例中,我们定义了一个模型和一个优化器,并创建了一个 LambdaLR 的学习率调度器。我们使用 lambda_fn 函数作为衰减函数,它以当前 epoch 数作为输入,并返回一个缩放因子。在每个 epoch 结束后,我们调用 scheduler.step() 方法来更新学习率。
通过使用 LambdaLR,我们可以根据自定义的衰减函数灵活地调整学习率。在示例中,我们使用指数衰减函数,每个 epoch 学习率减半,但你可以根据需要定义其他衰减规则。
需要注意的是,使用 LambdaLR 时,衰减函数的设计很关键。确保衰减函数能够合理地调整学习率,以便在训练过程中获得更好的收敛效果。可以根据具体问题和实验结果来调整衰减函数的形式和参数。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。