跳过正文
  1. 所有文章/

大模型微调实战:全参数微调与 LoRA 的选择

Aaron
作者
Aaron
I only know that I know nothing.
目录

前言
#

最近在做项目时需要微调一个大模型,在选型过程中对比了全参数微调和 LoRA,顺便把微调相关的实战经验梳理了一遍。大模型开箱即用听起来很美好,但实际落地时会发现预训练模型只会续写,不会对话。要让模型真正按指令办事,指令微调(SFT)是绕不过去的一步。这篇文章就把微调的核心原理、方案选型和一些实战经验整理出来,希望能帮到同样在做模型落地的同学。

预训练模型为什么不够用
#

先搞清楚一个前提:预训练后的模型只会续写,不会对话。

这不是 bug,是设计如此。预训练的目标就是让模型学会「给定上文,预测下一个字」。所以你输入「今天天气真好」,它接一句「适合出去散步」。续写能力很强,但不会「听指令办事」1

打个比方,预训练就像让一个人读了万卷书,知识渊博,但没有人教过他怎么跟人对话。你问他「能帮我总结一下吗?」,他的反应可能是「好啊好啊,你给我看呗」,而不是真的动手去总结。因为他根本不知道「总结」是一个需要执行的指令,而不是一句客套话。

SFT(Supervised Fine-Tuning,有监督微调)就是用有标签的指令数据对模型进行训练,让它学会理解和执行人类指令。没有这一步,模型就是一个高级续写器;有了这一步,模型才是一个真正的助手。

而且 SFT 还有一个意外惊喜:泛化能力。你用摘要、情感分析、翻译三种指令数据训练模型,它可能突然就会做推理和改写了。这种「举一反三」的能力,是大模型最迷人的地方。

全参数微调 vs 参数高效微调
#

微调方式主要分两大阵营:

类型 说明 适用场景
全参数微调 对模型所有参数进行微调 高敏感场景(医疗、金融等),预算充足
参数高效微调 只微调部分参数 一般性任务,预算有限

在参数高效微调里,又有几个具体方案:

方案 特点 推荐程度
LoRA 效果最稳定,最接近全参数微调 首选推荐
Prompt Tuning 效果不太稳定 不推荐首选
Prefix Tuning Prompt Tuning 的一种变体 不推荐首选
Adapter 推理会变慢 不推荐首选

LoRA 的核心原理
#

LoRA(Low-Rank Adaptation)的核心思想很优雅:冻结预训练模型的原始权重,只在每一层旁边加一个低秩分解矩阵来学习增量变化 2

具体来说,假设模型某一层的权重矩阵是 W,LoRA 把它改写成:

W' = W + ΔW = W + B × A

其中 B 是 d×r 的矩阵,A 是 r×d 的矩阵,r 远小于 d。训练时只更新 A 和 B,原始权重 W 保持不变。这样需要训练的参数量从 d² 降到 2×d×r,大幅减少。

打个比方,全参数微调就像把一个员工送回学校重新读一遍学位,什么都重新学一遍,效果当然好但成本极高。LoRA 微调就像给员工安排一个为期两周的专项培训班,只学跟岗位直接相关的技能,大部分情况下够用了 3

# 以 LLaMA-Factory 为例,使用 LoRA 微调的典型配置
llamafactory-cli train \
  --model_name_or_path meta-llama/Llama-2-7b-hf \
  --finetuning_type lora \
  --lora_rank 8 \
  --lora_target q_proj,v_proj \
  --dataset alpaca_zh \
  --output_dir ./output/lora_model

一句话总结:有钱任性可以全参数微调;预算不足优选 LoRA,效果几乎接近全参数微调。

三条实战经验
#

理论讲完了,来看一些经过验证的实战经验。以下经验来自一个翻译大模型项目的实际测试结果,每一条都挺反直觉的。

经验一:示例数量宁少勿多
#

很多人直觉上觉得,给模型的示例越多,效果越好。实际测试结果直接打脸:

