十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

PaddleNLP AdamW 优化器模块实战:AdamWDL 与逐层学习率衰减(layerwise_lr_decay)深度解析

PaddleNLP AdamW 优化器模块实战:AdamWDL 与逐层学习率衰减(layerwise_lr_decay)深度解析 人工智能大模型预训练微调LoRARLHF强化学习分布式训练【免费下载链接】PaddleNLPEasy-to-use and powerful LLM and SLM library with awesome model zoo.项目地址https://gitcode.com/gh_mirrors/pa/PaddleNLP点击查看免费下载本文以 PaddleNLP 仓库中 paddlenlp.ops.optimizer.adamw 模块文档为核心系统讲解其背后承载的 AdamW 动态学习率优化器AdamWDLAdamW with Dynamic Learning rate与配套的layerwise_lr_decay逐层学习率衰减机制。读者通过本文可以掌握如何在 Transformer 类大模型训练中按层指数衰减学习率、如何基于set_param_lr_fun自定义任意参数的动态学习率策略以及 AdamWDL 在解耦权重衰减、多精度混合训练等场景下的源码级实现原理。模块定位从 API 文档到实现源码docs/zh/source/paddlenlp.ops.optimizer.adamw.rst是 Sphinx autodoc 生成的 API 文档页它通过automodule:: paddlenlp.ops.optimizer.adamw指令将 paddlenlp/ops/optimizer/adamwdl.py 模块的 docstring、类与函数签名自动渲染为文档。因此该模块的实际技术载体是源码文件本身模块对外暴露了两个核心 APIAdamWDL基于 Paddle 官方paddle.optimizer.AdamW实现的、支持动态学习率默认采用逐层衰减的优化器类layerwise_lr_decay默认的动态学习率设置函数实现按 Transformer 编码器层序指数衰减学习率。从 paddlenlp/ops/optimizer/init.py 可以看出ops.optimizer子包统一导出layerwise_lr_decay、AdamWDL、ExponentialMovingAverage、InverseSquareRootSchedule构成了一个面向 Transformer 训练的优化工具集。其中InverseSquareRootSchedule逆平方根学习率调度实现在 paddlenlp/ops/optimizer/lr.py可与 AdamWDL 配合使用。AdamWDLAdamW 与动态学习率的结合设计动机与适用场景AdamWDL 的 docstring 明确指出它基于 AdamW 优化并带有动态学习率设置dynamic lr setting通常用于 Transformer 模型。其核心思想来自论文Layer-wise Learning Rate DecayarXiv:1906.08237在深层次 Transformer 中越靠近底层的参数embedding、浅层 encoder在反向传播中梯度信号越弱统一的学习率要么导致浅层欠拟合、要么导致深层过拟合。逐层衰减的策略是自顶向下指数衰减各层的学习率——例如第 24 层使用学习率l逐层衰减率layer-wise decay rate为α则第m层的学习率为l·α^(24-m)。继承关系与构造参数AdamWDL 直接继承自paddle.optimizer.AdamW因此完整保留了 AdamW 的全部标准能力同时新增了动态学习率相关的参数。完整构造签名与默认值如下与源码 adamwdl.py 一一对应参数类型默认值说明learning_ratefloat / LRScheduler0.001学习率可为浮点数或学习率调度器对象beta1float / Tensor0.9一阶矩估计的指数衰减率beta2float / Tensor0.999二阶矩估计的指数衰减率epsilonfloat / Tensor1e-8数值稳定性小量parameterslist / tupleNone需要更新的参数动态图模式下必填静态图默认 None 表示更新全部参数weight_decayfloat / Tensor0.01权重衰减系数AdamW 中与 L2 正则解耦apply_decay_param_funfunction / NoneNone若提供仅对满足apply_decay_param_fun(Tensor.name)True的参数施加权重衰减grad_clipGradientClipBaseNone梯度裁剪策略如paddle.nn.ClipGradByGlobalNorm等lazy_modeboolFalse惰性模式仅更新当前 mini-batch 有梯度的元素可加速超大参数更新multi_precisionboolFalse是否在权重更新中使用多精度如 FP32 master weight FP16 参数layerwise_decayfloat1.0逐层学习率衰减率αn_layersint12Transformer 编码器总层数set_param_lr_funfunction / Nonelayerwise_lr_decay在每次执行 Adam 算子前为参数设置学习率的回调函数name_dictdictNone参数动态名 → 静态名的映射可通过model.named_parameters()获得namestrNone优化器名称一般无需设置其中layerwise_decay在构造函数中被校验为float或paddle.framework.Variable类型否则抛出TypeError(coeff should be float or Tensor.)。数学形式AdamWDL 保留 Adam 的经典更新公式与paddle.optimizer.AdamW一致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)注意最后一式中λ * param即解耦权重衰减param_out param - lr·(moment_1/(√moment_2ε)) - lr·λ·param权重衰减项与梯度动量项分离这正是 AdamW 区别于传统 AdamL2 正则化的关键。layerwise_lr_decay默认逐层衰减策略的实现layerwise_lr_decay(decay_rate, name_dict, n_layers, param)是 AdamWDL 的默认set_param_lr_fun其计算逻辑非常直观见 adamwdl.py通过name_dict[param.name]将参数的动态名映射为静态名若静态名包含encoder.layers则解析出encoder.layers.idx中的层号layer返回ratio decay_rate ** (n_layers - layer)若静态名包含embedding返回ratio decay_rate ** (n_layers 1)——embedding 层视为比最底层 encoder 层还要浅一层获得最小的学习率缩放其余参数返回ratio 1.0不缩放。例如n_layers12、decay_rate0.8时第 0 层 encoder 的ratio0.8^12≈0.0687第 11 层ratio0.8^10.8embedding 层ratio0.8^13≈0.055。可见衰减幅度随层深增加而增大正好符合浅层学习率更低的设计。自定义动态学习率set_param_lr_fun 回调AdamWDL 的通用性体现在set_param_lr_fun上——它并不限定必须使用逐层衰减。docstring 给出的示例展示了一个自定义回调对参数名中含weight的参数统一将学习率缩放decay_rate**0.5import 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()回调的签名约定为f(decay_rate, name_dict, n_layers, param)其中decay_rate、name_dict、n_layers三个参数由 AdamWDL 在构造时通过functools.partial预绑定见源码 adamwdl.py调用时只需传入param。回调内部通过改写param.optimize_attr[learning_rate]实现按参数定制学习率。源码级实现机制动态学习率如何生效更新流程_append_optimize_opAdamWDL 的核心逻辑位于_append_optimize_opadamwdl.py它在静态图/动态图的参数更新阶段被调用流程为先执行_append_decoupled_weight_decay追加解耦权重衰减算子记录当前参数原始学习率prev_lr调用set_param_lr_fun(param)得到缩放比ratio将param.optimize_attr[learning_rate] * ratio调用父类AdamW._append_optimize_op执行标准 Adam 更新此时使用缩放后的学习率恢复原始学习率prev_lr避免影响后续参数的更新。这一临时改写、用完恢复的技巧保证每个参数只在自己的更新步骤中生效对应的动态学习率。解耦权重衰减_append_decoupled_weight_decay该方法adamwdl.py实现了param param - param * coeff * lr的权重衰减逻辑关键细节若设定了apply_decay_param_fun会先判断参数名是否满足条件不满足则直接跳过该参数的衰减学习率为float时直接使用否则调用_create_param_lr创建参数级学习率保证在_create_global_learning_rate之后调用通过_lr_to_coeff字典缓存decay_coeff 1.0 - learning_rate * self._coeff避免同一学习率下重复计算注释说明这是为流水线并行设置的device:all兼容多精度支持当multi_precisionTrue且参数为 FP16 时使用self._master_weights[param.name]中的 FP32 master weight 进行衰减与回写find_master分支否则直接作用于原参数。由于动态图下apply_gradient每步都会执行_lr_to_coeff缓存在_create_optimization_pass中被清空adamwdl.py保证每步学习率变化时系数不会残留。在真实模型训练中的配置佐证仓库的测试夹具配置 tests/fixtures/model_zoo/ernie-m.yaml 是 AdamWDL 的典型落地场景该配置在优化器相关段落中设置了layerwise_decay: 0.8即对 ERNIE-M 这类多语言预训练 Transformer 模型启用 0.8 的逐层学习率衰减。这表明 AdamWDL 的典型用法是从paddlenlp.ops.optimizer导入AdamWDL通过model.named_parameters()构造name_dict传入layerwise_decay、n_layers与name_dict其余参数按普通 AdamW 使用即可。配套优化工具InverseSquareRootSchedule 与 EMA除了 AdamWDLops.optimizer包还提供两个常与动态学习率配套的工具源码见 lr.py 与 ema.pyInverseSquareRootSchedule基于更新步数的逆平方根学习率调度先线性 warmup从 0 线性增长到设定学习率随后按decay_factor * step^(-0.5)衰减其中decay_factor learning_rate * warmup_steps^0.5保证在warmup_steps处衰减曲线与峰值平滑衔接。参数包括warmup_steps必填、learning_rate默认 1.0、last_epoch默认 -1、verbose默认 False。ExponentialMovingAverage指数滑动平均用于训练后对权重取 EMA 版本以提升泛化。三者组合可形成一套完整的 Transformer 训练优化方案InverseSquareRootSchedule控制全局学习率曲线AdamWDL的layerwise_lr_decay控制层间学习率差异ExponentialMovingAverage平滑最终权重。总结PaddleNLP 的paddlenlp.ops.optimizer.adamw模块以 AdamWDL 为核心为 Transformer 大模型训练提供了开箱即用的逐层学习率衰减方案一方面完整复用 Paddle 官方 AdamW 的优化语义与解耦权重衰减、多精度等能力另一方面通过set_param_lr_fun回调机制将每个参数独立学习率的定制能力开放给用户。配合InverseSquareRootSchedule、ExponentialMovingAverage以及仓库配置如 ernie-m.yaml 中的layerwise_decay: 0.8开发者可以在不修改模型代码的前提下快速复现论文Layer-wise Learning Rate Decay的训练策略提升深层 Transformer 的收敛稳定性。赞分享人工智能大模型预训练微调LoRARLHF强化学习分布式训练【免费下载链接】PaddleNLPEasy-to-use and powerful LLM and SLM library with awesome model zoo.项目地址https://gitcode.com/gh_mirrors/pa/PaddleNLP点击查看免费下载相关推荐PaddleNLP 中的 AdamWDL 优化器基于层间学习率衰减的 Transformer 训练方案PaddleNLP 中的 AdamWDL 优化器基于层间学习率衰减的 Transformer 训练方案 导读 AdamWDLAdamW with Dynam人工智能大模型预训练微调LoRARLHF强化学习分布式训练模型推理服务推理引擎模型量化模型压缩本地部署NLPAI4Animation 中的 AdamW 优化器与余弦退火重启调度器解耦权重衰减与循环学习率实战指南AI4Animation 中的 AdamW 优化器与余弦退火重启调度器解耦权重衰减与循环学习率实战指南 本文围绕 AI4Animation https://l人工智能深度学习图形学游戏开发如何使用 annotated_deep_learning_paper_implementations 配置 AdamW 权重衰减与 warmup 学习率调度如何使用 annotated_deep_learning_paper_implementations 配置 AdamW 权重衰减与 warmup 学习率调度 在人工智能深度学习大模型NLP计算机视觉强化学习LoRA创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表