NLP 模型微调实战:LoRA、QLoRA 和 PEFT 方法详解
NLP 模型微调的核心思路:拿一个在大量数据上训练好的预训练模型,用你的目标任务数据继续训练它,让它从"什么都懂一点"变成"在你的领域特别擅长"。关键问题是:调多少参数、用什么策略调、怎么避免把预训练知识调没了。
全参数微调 vs 参数高效微调(PEFT)
全参数微调解冻所有权重,效果好但显存要求高——7B 模型全参微调至少需要 28GB 显存(Adam 优化器要存两份状态)。PEFT 冻住原始权重,只训练少量新增参数,显存降到原来的 1/3 甚至更低,效果通常能到全参的 90-95%。
LoRA 是目前最主流的 PEFT 方法:在权重矩阵旁加一个低秩分解 ΔW = BA,只训练 A 和 B 两个小矩阵。比如原始权重 4096×4096,rank=8 的 LoRA 只需要 4096×8×2 = 65536 个参数,压缩比 256:1。推理时把 LoRA 权重合并回原模型,零额外延迟。
pythonfrom peft import LoraConfig, get_peft_model config = LoraConfig( r=8, # 秩,越大表达能力越强但参数越多 lora_alpha=32, # 缩放系数,相当于学习率乘数 target_modules=["q_proj", "v_proj"], # 只对 Q/V 投影加 LoRA lora_dropout=0.1, task_type="CAUSAL_LM" ) model = get_peft_model(base_model, config) # 可训练参数通常只占全部的 0.1%-1%
其他 PEFT 方法怎么选
Adapter 在 Transformer 层之间插入小型全连接层,缺点是推理时有额外延迟。Prefix Tuning 在输入前加可训练的虚拟 token,适合生成任务但会占上下文窗口。Prompt Tuning 更轻量,只训 embedding 层的软提示,大模型(10B+)上效果才接近全参。实际项目里 LoRA 是默认选择,其他方法在特定场景有优势。
微调实操要点
学习率:微调的学习率要比预训练小 10-100 倍,LoRA 常用 1e-4,全参微调用 2e-5。太大会把预训练知识冲掉(灾难性遗忘),太小收敛太慢。
Rank 选择:简单任务 rank=4-8 够了,复杂任务可以开到 16-64。rank 越大越接近全参微调,但收益递减——从 8 升到 16 可能提升 2%,从 64 升到 128 基本没区别。
数据质量 > 数据量:1000 条高质量标注比 10000 条噪声数据效果好。数据不够时,数据增强(同义词替换、回译)和主动学习(挑模型最不确定的样本标注)比堆量更有效。
QLoRA:单卡微调大模型
QLoRA 在 LoRA 基础上把预训练权重量化到 4-bit,只保持 LoRA 参数为 16-bit。65B 模型用 QLoRA 只需要一张 48GB 的 A6000,而全参微调需要 8×A100。精度损失很小,论文报告在多数基准上与全参微调持平。代码层面就是把 BitsAndBytesConfig 配好再加载模型。
过拟合怎么发现和解决
训练 loss 持续下降但验证 loss 开始上升,就是过拟合了。解决方案:减少训练轮数(3-5 轮通常够了)、加大 dropout(0.1→0.3)、加权重衰减(0.01)、用早停策略。一个容易被忽略的点:数据增强只在训练集上做,验证集和测试集必须用原始数据,否则评估结果虚高。