方案 效果
无示例(零样本) 输出不稳定
1 个示例(单样本) 输出稳定,效果最佳
多个示例(多样本) 性能不再提升,反而可能下降

示例宁少勿多,加一个示例效果最好。多了不仅没用,还可能干扰模型。这就像教一个人做菜,给一份食谱他能照着做,给十份食谱他反而不知道该听谁的了 4

经验二:数据质量远胜于数据数量
#

这条经验更加反直觉。在这个翻译项目中,团队从 20 万条中英句子中按质量筛选出前 25%(约 5 万条),用这 5 万条高质量数据训练的模型,效果竟然比用全部 20 万条数据训练的更好。

原因很简单:全量数据中包含大量低质量样本,这些「噪声」反而把模型带偏了。

所以做微调项目的时候,数据采集的第一步不应该是「找更多数据」,而应该是「定义什么是好数据」。先定好质量标准,按标准筛选,宁缺毋滥 5

经验三:模型参数规模与成本的权衡
#

不同参数规模的训练成本差异巨大:

模型参数 硬件资源 训练时间
38B 128 张昇腾芯片 11 天
2.6B 8 张 A100 显卡 9 天

模型规模仍然有用,但必须考虑成本。高敏感场景(医疗、金融)用大模型加全参数微调;一般性任务(客服、内容生成)用小模型加 LoRA,成本低、迭代快。不是所有场景都需要请「大牛」出马,合适才最重要。

跨语言微调的一个经典思路
#

假设你的模型只懂中英文,现在需要让它学会一种新的语言(比如泰语),而泰语数据少,词表中根本没有泰语词。一个泰语句子被切分成一堆乱七八糟的片段,模型完全看不懂。

怎么解决?一个经过验证的方案是扩展词表加增量微调,具体分四步:

  1. 训练目标语言的分词器,让系统先认识这种语言的基本单位
  2. 将新语言的词加入原 Token 词表,给模型的「字典」里加新词
  3. 用混合数据做增量微调,让模型在已有知识基础上补充学习
  4. 使用 LoRA 进行高效参数微调,低成本完成最后的适配

效果对比非常明显。优化前,一个句子被切分成一堆毫无意义的片段;优化后,同一句子被合理切分为 21 个 Token,模型终于「看懂」了。

这个思路可以推广到更多场景。比如你的模型要支持某个垂直行业(医疗、法律),可以先往词表里补充行业专有术语,再用行业数据做增量微调。不必推倒重来,在已有能力的基础上做加法就行。

评估体系:别只看学术指标
#

最后说一个容易被忽视的点:评估方式。

BLEU、ROUGE 这些学术指标只能做参考,它们衡量的是文本表面的相似度,不代表实际使用效果。一个翻译结果 BLEU 分数很高,但读起来可能完全不自然。一个摘要 ROUGE 分数很高,但可能遗漏了关键信息。

真正有效的评估方式是人工测评加 A/B 测试。线上部署两套模型,让真实用户来评判哪个更好。效果才是真理,用户满意才是最终的评价标准。


  1. 预训练模型本质上是一个条件语言模型,P(xt | x_1, …, x{t-1})。它擅长的是概率意义上的文本续写,而不是理解指令意图。 ↩︎

  2. LoRA 论文由 Hu 等人于 2021 年发表,全称「LoRA: Low-Rank Adaptation of Large Language Models」。论文证明在多数任务上,秩 r=4 或 r=8 的 LoRA 就能达到接近全参数微调的效果。 ↩︎

  3. 参数量的差异是巨大的。以 7B 模型为例,全参数微调需要训练 70 亿个参数,而 LoRA(r=8)通常只需要训练不到 1% 的参数。 ↩︎

  4. 这种现象在 Few-Shot Learning 的研究中也有类似发现,被称为「demonstration sensitivity」,即模型对示例的选择和数量非常敏感。 ↩︎

  5. 「LIMA: Less Is More for Alignment」这篇论文也验证了这一结论:仅用 1000 条高质量数据训练的模型,效果可以媲美用数十万条数据训练的模型。 ↩︎