You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用TRL框架DPO训练LoRA模型时APO损失恒定为1.0的问题

排查TRL框架下APO训练Loss恒定为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 18:35:16