LoRA 的原理是什么?rank、alpha 和 target_modules 如何选择?
简化版
LoRA 冻结原权重,用两个可训练低秩矩阵表示任务权重增量,显著减少可训练参数和优化器状态。rank 控制增量容量,alpha 控制缩放,target_modules 决定把 LoRA 加到哪些线性层;它们没有跨模型通用的最优值,必须结合任务和评估选择。
详细版
对原权重矩阵 W,LoRA 使用:
W' = W + sBA
s = alpha / r
其中 A 和 B 的中间维度为 r。当 r 远小于输入、输出维度时,可训练参数约为 r(d_in + d_out),小于完整矩阵的 d_in × d_out。
- rank:越大容量和参数越多,但不保证效果单调提升;
- alpha:调节 LoRA 更新相对基座输出的尺度;
- target_modules:可只选注意力投影,也可覆盖更多线性层;
- dropout:小数据时可缓解过拟合;
- 初始化:通常让初始增量接近零,使训练从基座行为开始。
选参时先用较小 rank 建基线,再比较目标层覆盖、验证集效果、显存和延迟。
完整版教学
记忆钩子:微调题先分清目标是改行为、补知识还是降成本,再谈 SFT、LoRA、QLoRA 和评估上线。
一、为什么低秩增量可能有效
微调虽然允许全部权重变化,但任务所需的有效变化可能集中在较低维子空间。LoRA 不直接压缩原模型,而是限制新增的权重变化为低秩形式。
这是一种建模假设,不是数学保证。任务差异越大,低秩空间越可能成为限制。
二、矩阵是怎么接入的
前向计算同时经过冻结的原线性层和 LoRA 分支,两路结果相加。反向传播只更新低秩矩阵,基座权重不保存梯度和优化器状态。
不同实现对两个矩阵的命名、形状和初始化方向可能相反,但“一个分支初始为零,使整体增量起步为零”的目标相同。
三、rank 与 alpha 不能分开看
rank 增加会提高参数量和表达容量;alpha 决定增量缩放。原始缩放为 alpha/r,部分变体采用其他缩放规则,因此复制配置时要同时确认实现。
高 rank 不等于“学到更多知识”,低 rank 也不天然防止过拟合。应观察验证指标和更新幅度。
四、目标模块怎么选
经典做法常选择注意力的 query、value 投影,现代实践也会覆盖 key、output 和 MLP 线性层。覆盖越广,可训练参数与容量越大。
模块名称依赖模型架构,配置写错可能导致没有层被训练。训练前应打印可训练参数及实际命中的模块。
五、合并与部署
训练后可保留“基座 + Adapter”,便于切换任务;也可把增量合并到基座权重,减少额外推理算子。合并后的模型体积接近完整模型,且必须记录对应基座版本。
多个 LoRA 可以组合,但简单相加可能互相干扰,需要单独评估。
六、常见排查
若损失不下降,检查目标模块、学习率、Mask 和数据格式;若快速过拟合,降低学习率、rank 或训练步数;若目标能力不足,再尝试扩大模块覆盖,而不是只增大 rank。
七、面试拆解算例
微调题可以用一个小项目来拆:基座模型 7B,业务只需要客服问答风格统一,训练集初筛 30,000 条,清洗后留下 8,000 条高质量样本。若全量微调,7B 参数按 BF16 仅权重就约 14GB,训练还要梯度和优化器状态;若用 LoRA,只训练低秩增量,显存压力会明显下降,但表达能力受 rank 和目标模块影响。
base_model: 7B
raw_samples: 30000
clean_samples: 8000
lora_rank: 8 or 16
learning_rate: 1e-5 ~ 2e-4
validation_split: 5% ~ 10%
| 方案 | 适合目标 | 主要风险 | 验收重点 |
|---|---|---|---|
| Prompt | 临时改格式、少量约束 | 长提示不稳定 | 单轮成功率 |
| RAG | 接入动态知识 | 检索召回不足 | 引用与命中率 |
| SFT/LoRA | 固化行为和领域表达 | 遗忘与过拟合 | 回归集与人工偏好 |
| 全量微调 | 深度改模型能力 | 成本高、风险大 | 全面评测 |
数据清洗 -> 训练/验证切分 -> 小步试训 -> 回归评测 -> 灰度上线
| | | |
去噪去重 防泄漏 看 loss 看坏例
因此回答「LoRA 的原理是什么?rank、alpha 和 target_modules 如何选择?」时,不要直接说“用微调”。先问目标是什么、数据是否足够干净、是否有动态知识,再选择 Prompt、RAG、PEFT 或全量微调,最后用评估集证明它确实变好了。
八、常见误区与追问
- 误区:微调就是把业务文档喂给模型让它记住。 微调更适合塑造行为格式、任务风格和领域表达,动态知识与事实更新通常更适合 RAG。
- 追问:为什么这个问题不用 Prompt 或 RAG 解决? 面试里要先说明目标是改行为、补知识还是接外部数据,再选择微调方案。
- 误区:训练集越大越好。 SFT 更怕低质、冲突、模板化和泄漏数据;少量高质量样本常常胜过大量脏样本。
- 追问:上线前你会看哪些评估? 至少要覆盖基准集、人工偏好、回归用例、安全红线、延迟成本和灾难性遗忘检查。
- 误区:LoRA/QLoRA 省显存就没有代价。 参数高效方法降低训练成本,但 rank、目标模块、量化误差和合并部署都会影响最终质量。
九、加强记忆
LoRA 把“改整张大矩阵”变成“学习一个低秩增量”:rank 管容量,alpha 管尺度,target_modules 管改哪里;参数少是优势,效果仍要靠数据与评估证明。