学习率过高是llama 3微调中梯度爆炸、loss为nan的主因,需综合降低全局学习率、启用分层学习率、切换8-bit优化器、添加梯度裁剪及验证数据预处理一致性。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

如果您在运行Llama 3微调脚本时遇到训练崩溃、loss突变为NaN或梯度值急剧飙升等现象,则很可能是由于学习率配置过高引发梯度爆炸。以下是针对性的多项调整方案:
一、降低全局学习率
过高的全局学习率会直接放大参数更新步长,导致权重剧烈震荡甚至溢出。LLaMA 3对学习率极为敏感,推荐起始值严格控制在安全区间内。
1、将--learning_rate参数从默认的5e-5或更高值,下调至2e-5或1e-5;
2、若使用余弦退火调度器,同步检查--warmup_ratio是否设置为0.1以保障初始阶段平滑上升;
3、在TrainingArguments中显式指定lr_scheduler_type="cosine",避免使用线性或常量调度加剧不稳定性。
二、启用分层学习率策略
LLaMA 3的Embedding层与LM_head层参数量大、梯度方差高,对学习率最不鲁棒,需单独降速以抑制局部爆炸。
1、定义参数分组逻辑:识别所有含"embed"或"lm_head"的命名参数;
2、为该组参数设置主学习率的0.1倍,例如主学习率为2e-5时,Embedding组设为2e-6;
3、在自定义Trainer子类的create_optimizer方法中构建optimizer_grouped_parameters并传入torch.optim.AdamW。
三、切换为低精度稳定优化器
标准AdamW在FP32下维护动量与方差,易在大batch或高学习率下累积数值误差;8-bit量化优化器可压缩状态内存并增强数值稳定性。
1、安装bitsandbytes:执行pip install bitsandbytes==0.43.0;
2、在训练参数中设置--optim adamw_8bit;
3、可选增强:将adam_beta2从默认0.999调低至0.95,减缓二阶矩估计速度,进一步抑制梯度尖峰。
四、引入梯度裁剪硬约束
梯度裁剪不改变优化方向,仅限制更新幅度,是应对突发梯度爆炸的最后防线,必须配合学习率调整共同启用。
1、在训练命令中添加--max_grad_norm 1.0;
2、若仍出现NaN,逐步收紧阈值至0.5或0.3;
3、确保该参数在TrainingArguments中被正确解析并传递至Trainer.train()内部的clip_grad_norm_调用。
五、验证数据预处理一致性
异常输入(如未截断超长序列、未归一化的嵌入向量、含非法token的文本)会在前向传播中诱发极端logits,反向传播后产生病态梯度,其效果等同于隐式提升学习率。
1、检查--cutoff_len是否按实际数据最大长度设置,严禁设为远高于需求的值(如100000),应设为4096或更低;
2、确认所有文本已通过模型对应分词器完成encode,且attention_mask与输入长度严格对齐;
3、对input_ids张量执行torch.isfinite().all()断言,在每个step开始前拦截非法值。











