🏠 总目录📚 本教程 05 · 微调与 LoRA
📑 本页目录(点开跳转)

05 · 微调与 LoRA 家族

34 分钟 | ⭐⭐ 最容易被误用的一块


🎯 一句话

微调 = 用少量数据改动模型权重。而 LoRA 的贡献是:只训练 0.1% 的参数就能达到接近全量微调的效果,让单张显卡也能微调大模型。

Wd × d预训练权重(冻结)❄️ 不更新+Ad × r×Br × d只训这两个 🔥r 通常只有8 ~ 64而 d 是几千→ 可训参数降到千分之几不改原权重,只在旁边加一个「又瘦又矮」的增量⭐ 赌的是:微调需要的改动本身就是「低秩」的 —— 适应一个新任务不需要动遍每个方向⚠️ 所以它不适合让模型学【全新的知识】,适合调风格、格式、领域口径
原权重冻住不动,只在旁边训一个「又瘦又矮」的增量(r 通常 8~64,而 d 是几千)。⭐ 它赌的是「微调需要的改动本身就是低秩的」 —— ⚠️ 所以它适合调风格和口径,不适合灌全新知识

但先记住最重要的一句:大多数人以为自己需要微调,其实需要的是 RAG 或更好的提示词。


🚦 先做这个决策:你真的需要微调吗?

   你想解决什么问题?
        │
        ├─ 「模型不知道我们公司的产品/文档」
        │       → ❌ 别微调  → ✅ 用 RAG(第 8 章)
        │         知识注入靠微调不可靠且易幻觉
        │
        ├─ 「输出格式不对 / 不听指令」
        │       → ❌ 先改提示词 + few-shot 示例
        │         能靠提示词解决的绝不微调
        │
        ├─ 「需要特定的语气/风格/行业术语,提示词调不出来」
        │       → ✅ 微调有效(这是它的强项)
        │
        ├─ 「有大量高质量的领域样例,且任务固定重复」
        │       → ✅ 微调有效(把长提示词"蒸馏"进权重,省 token)
        │
        ├─ 「想用小模型达到大模型的效果(省钱)」
        │       → ✅ 微调 + 蒸馏,这是最赚的场景
        │
        └─ 「延迟/成本要求极高,任务窄」
                → ✅ 微调小模型

🔑 黄金顺序提示词 → few-shot → RAG → 微调。每一步都比下一步便宜、快、可逆。 这和智能体教程第 6 章的「降级测试」是同一个思想。


🧠 核心概念:LoRA 为什么有效

全量微调的问题

   一个 7B 模型全量微调:
   权重 14GB(FP16)+ 梯度 14GB + 优化器状态 56GB(Adam 存两份动量 FP32)
   ≈ 84GB 显存 💀  → 消费级显卡完全不可能

LoRA 的洞察

微调时权重的「改变量」ΔW 其实是低秩的——即它包含的「有效信息维度」很低,可以用两个小矩阵的乘积来近似。

同一件事的两种写法
训练时 W 整个冻住不动,只更新 A 和 B 这两个又瘦又矮的小矩阵(就是本章开头那张结构图里旁挂的那条支路)。

这一步省了多少(以一层 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 量化到底损失了什么,在那一章

📦 深挖的话要学什么

📍 每条后面标了它在哪: 📗 本库有 = 站内已经讲透,点进去就行;📙 半有 = 站内讲了一半,另一半得外找; 📕 要外找 = 站内没有,得去论文或别处。 (这份清单以前只列词不说去哪,指到的坑有些站内根本没挖过,按图索骥会扑空。)

需要的前置:第 2、4 章 + PyTorch + HuggingFace 生态。门槛不高——一张 24GB 显卡(或租云 GPU 几十块钱)就能完整走通。


⚖️ 要不要深挖

你的情况 建议
只做应用,没有专有数据 ⛔ 不需要。把 RAG(第 8 章)学好
有专有数据,但主要是「知识」 先做 RAG,微调不解决知识问题
需要特定风格/格式,且提示词搞不定 ✅ 值得,且很快能上手
想用小模型省钱(高频固定任务) 性价比最高的微调场景
想进模型/算法团队 ✅ 必须会

🔑 我的判断:这块门槛低、见效快、但极易被误用。 深挖的价值不在「学会调参」,而在学会判断什么时候不该微调——这一章的决策树已经给了你 80%。 建议:除非你有明确的微调需求,否则排在 RAG 之后。


✅ 检查点

  1. 微调之前应该先试哪三件事?为什么是这个顺序?
  2. LoRA 的核心洞察是什么?为什么能省这么多显存?
  3. 「低秩」用大白话怎么理解?它决定了 LoRA 能做什么、不能做什么?
  4. QLoRA 比 LoRA 多做了什么?
  5. 微调 80% 的工作量在哪?一份可用的数据集需要满足哪五条?
  6. 风格类微调大概需要多少条数据?如果你觉得需要几万条,说明什么?
  7. 用大模型生成训练数据时,测试集该从哪来?
  8. 什么是灾难性遗忘?怎么缓解?
  9. 「模型不知道我们公司的文档」——该微调吗?为什么?(从原理答)
👀 答案
  1. 提示词 → few-shot 示例 → RAG。因为每一步都更便宜、更快、可逆——和智能体教程的「降级测试」同一个思想。
  2. 微调时权重的改变量 ΔW 是低秩的,可用两个小矩阵 B×A 近似。原矩阵冻结不训,只训 B 和 A(约 0.1–1% 参数),梯度和优化器状态跟着大幅缩小(84GB → 十几 GB)。
  3. 一个大矩阵的"有效信息"其实只有很少几个方向,就像一张纯色渐变的照片不需要存每个像素。因为微调是在调整倾向而不是重写知识,信息量本来就低。所以 LoRA ✅能做风格/语气/格式/任务倾向(低秩改变),❌做不好大量新知识注入(需要高秩改变)。
  4. 冻结的基座模型量化到 4bit,进一步省显存,让 7B 在单张 24GB 消费卡、70B 在单张 A100 上可训。
  5. 在造数据,不在训练和调参。五条:①格式统一 ②输出质量一致(最难——一半简洁一半啰嗦,模型学到的是"随机决定长度")③覆盖真实分布含边缘情况 ④去重 ⑤留出和训练集无重叠的测试集
  6. 300~1000 条高质量样本通常就够。觉得需要几万条,多半是想用微调解决知识问题——回到决策树,该用 RAG。
  7. 必须来自真实场景,不能是合成的。如果训练集和测试集都从同一批生成数据里切,测试分数会虚高得离谱。
  8. 只喂垂直数据导致模型忘掉通用能力。缓解:混入 5–20% 通用数据、控制训练轮数(1–3 epoch)、降低学习率。
  9. 不该从原理上讲:知识注入需要"高秩的改变",而 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

打卡记录保存在你的浏览器里,首页能看到总进度