LoRA 微调原理与实践:用少量显存定制大模型
全量微调一个数十亿参数的模型,需要为所有参数保存梯度和优化器状态,显存需求往往是模型本身的数倍,普通团队很难承受。LoRA(Low-Rank Adaptation,低秩适配)的核心思路是:冻结原模型的全部参数,只训练一小组新增的低秩矩阵,用很小的代价实现对模型行为的定向调整。它已经成为开源社区定制模型的事实标准。
LoRA 的核心思想
微调本质上是在原有权重上叠加一个变化量。LoRA 的假设是:这个变化量不需要满秩,可以用两个小矩阵的乘积来近似。打个比方,原权重是一张很大的表格,LoRA 不直接修改表格,而是额外训练两张“窄”表格,相乘后得到一张与原表同样大小的修正表,叠加到原权重上。
因为这两张窄表格的参数量远小于原矩阵,需要训练和保存的参数通常只占原模型的很小比例。训练完成后,可以把 LoRA 权重合并回原模型,推理时不增加额外延迟;也可以保持分离,在同一个基础模型上按需切换多个 LoRA 适配器,服务不同任务或客户。
关键超参数
秩(rank)
秩决定了那两张窄矩阵的“宽度”,也就是可调整的自由度。秩越大,表达能力越强,但参数越多、越容易过拟合。常见做法是从较小的值开始,根据评测结果调整。对于风格、格式这类相对简单的调整,小秩通常就够了。
缩放系数(alpha)
控制 LoRA 修正量叠加到原权重上的强度,通常与秩配合设置。不同框架的默认值和习惯写法不同,建议参考所用训练框架的文档。
作用的模块
LoRA 可以加在注意力层的投影矩阵上,也可以覆盖前馈层。覆盖的模块越多,效果上限越高,成本也越高。
学习率与轮数
LoRA 的学习率一般比全量微调高一些。训练轮数不宜过多,小数据集上多跑几轮很容易让模型“背答案”,丢失泛化能力。
QLoRA:进一步降低显存
QLoRA 把冻结的基础模型以 4 比特量化形式加载,再在其上训练 LoRA 参数。这样显存占用进一步下降,让单张消费级显卡微调较大的模型成为可能。代价是训练速度可能略慢,且量化本身会带来一定精度损失。量化的原理可参考模型量化详解。
实践流程
- 明确目标:是要固定输出格式、模仿特定语气,还是提升某类任务的准确率?目标不同,数据和评测方式完全不同。先确认提示工程确实无法满足,可参考微调还是提示词。
- 准备数据:质量远比数量重要。几百到几千条高质量、风格一致的样本,往往比几万条杂乱数据效果更好,具体标准见微调数据集构建指南。
- 选择基础模型:选择与目标任务语言、规模匹配的开源模型,并确认许可证允许你的使用方式。
- 小规模试训:先用少量数据和较少步数跑通流程,观察损失曲线和样例输出。
- 评测对比:用独立的测试集比较微调前后的效果,同时抽查通用能力是否明显退化。
常见坑
- 训练数据格式与推理时不一致:比如训练时用了某种对话模板,推理时却换了模板,效果会大打折扣;
- 过拟合:训练损失很低,但在新问题上表现变差,或者回答变得千篇一律;
- 灾难性遗忘:专项任务提升了,通用对话能力明显下降;
- 只看损失不看样例:损失下降不代表输出质量符合业务需求,一定要人工抽检。
小结
LoRA 让微调从“大厂专属”变成了中小团队也能负担的工具。但它解决的是行为和格式的定制,不是知识注入的捷径。明确目标、准备高质量数据、建立评测基线,才是 LoRA 项目成功的关键。