PaddleNLP 优化器模块解析:AdamWDL 分层学习率衰减、EMA 与逆平方根调度器实战指南

发布时间:2026/9/23 18:31:24
PaddleNLP 优化器模块解析:AdamWDL 分层学习率衰减、EMA 与逆平方根调度器实战指南 人工智能大模型预训练微调LoRARLHF强化学习分布式训练【免费下载链接】PaddleNLPEasy-to-use and powerful LLM and SLM library with awesome model zoo.项目地址https://gitcode.com/gh_mirrors/pa/PaddleNLP点击查看免费下载paddlenlp.ops.optimizer是 PaddleNLP 中面向大规模 Transformer 训练调优的优化器工具包其 API 文档页 paddlenlp.ops.optimizer.rst 通过 Sphinx autodoc 机制聚合了adamwdl与ema两个子模块的完整文档。本文以该文档为主体结合仓库内 paddlenlp/ops/optimizer 的源码实现系统讲解 AdamWDL 优化器含 Layer-wise Learning Rate Decay 分层学习率衰减、指数滑动平均 EMA 以及配套的逆平方根学习率调度器帮助你理解其原理、参数语义并掌握在 Paddle 动态图/静态图训练流程中的落地写法。模块总览paddlenlp.ops.optimizer 解决了什么问题从 模块导出定义 可以看到该包对外提供四个能力from .adamwdl import AdamWDL, layerwise_lr_decay from .ema import ExponentialMovingAverage from .lr import InverseSquareRootSchedule __all__ [layerwise_lr_decay, AdamWDL, ExponentialMovingAverage, InverseSquareRootSchedule]名称所属子模块核心用途AdamWDLadamwdl.py带 Layer-wise 动态学习率设置的 AdamW 优化器面向 Transformer 模型layerwise_lr_decayadamwdl.py默认的分层学习率衰减策略函数ExponentialMovingAverageema.py模型参数的指数滑动平均EMA训练中维护影子参数InverseSquareRootSchedulelr.py逆平方根学习率调度含 warmup 线性升温常用于预训练其中AdamWDL与layerwise_lr_decay是文档 toctree 中paddlenlp.ops.optimizer.adamwdl页的核心内容ExponentialMovingAverage则对应paddlenlp.ops.optimizer.ema页。下面逐一深入。AdamWDL基于 AdamW 的动态分层学习率优化器AdamWDL的类定义位于 paddlenlp/ops/optimizer/adamwdl.py它在 Paddle 官方paddle.optimizer.AdamW的基础上增加了为每个参数单独设置学习率的能力文档说明其默认使用layerwise_lr_decay作为动态学习率设置方法一般用于 Transformer 模型训练。分层学习率衰减Layer-wise Decay原理所谓 Layer-wise decay即自上而下按层指数衰减各层的学习率。以 24 层 Transformer 为例若第 24 层顶层使用学习率l分层衰减率为α则第m层的学习率为l * α^(24-m)。其理论出处为论文Dont Stop Pretraining: Adapt Language Models to Domains and TasksarXiv:1906.08237即 Layer-wise Learning Rate Decay / LLRD。这样的设计动机是底层靠近 embedding 的词向量层与浅层 encoder 层通常学习更通用的表征需要更小的学习率以保持稳定性而顶层更接近任务目标可以用更大的学习率快速适应。对应到源码 layerwise_lr_decaydef layerwise_lr_decay(decay_rate, name_dict, n_layers, param): ratio 1.0 static_name name_dict[param.name] if encoder.layers in static_name: idx static_name.find(encoder.layers.) layer int(static_name[idx:].split(.)[2]) ratio decay_rate ** (n_layers - layer) elif embedding in static_name: ratio decay_rate ** (n_layers 1) return ratio其规则非常清晰参数名中包含encoder.layers.时解析出层号layer学习率系数为decay_rate ** (n_layers - layer)——层号越大越靠近顶层系数越接近 1层号越小越靠近底层系数越小参数名中包含embedding时系数固定为decay_rate ** (n_layers 1)即比最底层 encoder 层还要小进一步压低 embedding 的学习率其余参数如顶层输出层、归一化层等系数保持1.0。注意name_dict的语义键是参数的动态名param.name值是模型的静态名可通过model.named_parameters()构建。AdamWDL 的更新公式与完整参数说明AdamWDL 继承了 AdamW 的数学更新形式其中moment_1、moment_2为一阶/二阶矩估计λ为 weight decay 系数t t 1 moment_1_out β1 * moment_1 (1 - β1) * grad moment_2_out β2 * moment_2 (1 - β2) * grad * grad learning_rate learning_rate * sqrt(1 - β2^t) / (1 - β1^t) param_out param - learning_rate * (moment_1 / (sqrt(moment_2) ε) λ * param)构造函数签名与各参数语义如下源自 adamwdl.py 的__init__参数默认值说明learning_rate0.001学习率可为 float 或LRSchedulerbeta10.9一阶矩估计的指数衰减率beta20.999二阶矩估计的指数衰减率epsilon1e-8数值稳定性小量parametersNone待更新的参数列表/元组动态图模式下必填静态图默认为None更新全部参数weight_decay0.01权重衰减系数可为 float 或 Tensorapply_decay_param_funNone若不为None仅当apply_decay_param_fun(Tensor.name) True的参数执行 weight decaygrad_clipNone梯度裁剪策略支持GradientClipByGlobalNorm/GradientClipByNorm/GradientClipByValuelazy_modeFalse惰性模式仅更新当前 mini-batch 有梯度的元素参数极大时可显著加速但语义与标准 Adam 略有差异multi_precisionFalse是否在权重更新时使用多精度如 FP32 master weightlayerwise_decay1.0分层衰减率αn_layers12Transformer encoder 总层数set_param_lr_funlayerwise_lr_decay自定义的参数学习率设置函数在 Adam 算子执行前调用name_dictNone动态名到静态名的映射字典用model.named_parameters()获取nameNone优化器名称一般无需设置构造函数中值得注意的实现细节layerwise_decay必须是 float 或paddle.framework.Variable否则抛出TypeError(coeff should be float or Tensor.)同时通过functools.partial把(layerwise_decay, name_dict, n_layers)预绑定进set_param_lr_fun使自定义函数只需接收param一个参数。官方文档示例自定义学习率函数并完成一步更新adamwdl.py 的 docstring 给出了完整可运行示例——自定义一个权重参数学习率打五折的策略并用AdamWDL完成一次前向、反向与参数更新import paddle from paddlenlp.ops.optimizer import AdamWDL def simple_lr_setting(decay_rate, name_dict, n_layers, param): ratio 1.0 static_name name_dict[param.name] if weight in static_name: ratio decay_rate**0.5 param.optimize_attr[learning_rate] * ratio linear paddle.nn.Linear(10, 10) name_dict dict() for n, p in linear.named_parameters(): name_dict[p.name] n inp paddle.rand([10, 10], dtypefloat32) out linear(inp) loss paddle.mean(out) adamwdl AdamWDL( learning_rate1e-4, parameterslinear.parameters(), set_param_lr_funsimple_lr_setting, layerwise_decay0.8, name_dictname_dict) loss.backward() adamwdl.step() adamwdl.clear_grad()要点set_param_lr_fun的签名固定为(decay_rate, name_dict, n_layers, param)返回值ratio会与参数原本的optimize_attr[learning_rate]相乘自定义函数内部通过name_dict[param.name]拿到静态名再按自己的规则如是否含weight决定缩放比例name_dict必须与传入的parameters一一对应否则查找会失败。底层执行流程学习率如何在 Adam 算子前被改写从源码可以清晰还原 AdamWDL 的一次参数更新究竟做了什么见 _append_optimize_op若set_param_lr_fun is None直接退化为原生AdamW._append_optimize_op不启用分层学习率先调用_append_decoupled_weight_decay执行解耦的权重衰减见下文记录当前参数学习率prev_lr调用set_param_lr_fun(param)得到ratio将optimize_attr[learning_rate]临时乘以ratio调用父类执行 Adam 更新算子恢复prev_lr避免影响后续参数。这个临时改写、用完即恢复的设计使得每个参数都能用自己独立的缩放后学习率走一次 Adam 更新而不会污染其他参数。关于解耦权重衰减decoupled weight decay_append_decoupled_weight_decay 实现了parameter parameter - parameter * coeff * lr即 AdamW 标志性的权重衰减与梯度更新解耦。其实现有两个工程细节值得注意按学习率缓存衰减系数decay_coeff 1.0 - learning_rate * coeff会被缓存进self._lr_to_coeff同一学习率只计算一次在动态图模式下每次apply_gradient后都会清空该缓存见 _create_optimization_pass保证每步重算支持 FP16 多精度当multi_precisionTrue且参数为paddle.float16时衰减作用在self._master_weights[param.name]主权重上再写回主权重避免半精度下数值精度损失。ExponentialMovingAverageEMA 影子参数维护ExponentialMovingAverage位于 paddlenlp/ops/optimizer/ema.py是一个轻量的参数级 EMA 工具在训练过程中维护一组影子参数用于在验证/推理时获得更平滑的模型权重。其四个方法构成完整生命周期class ExponentialMovingAverage(object): def __init__(self, model, decay0.999): self.model model self.decay decay self.shadow {} self.backup {}方法作用register()遍历model.named_parameters()为所有stop_gradient False即可训练的参数克隆一份影子参数update()每步更新影子参数new_average (1.0 - decay) * param decay * shadow然后写回shadowapply_shadow()将当前模型参数备份进backup再把影子参数赋给模型用于评估/推理restore()从backup恢复原始模型参数并清空备份使用模式通常是训练每个 step 后调用update()在验证阶段调用apply_shadow()换入平滑权重验证结束后调用restore()恢复继续训练。默认decay0.999意味着影子参数对历史权重保持很强的记忆适用于长期稳定训练。在仓库的奖励模型训练脚本中也能看到 EMA 思想的实践——llm/alignment/rm/legacy/run_reward.py 提供了--normalizer_type参数允许选择RunningMeanStd或ExponentialMovingAverage作为奖励归一化器并通过--momentum控制 EMA 动量更新式EMA_{t1} momentum * x (1 - momentum) * EMA_t可见该工具在 PaddleNLP 对齐alignment训练管线中的实际落地位置。InverseSquareRootSchedule带 warmup 的逆平方根学习率调度尽管InverseSquareRootSchedule位于 paddlenlp/ops/optimizer/lr.py未出现在 RST 的 toctree 中但它与AdamWDL、EMA 同属paddlenlp.ops.optimizer包并由__init__.py一并导出是大模型预训练中常用配套调度器故在此一并说明。它继承自paddle.optimizer.lr.LRScheduler其学习率变化分为两段def get_lr(self): if self.last_epoch self.warmup_steps: return self.warmup_init_lr self.last_epoch * self.lr_step # 线性升温 else: return self.decay_factor * (self.last_epoch**-0.5) # 逆平方根衰减warmup 阶段last_epoch warmup_steps学习率从0.0线性升至配置的学习率步长为learning_rate / warmup_steps衰减阶段学习率按更新步数的平方根倒数衰减衰减因子为learning_rate * sqrt(warmup_steps)保证在 warmup 结束点与配置学习率平滑衔接。构造参数warmup_stepswarmup 步数、learning_rate默认1.0、last_epoch默认-1可用于断点续训、verbose默认False为True时每次更新打印学习率。综合实战在预训练/微调脚本中组合使用综合以上三个组件一个典型的 Transformer 预训练优化器配置可以这样组织import paddle from paddlenlp.ops.optimizer import AdamWDL, InverseSquareRootSchedule model build_transformer_model() # 你的模型内部含 encoder.layers.* name_dict {p.name: n for n, p in model.named_parameters()} # 1. 逆平方根学习率调度warmup 衰减 scheduler InverseSquareRootSchedule( warmup_steps1000, learning_rate5e-4, ) # 2. 分层学习率 AdamW 优化器 optimizer AdamWDL( learning_ratescheduler, # 传入 LRScheduler 实例 parametersmodel.parameters(), weight_decay0.01, layerwise_decay0.8, # 分层衰减率 α n_layers12, # 与模型 encoder 层数一致 grad_clippaddle.nn.ClipGradByGlobalNorm(1.0), )使用前提与注意事项n_layers必须与模型实际的 encoder 层数一致layerwise_lr_decay依赖encoder.layers.idx这种静态参数名做解析如果模型的层命名不同例如blocks.或layers.需要仿照 layerwise_lr_decay 自定义set_param_lr_fun动态图模式必须显式传入parameters分层学习率只影响 Adam 更新阶段解耦权重衰减系数对所有参数一视同仁EMA 应在每步optimizer.step()之后调用ema.update()评估时用apply_shadow()/restore()切换且只作用于stop_gradient False的参数。小结paddlenlp.ops.optimizer是 PaddleNLP 训练链路中一个小而精的优化器模块AdamWDL以继承paddle.optimizer.AdamW的方式实现动态分层学习率核心是layerwise_lr_decay的α^(n_layers - layer)指数衰减规则以及_append_optimize_op中临时改写学习率、用完即恢复的算子注入机制并内置了解耦权重衰减与 FP16 多精度支持ExponentialMovingAverage以轻量影子参数方式提供参数平滑适用于训练末期稳定与评估场景InverseSquareRootSchedule提供线性 warmup 逆平方根衰减的预训练标准学习率曲线。三者组合即可支撑大模型训练中学习率调度 分层学习率 参数平滑的完整诉求。进一步阅读可直达 API 文档页 与其子页paddlenlp.ops.optimizer.adamwdl、paddlenlp.ops.optimizer.ema或直接查看源码 paddlenlp/ops/optimizer 目录下的三个实现文件。赞分享人工智能大模型预训练微调LoRARLHF强化学习分布式训练【免费下载链接】PaddleNLPEasy-to-use and powerful LLM and SLM library with awesome model zoo.项目地址https://gitcode.com/gh_mirrors/pa/PaddleNLP点击查看免费下载相关推荐Thorium浏览器终极指南如何构建高性能隐私优化的Chromium分支Thorium浏览器终极指南如何构建高性能隐私优化的Chromium分支 Thorium是一款基于Chromium源代码构建的高性能隐私优化浏览器以放射性元桌面应用跨平台深度学习学习率调度终极指南指数衰减与余弦退火实战深度学习学习率调度终极指南指数衰减与余弦退火实战 在深度学习模型训练中学习率调度是优化模型性能的关键技术。学习率决定了模型参数更新的步长直接影响训练效率和示例工程教程人工智能深度学习AI4Animation 中的 AdamW 优化器与余弦退火重启调度器解耦权重衰减与循环学习率实战指南AI4Animation 中的 AdamW 优化器与余弦退火重启调度器解耦权重衰减与循环学习率实战指南 本文围绕 AI4Animation https://l人工智能深度学习图形学游戏开发创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询