一家公司想让开源模型更懂自己的产品问答,听到全量微调要改动几十亿参数,很容易先被机器费用吓退。LoRA 给了另一条路。它保留基础模型的大部分权重,只训练一小组附加参数,训练文件和任务切换都能轻很多。
门槛降了,训练仍不会自动变对。
我把 LoRA 原论文、微软公开代码和 Hugging Face 的 PEFT 文档对了一遍。这个方法会冻结原有权重,在选定层加入两块较小的低秩矩阵。训练时只学习这两块矩阵表示的权重改变量,推理时再把改变量和基础权重一起使用。
省下的是哪部分
原论文用 GPT-3 175B 做实验时,报告可训练参数最多减少一万倍,GPU 显存需求约降到原来的三分之一。这个数字说明方法有多大潜力,不能直接写进任何新项目的采购表。模型大小、目标层、优化器和训练长度变了,实际显存与时间也会跟着变。
LoRA 的另一个好处来自保存方式。同一个基础模型可以配多份小适配器,客服问答用一份,产品分类再用一份。切换任务时替换相应矩阵,不用为每项任务保存完整模型副本。部署允许时,还可以把适配器权重合并进基础权重,避免额外增加推理层数。
这也带来版本管理问题。适配器依赖具体基础模型,换了模型版本、分词器或对话模板,原先效果可能变化。发布时要一起记录基础模型标识与适配器版本,训练数据的版本也要留下。只存一个几十兆的文件名,过几个月很难还原它为什么能用,更无法判断新基础模型能否继续加载。
低秩不代表低要求
Hugging Face 的文档说明,可训练参数量取决于 rank、目标层和矩阵形状。常见做法会选注意力模块,具体任务也可能需要其他层。rank 提高会增加学习能力,也会增加参数和训练成本。原论文同样提醒,很小的 rank 在其实验中表现不错,不保证适合每个任务与数据集。
训练数据仍然决定模型学到什么。产品问答里若混着过期型号、互相冲突的售后口径和没有答案的提问,LoRA 只会更高效地学习这些问题。数据准备应先去重,标清版本,并把拒答和转人工样例放进去。敏感客户资料还要确认是否允许进入训练集。
评测也要留出训练数据之外的一组真实问题。至少记录答案是否正确、该拒绝时是否拒绝,以及改版后旧能力掉了多少。再拿同一批问题比较基础模型、LoRA 适配器和提示词方案。若提示词已经够用,训练未必值得;若 LoRA 在目标任务上稳定改善,节省下来的训练参数才有业务意义。