📑 本页目录(点开跳转)
05 · 微调与 LoRA 家族
⏱ 34 分钟 | ⭐⭐ 最容易被误用的一块
🎯 一句话
微调 = 用少量数据改动模型权重。而 LoRA 的贡献是:只训练 0.1% 的参数就能达到接近全量微调的效果,让单张显卡也能微调大模型。
但先记住最重要的一句:大多数人以为自己需要微调,其实需要的是 RAG 或更好的提示词。
🚦 先做这个决策:你真的需要微调吗?
你想解决什么问题?
│
├─ 「模型不知道我们公司的产品/文档」
│ → ❌ 别微调 → ✅ 用 RAG(第 8 章)
│ 知识注入靠微调不可靠且易幻觉
│
├─ 「输出格式不对 / 不听指令」
│ → ❌ 先改提示词 + few-shot 示例
│ 能靠提示词解决的绝不微调
│
├─ 「需要特定的语气/风格/行业术语,提示词调不出来」
│ → ✅ 微调有效(这是它的强项)
│
├─ 「有大量高质量的领域样例,且任务固定重复」
│ → ✅ 微调有效(把长提示词"蒸馏"进权重,省 token)
│
├─ 「想用小模型达到大模型的效果(省钱)」
│ → ✅ 微调 + 蒸馏,这是最赚的场景
│
└─ 「延迟/成本要求极高,任务窄」
→ ✅ 微调小模型
🔑 黄金顺序:提示词 → few-shot → RAG → 微调。每一步都比下一步便宜、快、可逆。 这和智能体教程第 6 章的「降级测试」是同一个思想。
🧠 核心概念:LoRA 为什么有效
全量微调的问题
一个 7B 模型全量微调:
权重 14GB(FP16)+ 梯度 14GB + 优化器状态 56GB(Adam 存两份动量 FP32)
≈ 84GB 显存 💀 → 消费级显卡完全不可能
LoRA 的洞察
微调时权重的「改变量」ΔW 其实是低秩的——即它包含的「有效信息维度」很低,可以用两个小矩阵的乘积来近似。
- 原来:W_new = W + ΔW —— ΔW 和 W 一样大(比如 4096 × 4096 = 1600 万参数)
- LoRA:ΔW ≈ B × A —— B 的形状是 (4096 × r),A 的形状是 (r × 4096),r 通常取 8 / 16 / 32
这一步省了多少(以一层 4096×4096 的权重为例):
| 训练什么 | 参数量 | 占原来的 |
|---|---|---|
| 全量微调:整个 ΔW | 4096 × 4096 = 1600 万 | 100% |
| LoRA(r = 16):A + B | 4096×16 + 16×4096 = 13 万 | 0.8% ⭐ |
三个红利:
| 红利 | 说明 |
|---|---|
| 省显存 | 84GB → 十几 GB,单卡可训 |
| 产物极小 | LoRA 权重只有几十 MB(全量微调是几十 GB) |
| 可插拔 | 一个基座 + N 个 LoRA,按需切换。多租户场景的关键 |
QLoRA:再省一层
基座模型量化到 4bit(冻结不训,精度损失可接受)
+ LoRA 适配器用 16bit 训练
↓
7B 模型:单张 24GB 消费卡能微调
70B 模型:单张 A100/H100 能微调
这是让微调「平民化」的关键技术。
💡 「低秩」到底是什么意思(不用线代也能懂)
一个 4096×4096 的矩阵,有 1600 万个数字。
但如果它的"有效信息"其实只有 16 个方向,
那就能用 4096×16 和 16×4096 两个小矩阵拼出来。
⭐ 类比:
一张 4000×4000 的照片,如果内容是"纯色渐变",
你不需要存 1600 万个像素——存几个参数就能还原
→ 微调的改变量就像那个渐变:
它在【调整模型的倾向】,而不是【重写模型的知识】
所以信息量本来就低
🔑 这个洞察为什么重要:它说明了 LoRA 能做什么、不能做什么。
✅ 能做:调整风格、语气、输出格式、任务倾向 —— 这些是"低秩的改变" ❌ 做不好:注入大量新知识 —— 那需要"高秩的改变",LoRA 的容量不够
这从原理上解释了为什么「知识注入该用 RAG 而不是微调」—— 不是工程经验,是数学限制。
🎛️ 关键超参(真要动手时看)
| 参数 | 含义 | 经验值 |
|---|---|---|
r(秩) |
容量大小 | 8–32。任务越复杂越大。不是越大越好 |
alpha |
缩放系数 | 常设为 2r,实际生效强度是 alpha/r |
target_modules |
给哪些层加 LoRA | 只加注意力的 q/v 是经典做法;全线性层效果更好但更重 |
dropout |
防过拟合 | 0.05–0.1 |
| 学习率 | — | 比全量微调大一个量级(1e-4 ~ 3e-4) |
🕳️ 微调的四个大坑
| 坑 | 说明 |
|---|---|
| 灾难性遗忘 ⭐ | 只喂垂直数据,模型会忘掉通用能力(变傻)。缓解:混入 5–20% 通用数据 |
| 数据质量 | 几百条精品 > 几万条垃圾。脏数据会被模型忠实地学会 |
| 过拟合 | 小数据集训太多轮,模型开始背答案。通常 1–3 个 epoch 就够 |
| 评估缺失 | 没有留出测试集,"感觉变好了"往往是错觉。必须有第 11 章的评测 |
⚠️ 最常见的失败:花两周微调,效果还不如花两小时写好的提示词 + RAG。这就是为什么决策树排第一。
📋 数据准备:这才是微调 80% 的工作量
❌ 新手以为:难点在训练、在调 r 和学习率
✅ 实际上: 难点全在【造出一份高质量的训练数据】⭐
一份可用的微调数据集需要:
① 格式统一(每条都是 {instruction, input, output} 之类)
② 输出质量【一致】—— 这是最难的
· 如果一半样本简洁、一半啰嗦,模型学到的是"随机决定长度"
③ 覆盖你的真实分布(别只放理想情况,也要放边缘情况)
④ 去重(重复样本会被过度学习)
⑤ 留出测试集,且【和训练集没有重叠】⭐
💡 一个实用的量级参考: 风格/格式类微调,300~1000 条高质量样本通常就够。 如果你觉得"需要几万条",多半是想用微调解决知识问题——回到决策树。
⚠️ 数据泄漏在微调里同样致命: 如果你用大模型生成训练数据,测试集也从同一批生成的数据里切, 那测试分数会虚高得离谱——测试集必须来自真实场景,不能是合成的。
🔗 这是《机器学习基础》第 5 章那条纪律在微调上的版本。
🔗 和你已知的关系
左列有的来自日常用 LLM 的经验,有的在站内别的板块讲过——碰上过哪几条就从哪几条接进来,一条没碰过也不影响读这一章。
| 你可能已经知道的 | 这一章的对应 |
|---|---|
| 降级测试:先简单再复杂(智能体第 6 章) | 提示词 → RAG → 微调,同一个思想 |
| 蒸馏:大模型教小模型(推荐算法第 18 章) | 这里是「大模型生成数据 → 微调小模型」 |
| 过拟合、正则化、学习率(推荐算法) | 完全可迁移,概念一致 |
| Embedding 微调 | 同源思想,RAG 里也会微调 embedding 模型 |
🔗 这一章连到哪里
| 去哪 | 为什么 |
|---|---|
| Kaggle竞赛方法论 · 05 预训练模型详解 | ⭐ PEFT 全家桶的横向对比就在那里——Prefix Tuning / P-Tuning v2 / Prompt Tuning / Adapter 各加在哪、参数量多少、有没有推理延迟,还有一张「什么时候用哪个」的决策表。本章只讲透了 LoRA 这一条路,想看全景去那边 |
| Kaggle竞赛方法论 · 05 · 领域自适应预训练 | 当你的领域词汇和通用语料差太远(医疗、法律、代码),微调之前可能还要先做一轮继续预训练。什么时候值得做、怎么防灾难性遗忘,在那一节 |
| 强化学习基础 · 13 DPO 与免 RL 对齐 | 微调完还想让模型「更合口味」,下一步就是偏好微调。DPO 是目前门槛最低的那条路 |
| AI基础设施 · 18 量化 | QLoRA 的「Q」是什么、4-bit 量化到底损失了什么,在那一章 |
📦 深挖的话要学什么
📍 每条后面标了它在哪: 📗 本库有 = 站内已经讲透,点进去就行;📙 半有 = 站内讲了一半,另一半得外找; 📕 要外找 = 站内没有,得去论文或别处。 (这份清单以前只列词不说去哪,指到的坑有些站内根本没挖过,按图索骥会扑空。)
- PEFT 全家族:LoRA / QLoRA / DoRA / AdaLoRA、Prefix Tuning、Prompt Tuning、IA³ 的取舍 → 📗 本库有:Kaggle · 05 第九节,含对比表与选择决策表。本章只把 LoRA 和 QLoRA 讲透了,其余五种连名字都没出现过——真要在它们之间选,那张决策表就是你要的东西
- 实操链路:数据准备 →
peft+trl训练 → 合并权重 → 量化导出 → 部署 → 📙 半有:链路的后半段站内很扎实——量化导出看 AI基础设施 18 · 量化(PTQ 和 QAT 两条路为什么 LLM 时代一边倒;⚠️ "别人测 AWQ 几乎无损,到我这里就掉了"通常不是方法问题,是校准集不是你的分布),部署看 AI基础设施 20 · 推理服务化。前半段(peft+trl的训练代码、adapter 合并回基座)站内没有可跑脚本,要外找 - 数据合成:用大模型造训练数据(Self-Instruct / Evol-Instruct)、质量过滤 → 📙 半有:数据这一关 16 · 合成数据 讲的是「该不该用」这一侧——四种完全不同的东西都叫合成数据、五个成立条件、模型坍塌,⭐ 还有一个反直觉的实跑结论:加一步「质量过滤」反而让坍塌快 20 倍。你要是打算"多造一点再筛一遍",先去看那一节。 但 Self-Instruct / Evol-Instruct 的造题配方本身站内没有,要外找
- 偏好微调:在自己数据上跑 DPO(第 4 章) → 📗 本库有:强化学习基础 13 · DPO与免RL对齐。⚠️ 去之前先知道一个反直觉现象:DPO 训练中 chosen 的绝对概率常常也在下降(损失只约束相对差,完全允许两个都降只要 rejected 降得更多),结果是模型整体不自信、输出退化——那一章讲了为什么,也讲了先试拒绝采样往往更划算
- 蒸馏:大模型标注 → 小模型学习,成本骤降的主力路径 → 📗 本库有:AI基础设施 18b · 知识蒸馏(软标签里的"暗知识"、温度 T 和那个必须记住的 T² 缩放、Token 级 vs 序列级蒸馏,⚠️ 以及用别家模型输出做数据蒸馏的法务问题和"绝不能在蒸馏数据上评")
- 评估:留出集、A/B、防止「训练集泄漏到测试集」 → 📗 本库有:数据这一关 14 · 数据泄漏的七种来源(含一套可以直接抄的上线前泄漏体检)、数据这一关 13 · 评测集也是数据(留出集多大才够,把置信区间算出来);A/B 那一侧在 模型上线之后 12 · AB实验你以为你懂了。本章「数据准备:这才是微调 80% 的工作量」那一节说了是 80%,这三章就是那 80% 的展开
- 多 LoRA 服务:一个基座热切换多个适配器(vLLM 支持) → 📗 本库有:AI基础设施 20 · 推理服务化。它省的是「每个租户开一份完整实例」的显存;⚠️ 但主流引擎大多支持、少数不支持,要在选型时单独确认——等部署完再发现引擎不支持就要重来
需要的前置:第 2、4 章 + PyTorch + HuggingFace 生态。门槛不高——一张 24GB 显卡(或租云 GPU 几十块钱)就能完整走通。
⚖️ 要不要深挖
| 你的情况 | 建议 |
|---|---|
| 只做应用,没有专有数据 | ⛔ 不需要。把 RAG(第 8 章)学好 |
| 有专有数据,但主要是「知识」 | ⛔ 先做 RAG,微调不解决知识问题 |
| 需要特定风格/格式,且提示词搞不定 | ✅ 值得,且很快能上手 |
| 想用小模型省钱(高频固定任务) | ✅ 性价比最高的微调场景 |
| 想进模型/算法团队 | ✅ 必须会 |
🔑 我的判断:这块门槛低、见效快、但极易被误用。 深挖的价值不在「学会调参」,而在学会判断什么时候不该微调——这一章的决策树已经给了你 80%。 建议:除非你有明确的微调需求,否则排在 RAG 之后。
✅ 检查点
- 微调之前应该先试哪三件事?为什么是这个顺序?
- LoRA 的核心洞察是什么?为什么能省这么多显存?
- 「低秩」用大白话怎么理解?它决定了 LoRA 能做什么、不能做什么?
- QLoRA 比 LoRA 多做了什么?
- 微调 80% 的工作量在哪?一份可用的数据集需要满足哪五条?
- 风格类微调大概需要多少条数据?如果你觉得需要几万条,说明什么?
- 用大模型生成训练数据时,测试集该从哪来?
- 什么是灾难性遗忘?怎么缓解?
- 「模型不知道我们公司的文档」——该微调吗?为什么?(从原理答)
👀 答案
- 提示词 → few-shot 示例 → RAG。因为每一步都更便宜、更快、可逆——和智能体教程的「降级测试」同一个思想。
- 微调时权重的改变量 ΔW 是低秩的,可用两个小矩阵 B×A 近似。原矩阵冻结不训,只训 B 和 A(约 0.1–1% 参数),梯度和优化器状态跟着大幅缩小(84GB → 十几 GB)。
- 一个大矩阵的"有效信息"其实只有很少几个方向,就像一张纯色渐变的照片不需要存每个像素。因为微调是在调整倾向而不是重写知识,信息量本来就低。所以 LoRA ✅能做风格/语气/格式/任务倾向(低秩改变),❌做不好大量新知识注入(需要高秩改变)。
- 把冻结的基座模型量化到 4bit,进一步省显存,让 7B 在单张 24GB 消费卡、70B 在单张 A100 上可训。
- 在造数据,不在训练和调参。五条:①格式统一 ②输出质量一致(最难——一半简洁一半啰嗦,模型学到的是"随机决定长度")③覆盖真实分布含边缘情况 ④去重 ⑤留出和训练集无重叠的测试集。
- 300~1000 条高质量样本通常就够。觉得需要几万条,多半是想用微调解决知识问题——回到决策树,该用 RAG。
- 必须来自真实场景,不能是合成的。如果训练集和测试集都从同一批生成数据里切,测试分数会虚高得离谱。
- 只喂垂直数据导致模型忘掉通用能力。缓解:混入 5–20% 通用数据、控制训练轮数(1–3 epoch)、降低学习率。
- 不该。从原理上讲:知识注入需要"高秩的改变",而 LoRA 的容量本身就限制在低秩——这不是工程经验而是数学限制。该用 RAG。
🛑 可以停在这里
⚡ 走神救援
微调=改权重,但大多数人其实需要RAG或更好的提示词。黄金顺序:提示词→few-shot→RAG→微调(每步都更便宜更快更可逆)。LoRA洞察:ΔW低秩,用B×A近似,只训0.1%参数→单卡可训、产物几十MB、可插拔。⭐"低秩"的大白话:一个大矩阵的有效信息只有很少几个方向,因为微调是调整倾向不是重写知识——这从原理上决定了 LoRA 能做风格/语气/格式(低秩改变),做不好知识注入(高秩改变),所以"知识用RAG"不是经验是数学限制。QLoRA再把基座量化4bit。⭐微调80%的工作量在造数据不在调参:格式统一/输出质量一致(最难)/覆盖真实分布/去重/测试集必须来自真实场景不能是合成的;风格类微调300~1000条就够,觉得要几万条说明你在用微调解决知识问题。四坑:灾难性遗忘(混5-20%通用数据)、数据质量、过拟合(1-3epoch)、没评测。深挖价值在"学会判断何时不该微调",优先级排在RAG之后。
下一节 👉 06-推理优化.md