PaddleNLP 学习率调度器全解析:从 LinearDecayWithWarmup 到 CosineAnnealing 的源码与实践指南
发布时间:2026/9/25 8:14:54来源:尧图网络
人工智能大模型预训练微调LoRARLHF强化学习分布式训练【免费下载链接】PaddleNLPEasy-to-use and powerful LLM and SLM library with awesome model zoo.项目地址https://gitcode.com/gh_mirrors/pa/PaddleNLP点击查看免费下载导读在大模型与预训练语言模型的训练流程中学习率调度Learning Rate Schedule直接决定训练的收敛速度与最终精度。PaddleNLP 在 paddlenlp/transformers/optimization.py 中内置了一整套带 warmup 的学习率调度器覆盖线性衰减、余弦衰减、常数保持、多项式衰减与退火Annealing等多种策略。本文基于该模块源码逐类讲解每个调度器的数学原理、参数语义、代码示例与训练器集成方式并对照 paddlenlp/trainer/trainer_utils.py 中的get_scheduler统一调度 API 以及 LLM 训练脚本中的真实用法帮助你为自定义训练任务选型与调参。读完本文你将能够熟练构造 warmup 学习率曲线、理解各调度器之间的差异并在 Trainer 或自定义训练循环中正确接入学习率调度。一、模块概览PaddleNLP 的 Warmup 调度器家族paddlenlp.transformers.optimization模块在 paddlenlp/transformers/optimization.py 中通过__all__导出了六个公开调度器类类名基类衰减阶段行为LinearDecayWithWarmupLambdaDecay线性下降至 0ConstScheduleWithWarmupLambdaDecay恒定保持初始学习率CosineDecayWithWarmupLambdaDecay余弦曲线下降可选硬重启PolyDecayWithWarmupLambdaDecay多项式衰减至lr_endCosineAnnealingWithWarmupDecayLRScheduler余弦退火至min_lrLinearAnnealingWithWarmupDecayLRScheduler线性退火至min_lr其中前四个类直接继承自 Paddle 框架的paddle.optimizer.lr.LambdaDecay通过自定义lr_lambda函数控制每个 step 的学习率缩放因子后两个类继承自paddle.optimizer.lr.LRScheduler直接在get_lr()中计算学习率绝对值。二者统一的行为模式都是先线性 warmup再进行对应的衰减或保持。这一设计确保了训练早期学习率从小变大、稳定模型参数后期逐步降低学习率以精细收敛。二、三个基础参数learning_rate、warmup 与 total_steps在使用optimization模块的任何调度器之前需要先理解贯穿所有类的三个核心参数learning_ratefloat基础学习率即 warmup 结束后达到的学习率峰值也是衰减阶段的起点。warmupint 或 floatwarmup 步数。传入整数时表示精确的 warmup 步数传入浮点数如0.1时表示 warmup 占total_steps的比例代码通过int(math.floor(warmup * total_steps))换算为具体步数见 optimization.py。因此当warmup为浮点数时total_steps必须提供。total_stepsint总训练步数用于计算衰减阶段的长度与进度。模块内通过is_integer(number)辅助函数判断warmup是精确步数还是比例。需要注意ConstScheduleWithWarmup在warmup为浮点数且未提供total_steps时会直接抛出ValueError提示Please provide total steps ifwarmupis a float number这是该调度器独有的参数约束见 optimization.py。三、逐个拆解六大调度器的实现原理3.1 LinearDecayWithWarmup线性升温 线性降温行为学习率在 warmup 阶段从 0 线性上升至learning_rate随后从learning_rate线性下降至 0。核心实现optimization.pywarmup_steps warmup if is_integer(warmup) else int(math.floor(warmup * total_steps)) def lr_lambda(current_step): if current_step warmup_steps: return float(current_step) / float(max(1, warmup_steps)) return max(0.0, float(total_steps - current_step) / float(max(1, total_steps - warmup_steps)))lr_lambda返回的是一个 01 的缩放因子LambdaDecay会将其与learning_rate相乘得到当前学习率。warmup 段因子为current_step / warmup_steps呈线性上升衰减段因子为(total_steps - current_step) / (total_steps - warmup_steps)随步数增加线性降至 0且用max(0.0, ...)防止越界出现负值。官方示例见类 docstringoptimization.pyfrom paddlenlp.transformers import LinearDecayWithWarmup lr, warmup_steps, max_steps 0.1, 100, 1000 lr_scheduler LinearDecayWithWarmup(lr, max_steps, warmup_steps)这是预训练与 SFT 中最常见的调度策略之一warmup 阶段防止训练初期梯度爆炸线性衰减则平滑收尾。它与paddlenlp/trainer/trainer_utils.py中get_linear_schedule_with_warmup的数学形式完全一致trainer_utils.py。3.2 ConstScheduleWithWarmupwarmup 后保持恒定行为学习率在 warmup 阶段线性上升至learning_rate之后一直保持该值不变。核心实现optimization.pydef lr_lambda(current_step): if current_step warmup_steps: return float(current_step) / float(max(1.0, warmup_steps)) return 1.0warmup 结束后因子恒为1.0学习率即为初始值。适用于需要全程以较高学习率持续探索的场景如强化学习中 actor 的持续微调但要注意过大的恒定学习率可能引起震荡。官方示例from paddlenlp.transformers import ConstScheduleWithWarmup lr, warmup_steps 0.1, 100 lr_scheduler ConstScheduleWithWarmup(lr, warmup_steps)3.3 CosineDecayWithWarmup余弦衰减与硬重启行为学习率在 warmup 阶段线性上升之后按余弦函数衰减至 0可选的with_hard_restarts模式让余弦函数在训练周期内多次硬重启。核心实现optimization.pyif current_step warmup_steps: return float(current_step) / float(max(1, warmup_steps)) progress float(current_step - warmup_steps) / float(max(1, total_steps - warmup_steps)) if with_hard_restarts: if progress 1.0: return 0.0 return max(0.0, 0.5 * (1.0 math.cos(math.pi * ((float(num_cycles) * progress) % 1.0)))) return max(0.0, 0.5 * (1.0 math.cos(math.pi * float(num_cycles) * 2.0 * progress)))参数细节with_hard_restartsbool默认 False是否启用余弦硬重启。为 False 时num_cycles表示完整余弦波的个数必须是整数默认1即标准的半余弦衰减为 True 时num_cycles表示硬重启次数应为浮点数默认0.5。参数校验逻辑位于 optimization.py若传入num_cycles会断言其类型与with_hard_restarts匹配整数对 False浮点数对 True否则抛出AssertionError。硬重启模式下当progress 1.0时因子归零否则利用(num_cycles * progress) % 1.0制造周期性的余弦回弹实现多次重启效果。官方示例from paddlenlp.transformers import CosineDecayWithWarmup lr, warmup_steps, max_steps 0.1, 100, 1000 lr_scheduler CosineDecayWithWarmup(lr, max_steps, warmup_steps)余弦衰减是现代大模型训练中最主流的方案之一它在训练前期保持较高学习率、中后期快速下降收敛速度与最终精度都较为理想。对照 trainer_utils.py 中的get_cosine_schedule_with_warmup后者额外支持min_lr参数可将学习率下限定在非零值。3.4 PolyDecayWithWarmup多项式衰减行为学习率在 warmup 阶段线性上升之后按幂函数从learning_rate衰减至指定终点lr_end。核心实现optimization.pydef lr_lambda(current_step): if current_step warmup_steps: return float(current_step) / float(max(1, warmup_steps)) elif current_step total_steps: return lr_end / lr_init # it multiplies by lr_init equals to lr_end else: lr_range lr_init - lr_end decay_steps total_steps - warmup_steps pct_remaining 1 - (current_step - warmup_steps) / decay_steps decay lr_range * pct_remaining**power lr_end return decay / lr_init参数细节lr_endfloat默认1e-7衰减终点学习率。powerfloat默认1.0多项式幂次。power1时为线性衰减到lr_end注意此时终点不是 0 而是lr_end与LinearDecayWithWarmup不同power1时衰减前期下降更快、后期更缓。代码在 optimization.py 使用断言强制lr_init lr_end否则报错提示lr_end必须小于learning_rate。训练步数超过total_steps后因子固定为lr_end / lr_init即学习率保持在终点值不再变化。官方示例from paddlenlp.transformers import PolyDecayWithWarmup lr, lr_end, warmup_steps, max_steps 0.1, 1e-6, 100, 1000 lr_scheduler PolyDecayWithWarmup(lr, max_steps, warmup_steps, lr_end)trainer_utils.py中的get_polynomial_decay_schedule_with_warmuptrainer_utils.py实现了完全相同的数学逻辑并特别注明power默认1.0沿用了 fairseq 与原始 BERT 实现Google BERT optimization.py的约定。3.5 CosineAnnealingWithWarmupDecay余弦退火至 min_lr行为直接继承paddle.optimizer.lr.LRSchedulerwarmup 阶段从 0 线性升至max_lr之后沿余弦曲线从max_lr退火至min_lr超过decay_step后学习率固定为min_lr。核心实现optimization.pydef get_lr(self): if self.warmup_step 0 and self.last_epoch self.warmup_step: return float(self.max_lr) * (self.last_epoch) / self.warmup_step if self.last_epoch self.decay_step: return self.min_lr num_step_ self.last_epoch - self.warmup_step decay_step_ self.decay_step - self.warmup_step decay_ratio float(num_step_) / float(decay_step_) coeff 0.5 * (math.cos(math.pi * decay_ratio) 1.0) return self.min_lr coeff * (self.max_lr - self.min_lr)参数max_lr峰值学习率、min_lr退火下限、warmup_stepwarmup 步数、decay_step衰减总步数即退火区间长度、last_epoch默认 -1用于断点续训。与前面四个LambdaDecay类不同get_lr()直接返回学习率的绝对值而非缩放因子。该调度器特别适合大模型预训练与 RLHF 训练因为它支持将学习率收敛到显式指定的min_lr从而控制微调阶段的更新幅度。例如 llm/auto_parallel/deepseek-v3/run_pretrain_auto.py 中DeepSeek-V3 预训练脚本即使用lr_scheduler CosineAnnealingWithWarmupDecay( max_lrtraining_args.learning_rate, min_lrtraining_args.min_learning_rate, warmup_stepwarmup_steps, decay_steptraining_args.decay_steps, last_epoch0, )3.6 LinearAnnealingWithWarmupDecay线性退火至 min_lr行为与余弦退火对应warmup 之后学习率沿直线从max_lr降至min_lr。核心实现optimization.pydef get_lr(self): if self.warmup_step 0 and self.last_epoch self.warmup_step: return float(self.max_lr) * (self.last_epoch) / self.warmup_step if self.last_epoch self.decay_step: return self.min_lr num_step_ self.last_epoch - self.warmup_step decay_step_ self.decay_step - self.warmup_step decay_ratio float(num_step_) / float(decay_step_) coeff 1.0 - decay_ratio return self.min_lr coeff * (self.max_lr - self.min_lr)与余弦退火的差异仅在coeff的定义余弦版本用0.5 * (cos(π * ratio) 1)线性版本用1.0 - ratio。当需要简单可预期的学习率曲线、且希望终点控制在min_lr而非 0 时可选择本调度器。四、调度器与 Trainer 的集成get_scheduler 统一入口除optimization.py提供的六个类外PaddleNLP 的 Trainer 体系还提供了一套按名称创建调度器的统一 API。SchedulerType枚举trainer_utils.py定义了五种合法名称枚举值字符串名对应实现LINEARlinearget_linear_schedule_with_warmupCOSINEcosineget_cosine_schedule_with_warmupCONSTANTconstantget_constant_scheduleCONSTANT_WITH_WARMUPconstant_with_warmupget_constant_schedule_with_warmupPOLYNOMIALpolynomialget_polynomial_decay_schedule_with_warmupget_schedulertrainer_utils.py根据名称查表TYPE_TO_SCHEDULER_FUNCTION并分派参数constant只需learning_rateconstant_with_warmup需要num_warmup_steps其余三种还需要num_training_steps其中cosine额外支持num_cycles与min_lrpolynomial额外支持lr_end与power缺失必要参数时抛出明确的ValueError。Trainer 在create_scheduler中完成调度器构造trainer.py先用warmup_steps大于 0 时或warmup_ratio * num_training_steps计算 warmup 步数再根据decay_steps覆盖默认衰减步数最终把learning_rate、num_cycles、lr_end、power、min_lr等TrainingArguments字段一并传入get_scheduler。这些字段的默认定义见 training_args.py 附近的lr_scheduler_type: str字段。也就是说日常使用 Trainer 训练时通常不需要直接实例化optimization模块的类只需在训练参数中设置lr_scheduler_typelinear或cosine等字符串即可。而optimization.py中的六个类更多用于自定义训练循环与强化学习 / 自动并行等高级场景。五、仓库中的真实使用场景5.1 LLM 预训练DeepSeek-V3 自动并行示例在 llm/auto_parallel/deepseek-v3/run_pretrain_auto.py 中调度器的创建遵循如下流程decay_steps为空时回退到max_stepswarmup_steps 0时直接使用精确步数否则用warmup_ratio * max_steps计算根据lr_scheduler_type是cosine还是linear分别实例化CosineAnnealingWithWarmupDecay与LinearAnnealingWithWarmupDecay。对应的配置可参考 llm/auto_parallel/deepseek-v3/pretrain_argument.json其中learning_rate: 0.0001、min_learning_rate: 0.00001、warmup_ratio: 0.01的组合即对应峰值 1e-4、退火下限 1e-5、1% 步数 warmup的经典大模型预训练设置。5.2 RLHF / PPO按需返回调度器在 PPO 训练器中paddlenlp/rl/trainer/ppo_trainer.py 的get_scheduler方法展示了另一种集成方式只有当显式设置了min_learning_rate时才创建调度器否则返回None学习率恒定。这体现了退火型调度器在强化学习中的典型用法——通过decay_steps精确控制 Actor/Critic 的学习率随训练推进逐渐收紧稳定策略更新。5.3 蒸馏与微调场景llm/application/distill/sft_argument.json 等微调配置文件中的learning_rate: 3e-05、warmup_steps: 30字段经过 Trainer 的create_scheduler换算后最终都会进入上文介绍的同一条调度器构造链路。六、选型建议与注意事项预训练 / 大规模 SFT优先CosineDecayWithWarmup或CosineAnnealingWithWarmupDecay余弦曲线能在中后期快速收敛如需显式控制学习率下限选择后者并设置min_lr。任务简单、步数较少LinearDecayWithWarmup足够曲线直观、便于调试。需要持续恒定学习率如某些 RL 阶段ConstScheduleWithWarmup注意 warmup 为浮点数时必须提供total_steps。需要终点学习率非零PolyDecayWithWarmuppower可调或两个 Annealing 类均可将学习率收敛到min_lr/lr_end。硬重启只有CosineDecayWithWarmup支持with_hard_restarts且num_cycles的类型必须与with_hard_restarts匹配整数对 False、浮点数对 True否则触发断言。断点续训所有调度器均支持last_epoch参数续训时传入上次结束的 epoch 即可从对应学习率恢复。统一入口优先使用 Trainer 训练时优先通过lr_scheduler_type参数选择调度策略需要更细粒度控制如自定义min_lr、decay_step或脱离 Trainer 时再直接使用optimization.py中的类。七、总结PaddleNLP 的paddlenlp.transformers.optimization模块以warmup 衰减为统一范式提供了覆盖线性、余弦、常数、多项式、退火六大策略的完整调度器家族同时通过 Trainer 侧的get_scheduler提供了按名称分派的统一入口。理解每个调度器的lr_lambda/get_lr实现就能准确预判训练过程中的学习率变化轨迹进而针对预训练、微调与强化学习等不同任务选择最合适的策略并利用min_lr、lr_end、num_cycles等扩展参数做精细化调参。赞分享人工智能大模型预训练微调LoRARLHF强化学习分布式训练【免费下载链接】PaddleNLPEasy-to-use and powerful LLM and SLM library with awesome model zoo.项目地址https://gitcode.com/gh_mirrors/pa/PaddleNLP点击查看免费下载相关推荐PyTorch学习率调度StepLR、CosineAnnealing策略全解析PyTorch学习率调度StepLR、CosineAnnealing策略全解析 1. 深度学习训练的关键挑战学习率优化 在神经网络训练过程中学习率Lea人工智能机器学习深度学习分布式训练模型编译PyTorch Image Models学习率调度CosineAnnealing实战指南PyTorch Image Models学习率调度CosineAnnealing实战指南 深度学习模型训练中学习率调度是影响最终性能的关键因素。 PyTor人工智能计算机视觉深度学习预训练fairseq 学习率调度器Learning Rate Scheduler完全指南从 fixed 到 tri_stage 的源码级解析与实战配置fairseq 学习率调度器Learning Rate Scheduler完全指南从 fixed 到 tri_stage 的源码级解析与实战配置 本篇技术人工智能深度学习预训练NLP语音创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网