在LLM微调实践中,LoRA微调的学习率衰减策略常常被忽视,但却是影响模型性能的关键因素。最近在一次项目中,我们尝试使用LoRA微调一个7B参数的模型,在训练初期效果不错,但随着训练轮数增加,模型开始出现过拟合现象。
经过排查,问题出在学习率衰减策略上。最初采用的是线性衰减策略,学习率从1e-4逐渐降至1e-6,但在实际训练中发现,这种策略对LoRA层的收敛速度过快,导致模型参数提前进入局部最优解。
解决方案:
- 调整衰减策略为余弦退火:将线性衰减改为cosine decay,让学习率按照余弦函数变化,这样可以更平滑地降低学习率
- 设置合适的warmup阶段:增加500个step的warmup,让模型参数有一个稳定的学习起点
- 分离LoRA层和基础模型的学习率:对LoRA层使用更高学习率(如1e-3),基础模型使用较低学习率(如1e-5)
代码示例:
from transformers import get_cosine_schedule_with_warmup
# 设置优化器
optimizer = AdamW(model.parameters(), lr=1e-4)
# 设置cosine衰减调度器
scheduler = get_cosine_schedule_with_warmup(
optimizer,
num_warmup_steps=500,
num_training_steps=total_steps
)```
通过以上调整,模型训练稳定度和最终效果都有显著提升。
讨论