⚠️ Alpha内测版本警告:此为早期内部构建版本,尚不完整且可能存在错误,欢迎大家提Issue反馈问题或建议。
Skip to content

5.4 微调与 LoRA ​

核心问题: 微调改变什么,LoRA 又减少了哪些训练成本?

在线 Notebook

对应的交互式版本可在 Google Colab 打开,统一使用方式见 第0章说明。


SFT 的训练方式 ​

监督微调(Supervised Fine-Tuning,SFT)使用“指令—回答”样本继续训练语言模型:

text
[指令] 将 "Hello, world!" 翻译成中文。
[回答] 你好,世界!

训练通常仍使用 token 交叉熵,只对回答部分计算损失:

text
输入:[指令 tokens][回答 tokens]
标签:[忽略       ][回答 tokens]

SFT 可以调整任务行为、输出格式、术语使用,也可能让模型记住训练样本中的事实。它不保证新增知识能被稳定调用,也不适合频繁更新或需要来源追溯的知识;这类需求通常更适合 RAG 或外部工具。


全量微调与参数高效微调 ​

全量微调更新所有权重,显存中还需保存梯度和优化器状态。它提供较大的参数更新空间,但训练、存储和版本管理成本较高,也可能使原有任务表现下降。

参数高效微调(PEFT)只训练新增或选定的一小部分参数。LoRA 是常用方法之一。

LoRA ​

对于原权重 W0∈Rdout×din,LoRA 冻结 W0,并学习低秩更新:

W=W0+ΔW,ΔW=αrBA

其中 A∈Rr×din、B∈Rdout×r,α/r 是常见缩放约定,r 通常远小于输入和输出维度。不同实现可能采用其他等价参数化,比较配置时要同时记录 rank 和缩放。可训练参数量为:

r(din+dout)

而原矩阵参数量为 dindout。实际参数比例还取决于 LoRA 被插入哪些层,不能仅由 rank 推断。

训练完成后,可将 (α/r)BA 合并到 W0,以减少模型推理时的附加算子;也可以保留独立适配器,在同一基础模型上切换任务。统一维度约定见附录 A.8。

低秩更新是一种容量约束,不保证等价于全量微调。rank、目标模块、数据量和任务差异都会影响结果,应把全量微调或未微调模型作为基线。


选择训练起点 ​

起点适用情况主要风险
Base 模型需要自行建立指令行为,且有足够数据与评测数据和训练成本高
Instruct 模型已有对话能力,只需适配任务或格式原有对齐行为可能与任务冲突

选择具体模型时,检查:

  • 任务和语言在未微调模型上的基线;
  • tokenizer、上下文长度和输入模态;
  • 显存、吞吐与推理框架支持;
  • 权重许可证与数据许可;
  • 是否有稳定版本和可复现的评测结果。

模型系列更新很快,不在本节维护固定“推荐名单”。


对齐 SFT 与任务微调 ​

两者使用相似训练方法,区别在数据目标:

类型数据范围评价重点
通用指令 SFT多任务指令与回答指令遵循、通用能力、安全行为
任务微调特定领域或固定输出任务任务指标、格式正确率、能力保持

“通用助手”和“领域模型”不是严格的训练阶段边界。同一数据集也可能同时改变格式、领域术语和回答偏好。


微调前先判断瓶颈 ​

  • 提示词已能完成任务,只需固定模板:先改 Prompt 和输出校验。
  • 答案依赖频繁更新或私有资料:先评估 RAG。
  • 需要稳定学习特定格式、分类边界或行为:评估微调。
  • 需要调用系统并根据结果继续执行:评估工具调用或 Agent 流程。

微调后要同时检查目标任务、未参与训练的相邻任务和安全集,避免只报告训练集或单一平均分。


代码实验 ​

LoRA Visualization

图5.4:冻结原权重并训练低秩矩阵 A、B。图示只说明参数结构,不代表效果等同于全量微调。

代码文件: code/ch05_llm_basics/lora_visualization.py
运行方式: python code/ch05_llm_basics/lora_visualization.py

改变 rank 和目标矩阵尺寸,计算可训练参数量及其占比。


本节小结 ​

  • SFT 用回答 token 的监督损失调整模型行为,也可能记忆训练样本。
  • LoRA 用低秩矩阵限制可训练参数量,但效果需要与基线实测。
  • Prompt、RAG、微调和 Agent 解决的瓶颈不同,应先定义任务与指标再选择方法。

扩展阅读: 微调方法调研下一节: 5.5 偏好对齐:SFT、RLHF 与 DPO

本教程采用 CC BY-NC-SA 4.0 许可协议