使用TRL框架DPO训练LoRA模型时APO损失恒定为1.0的问题
问题场景
使用TRL框架,通过LoRA适配器结合APO损失函数进行偏好优化训练Qwen2-1.5B-Instruct模型,训练过程中Loss始终恒定在约1.0,调整学习率和部分配置后无改善,核心代码如下:
model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen2-1.5B-Instruct", device_map='auto', load_in_4bit=True) lora_config = LoraConfig( r=64, lora_alpha=16, lora_dropout=0.05, target_modules=['q_proj', 'v_proj'], bias='none', task_type='CAUSAL_LM' ) model = get_peft_model(model, lora_config) ref_model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen2-1.5B-Instruct", device_map='auto', load_in_4bit=True) tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen2-1.5B-Instruct") training_args = DPOConfig( output_dir="Qwen2-1.5B-DPO", per_device_train_batch_size=2, gradient_accumulation_steps=8, gradient_checkpointing=True, bf16=True, loss_type='apo_down', logging_steps=10, report_to='none') trainer = DPOTrainer(model=model, ref_model=ref_model, args=training_args, processing_class=tokenizer, train_dataset=dataset) trainer.train()
排查步骤
验证数据集格式:APO依赖包含
chosen(偏好回答)和rejected(非偏好回答)的数据集结构,打印数据集样本确认字段是否正确:print(dataset[0])若字段缺失或内容不符合要求(如空文本、格式不匹配),会导致Loss异常。
确认参考模型参数冻结:4bit加载下需手动确保ref_model处于评估模式且参数不可训练:
ref_model.eval() for param in ref_model.parameters(): param.requires_grad = False若ref_model参数未冻结,会干扰Loss计算逻辑。
调整LoRA配置:当前仅针对
q_proj和v_proj,扩大目标模块范围至Qwen2-1.5B的全部注意力投影层:target_modules=['q_proj', 'k_proj', 'v_proj', 'o_proj']同时降低LoRA秩r(如设为8或16),将lora_alpha设为r的2倍(如r=8则alpha=16),避免秩过大导致训练无效。
检查可训练参数与学习率:打印可训练参数数量确认LoRA是否生效:
print("Trainable params:", sum(p.numel() for p in model.parameters() if p.requires_grad))显式设置APO适配的学习率(建议1e-5~1e-4),在
DPOConfig中添加learning_rate=2e-5。排查混合精度与梯度检查点冲突:暂时关闭
gradient_checkpointing=True,观察Loss是否变化,部分场景下该配置会导致梯度传播异常。更新TRL版本:确保TRL版本≥0.8.0,旧版本对APO损失的支持存在缺陷,执行升级命令:
pip install --upgrade trl保证模型权重一致性:让ref_model直接复用训练模型的初始权重,避免重新加载时的微小差异:
ref_model = AutoModelForCausalLM.from_pretrained( "Qwen/Qwen2-1.5B-Instruct", device_map='auto', load_in_4bit=True, state_dict=model.state_dict() )
内容的提问来源于stack exchange,提问作者Olga Nikitina

