微调与对齐

讲一下 LoRA 的原理和细节:低秩矩阵为什么有效、A/B 怎么初始化、更新哪些参数?

91学AI·2026/7/26·9 阅读

考察点

这是 LoRA 的专项深挖题,面试官想区分「用过 LoRA」和「懂 LoRA」的人。重点看三处:低秩假设能不能讲出所以然而不是一句「经验上有效」;初始化为什么这么设计(答成「两个都随机初始化」基本露馅);对参数量、缩放系数 alpha、合并推理这些细节是否清楚。追问会往 rank 选择、target modules、QLoRA 方向走。

参考答案

出发点:微调到底在改什么

预训练模型的权重 W 在下游任务微调时产生的变化量 ΔW,并不是一个满秩的任意矩阵。原论文引用的依据来自两方面:一是预训练模型本身的权重就呈现很低的内在维度(intrinsic dimension),任务相关的信息集中在少数几个方向;二是对 ΔW 做奇异值分解会发现,奇异值谱衰减很快,头部少数几个奇异值贡献了绝大部分能量。直觉上也说得通:微调不是重学一门语言,而是在已有能力上做一个「方向性的小修正」,这种修正天然是低秩的。

既然如此,就没必要存一个 d×k 的满秩 ΔW,把它分解成两个小矩阵的乘积就够了:

ΔW ≈ B·A,其中 A ∈ R^{r×k},B ∈ R^{d×r},r ≪ min(d, k)

前向计算从 h = Wx 变成 h = Wx + (α/r)·BAx。其中 α 是一个缩放超参,除以 r 的意义是让更新幅度对 r 不敏感——调 rank 时不用跟着重调学习率。实践中常设 α = r 或 α = 2r。

参数量账

以一个 4096×4096 的注意力投影矩阵为例:满秩 ΔW 是 1677 万参数,r=8 的 LoRA 只需要 4096×8×2 ≈ 6.6 万,压缩了约 250 倍。整个 7B 模型对所有注意力层 Q/K/V/O 加 r=16 的 LoRA,可训练参数大约在两千万到四千万级别,占全参数的千分之几。这意味着优化器状态(AdamW 下每个参数要额外存两个动量)也只按这一小撮参数算,训练显存大头从「参数+梯度+优化器状态」变成了「激活值」,这是 LoRA 省显存的真正来源——它省的不是前向,是反向和优化器。

初始化:A 随机、B 置零

这是个经典细节考点。标准做法是 A 用高斯随机初始化(如 N(0, σ²)),B 初始化为全零矩阵。这样训练开始时 ΔW = BA = 0,模型行为和原始预训练模型完全一致,训练是从「零扰动」出发平滑地学出增量。

为什么不能两个都随机?两个都随机的话,初始的 BA 是一个随机的低秩矩阵,相当于训练一开始就往权重里注入了一份随机噪声,前几步训练得先「消化」掉这份扰动,实践上会拖累收敛和最终效果。反过来 B 随机、A 置零在数学上等价(乘积也是零),论文选了 A 随机、B 置零,部分实现(如 PEFT 库)默认就是这样,有的实现还允许用 SVD 分解已有权重差来初始化(如 PiSSA、LoRA-GA 这类改进工作),核心思想都是让初始增量更合理。

更新哪些参数

训练时原权重 W 全部冻结,只有 A、B 接收梯度。施加位置默认是注意力层的 Q、K、V、O 四个投影矩阵;不少实践会把 FFN 的 up/gate/down 也加上,甚至 embedding 和 lm_head(但这两个参数量大,加之前要算账)。层数上一般所有 Transformer 层都加,只加顶部几层的效果会打折。

推理与部署细节

训练完做 W' = W + (α/r)·BA 的离线合并,得到一个普通权重,推理路径和原模型逐字节一致,零额外延迟——这是 LoRA 相比 Adapter 和 Prefix 类方法的决定性工程优势。多任务场景可以共享主干、按需加载不同的 LoRA 增量文件(通常只有几十到几百 MB),vLLM 等推理框架已经原生支持多 LoRA 热切换。需要注意的是合并会损失继续训练的灵活性,所以训练 checkpoint 一般保留未合并的 A/B 权重。

常见变体一句话带过

QLoRA 把冻结主干量化到 4bit(NF4),进一步把训练显存压一个量级;DoRA 把权重拆成方向+幅度分别微调;LoRA+ 给 A、B 设不同学习率。面试里知道它们各自解决什么问题即可,不用展开。

可能的追问

追问:r 取多少合适?是不是越大越好? 不是。原论文发现 r=4 到 r=64 在很多任务上收益就饱和了,甚至 r=1、r=2 都有竞争力,说明 ΔW 的内在秩真的很低。经验上简单指令微调 r=8 到 16 够用,领域差异大或任务复杂时上到 64;再大参数量和过拟合风险都上来了,边际收益很小。

追问:如果训练中发现 LoRA 学不动(loss 不降),你排查什么? 先看缩放:alpha/r 设小了更新幅度可能不够;再看学习率,LoRA 的 lr 一般要比全参微调大一个数量级(1e-4 量级);然后看 target modules 是否覆盖了任务相关的层,比如知识型任务只加 Q/V 可能不够,需要带上 FFN;最后看数据本身有没有格式错误。

追问:LoRA 合并进 W 之后还能继续在这个基础上训新的 LoRA 吗? 可以,合并后得到的就是一个合法的新基座,再往上加新的低秩增量没有任何障碍,多轮迭代微调经常这么干。代价是基座每合并一次就变一次,要管理好版本,避免搞混哪份增量对应哪份基座。

评论 (0)

暂无评论,快来抢沙发吧!

91学AI

© 2026 91学AI · 按岗位学 AI 与大数据. All rights reserved.