完整题目
LoRA 是什么?它为什么能用极少的参数量和显存完成大模型微调,直觉上该怎么理解低秩适配?
本文目录
答案要点
- LoRA(Low-Rank Adaptation,低秩适配)= 冻结原模型全部权重,只训练旁路上两个小矩阵 A 和 B
- 核心假设:微调带来的权重变化量 ΔW 是"低秩"的——信息量远小于矩阵尺寸,用两个瘦长小矩阵相乘就能近似
- 可训练参数通常只有全量微调的 0.1%~1%,梯度和优化器状态开销随之骤降
- 训练完可把 B×A 合并回原权重,推理零额外延迟
- 一个底座模型可配多个 LoRA"插件",按任务热插拔
核心概念
LoRA 是一种参数高效微调方法:把预训练权重 W 整体冻结,在它旁边加一条"旁路"——先用小矩阵 A 把输入降到很低的维度 r,再用小矩阵 B 升回原维度,训练时只更新这两个小矩阵,标准LoRA常写成 W·x + (alpha/r)·B·A·x;下文的参数量例子不受这个缩放系数影响。
直觉解释(不需要数学推导):微调不是让模型"重新学会说话",而是在已有能力上做小幅调整——好比给西装改袖长,不必重做整件衣服。既然"改动量"本身信息含量低,就没必要用一个和原矩阵一样大的矩阵去存它。感受一下数字:一个 4096×4096 的权重矩阵约 1678 万参数;取秩 r=8 时,LoRA 只需 4096×8 + 8×4096 ≈ 6.5 万参数,约为原来的 0.4%。
省资源到底省在哪
| 显存开销 | 全量微调 | LoRA |
|---|---|---|
| 模型权重 | 要存 | 要存(但冻结) |
| 梯度 | 全部参数 | 只有 A、B |
| 优化器状态 | 通常为可训练参数维护两个Adam矩状态,字节数由dtype决定 | 通常只为可训练的A、B维护状态 |
显存不能只按7B与24GB口号判断。举例:7B的FP16权重约14GB,若全参Adam的两个矩状态都用FP32,它们另约56GB;这还不含梯度、可能的主权重、激活与缓冲。LoRA减少可训练状态,但基座与激活仍占空间。QLoRA再量化冻结基座;是否能在24GB上运行仍取决于序列、batch、挂载层、dtype、检查点和实现。
两个工程福利
- 可合并部署:在支持且精度匹配的实现中,把缩放后的B·A合入W可去掉独立adapter计算;未合并、多adapter路由或量化合并要另测开销与舍入误差。
- 多任务热插拔:底座只存一份,每个业务场景一个几十 MB 的 LoRA 文件,随用随换
入门后可以深入:秩 r 与缩放系数 alpha 怎么选、LoRA 该挂在哪些层,以及 QLoRA、DoRA 等变体。
参考资料
换一种问法,检查是否真正理解
概念辨析
有同学说"LoRA 省显存是因为不用加载整个模型",这个理解对吗?LoRA 训练时原模型权重还在不在显存里?到底省掉的是哪部分开销?
场景切入
公司只有一张 24G 的 4090,想在 7B 模型上微调一个客服问答助手,你会怎么做?为什么全量微调跑不起来而 LoRA 可以?
练习口述回答 · 约2分钟
- 一句话定位:LoRA 是参数高效微调,核心假设是微调改动本身信息量小
- 直觉理解:像改西装袖长,不用重做整件衣服
- 资源节省:梯度和优化器开销大幅降低,消费级显卡就能跑
- 工程优势:推理零延迟、多任务热插拔
这道题其实是在问,大模型微调这么吃资源,怎么用极小的参数量就能做。[[LoRA]] 的核心假设很关键:微调不是让模型重新学说话,而是在已有能力上做小幅调整,这个调整量本身信息密度很低,没必要用一个和原矩阵一样大的矩阵去存它。你可以理解为,模型在大规模预训练后已经学会了通用知识,微调只是改改特定任务的输出倾向,像是给西装改袖长,不用重做整件衣服。
具体做法很简单:冻结原模型全部权重,在旁边加一条旁路,先用一个小矩阵 A 把输入降到很低的维度 r,再用另一个小矩阵 B 升回原维度,训练时只更新这两个小矩阵。标准LoRA前向常写为W·x加上(alpha/r)·B·A·x。直观感受一下数字:一个 4096×4096 的权重矩阵约 1678 万参数,取秩 r=8 时,LoRA 只需 4096×8 + 8×4096 ≈ 6.5 万参数,只有原来的 0.4%。
资源节省主要体现在梯度和优化器状态上。例如7B的FP16权重约14GB,全参Adam若两个矩状态用FP32另约56GB,还未计梯度和激活。LoRA减少可训练状态,QLoRA再量化冻结基座;24GB是否够要看序列、batch、dtype与实现,不能统一保证。支持合并且精度匹配时,可以把缩放的B×A合入权重去掉独立adapter计算;未合并、多adapter及量化合并应分别测试开销与误差。另外,一个底座模型可以配多个 LoRA 插件,按任务热插拔,比如客服场景,退款和满减各存一个几十 MB 的文件,随用随换。
这里有个常见失败场景:任务偏移大时可能需要调整rank、挂载模块、数据或比较全参微调,但不能仅凭“新语言”就断言低秩适配必然失败。所以上线前我会先评估任务性质,如果只是调整输出风格或领域知识,LoRA 很合适;如果需要大幅改变模型能力,还是得考虑全量微调。
另外,LoRA 的秩 r 和缩放系数 alpha 怎么选,其实很依赖具体任务,一般 r 取 8 到 64,alpha 根据 r 和训练数据调整。面试官如果追问,可以展开聊聊不同层挂 LoRA 的效果差异。