LoRA 的原理是什么?为什么加两个低秩矩阵就能微调?

Q4-04参数高效微调高频LoRAPEFT低秩分解适配器推理合并

谁在问:一二面通用;工程向面试官当作"你到底动没动过手"的分界题

口语化问法

  • LoRA 讲一下,为什么它能用这么少的参数达到接近全参微调的效果?
  • LoRA 训的到底是什么?原来的模型权重动了吗?
  • 为什么现在大家微调都用 LoRA,不用别的参数高效方法了?

考察意图

  1. 能不能把公式和直觉都讲出来。只会说"低秩分解、参数少"是背的;能说清 h = W₀x + (α/r)BAx 每一项在干什么,才是理解。
  2. 知不知道那几个设计细节。B 初始化为 0、α/r 是缩放、推理可合并——这三个是"读过论文/配过参数"和"听说过这个词"的分界。
  3. 有没有部署侧的视角。可合并、多适配器热切换,是 LoRA 在工程上真正赢下来的原因,能主动提的候选人通常在服务侧待过。

参考答案

图 2 · 60 分与 90 分差在哪:代价、演进、怎么验证

60

60 分答案(及格线)

LoRA 是 Low-Rank Adaptation,低秩适配。它的做法是:把基座权重 W₀ 冻结,在旁边并联两个小矩阵 B 和 A,训练时只更新这两个小的。

前向变成 h = W₀·x + B·A·x。B 是 d×r,A 是 r×k,r 远小于 d 和 k,所以参数量从 d×k 降到 r×(d+k)。比如一个 4096×4096 的矩阵,r=64 时参数量从 1600 万降到 52 万。

之所以能用这么少的参数,是因为微调带来的权重更新本身是低内在秩的——你只是在教模型一种风格或一个任务,需要的信息量远小于整个权重矩阵的容量。

原理说对了,及格。但没有设计细节、没有工程价值,追问一层就到底。

90

90 分答案(有生产经验的回答)

公式和直觉:

h = W₀·x + (α/r)·B·A·x       W₀ 冻结;A、B 可训
A: r×k,高斯初始化           B: d×r,全 0 初始化

参数量 r×(d+k) 对比原来的 d×k,r=64 在 4096×4096 上压掉约 97%。能这么压的前提是一个经验事实:微调带来的权重变化是低内在秩的——你在教一种行文风格,这件事的信息量本来就远小于矩阵容量。反过来说,这也预示了 LoRA 的边界:当数据要装进去的信息量超过适配器容量时,LoRA 就开始落后于全参,不是断崖式的,是效率逐步变差。

三个设计细节,每个都有用:

  1. B 初始化为全 0,所以训练起点 BA=0,接上适配器的瞬间模型行为与基座完全一致。这保证训练从基座的原始行为平滑出发。如果两个都随机初始化,第一步就把模型打乱了。A 用高斯初始化是为了让梯度能流起来(两个都是 0 就永远学不动)。
  2. α/r 是缩放系数,不是"学习强度"。它的作用是让你改变 r 时,适配器输出的量级保持可比。所以做 rank 消融实验时必须固定 α/r,否则你分不清变化来自容量还是来自缩放。
  3. 推理时可以合并W = W₀ + (α/r)BA 算完就是一个普通权重矩阵,推理零额外延迟。这是 LoRA 相对 Adapter、Prefix-Tuning 的决定性优势——那些方法在推理时会多出实打实的计算层或占掉一段上下文。

工程上真正让它赢的那一点: 不合并也有价值。一个基座常驻显存,挂 N 个 LoRA 适配器按请求热切换,就能用一份基座显存服务多个业务线的定制需求。"可合并换零延迟,不合并换多租户",这两条是 LoRA 在服务侧站住的根本原因,比"参数少"更重要。

一个我会主动补的现实提醒: LoRA 的效果高度依赖配置。最常见的翻车是抄旧教程的 target_modules=["q_proj","v_proj"]——那是 2021 年论文的配置。截至 2026-08 的共识是必须 all-linear,尤其覆盖 MLP 层:一个 r=256 的 attention-only LoRA,打不过 r=128 的 MLP LoRA,参数量还差不多。 很多"LoRA 效果不行"的结论是这么来的。

追问链

图 1 · 五层追问树:面试官会往哪儿挖
追问从初始化细节起步,一路滑到多租户部署的账

  1. B 为什么要初始化成 0?两个都随机初始化会怎样?

    期望B=0 保证起点 BA=0,接上适配器的瞬间模型行为与基座完全一致,不引入初始扰动;两个都随机 → 第一步就在原权重上叠了一记随机矩阵,收敛更难且起点不可控;A 也不能置 0,否则梯度全零学不动 —— 必须一个 0 一个非 0
    信号说出「必须一个 0 一个非 0」及各自原因 → 读过论文或自己想过;答「随便初始化都行」→ 没动过手
  2. αr 是什么关系?为什么不干脆用学习率控制?

    期望α/r 是作用在适配器输出上的缩放:学习率控制「每步走多远」,α/r 控制「这条支路的输出被放大多少」,是两件事。实践上二者确有耦合,都会影响有效更新幅度,所以固定 α=rα=2r 把比值拴住,探索留给学习率
    信号指出「两者有耦合但不是一回事」→ 理解到位;答「alpha 就是学习率的一种」→ 概念混淆
  3. 用了 LoRA,推理会变慢吗?

    期望合并后不会 —— W₀ + (α/r)BA 算完就是一个普通权重矩阵;不合并时多两次小矩阵乘,开销很小但非零,换来的是多适配器热切换。这正是它相比 Adapter/Prefix-Tuning 的关键优势,后者的额外计算消不掉
    信号知道「可合并」这件事 → 基本盘;能把它和 Adapter 的对比讲出来 → 理解了 LoRA 为什么胜出
  4. Adapter、Prefix-Tuning 也是 PEFT,为什么 LoRA 独大?

    期望Adapter 在层间插小网络,推理时消不掉、有实打实的延迟;Prefix/P-Tuning 把可训参数塞进 KV 或输入 embedding,占掉宝贵的上下文预算且训练不稳;LoRA 的更新形式与原权重同构 → 可以完全合并回去,零推理代价,还天然支持多适配器切换
    信号说出「占掉上下文预算」这一条 → 真评估过 Prefix-Tuning;只答「LoRA 效果更好」→ 没有比较过
  5. 一个基座同时服务 8 条业务线,合并还是不合并?显存延迟怎么算,什么时候推翻这个设计?

    期望默认基座常驻 + 8 个适配器不合并、按请求热切换:7B BF16 基座 14 G,r=16 每份 40M/80 MB,八份不到 1 G,比 8×14 G 的独立部署省一个数量级 → 代价是同批内适配器不同拖慢吞吐,得按适配器分桶批处理 → 推翻:① QPS 高且延迟敏感 → 单独合并;② 需求重合 → 并成 1–2 个;③ prompt 能表达 → 踢出去
    信号算得出「8 份适配器不到 1 G vs 8 份模型 112 G」→ 真设计过;能提同批内适配器不同的批处理问题 → 真部署过多租户
只会背「低秩分解、参数少」的,第 4 层和第 5 层都空 —— 前三层考的是论文里那三个设计细节(B=0α/r、可合并),第 5 层才问服务侧那笔账。

评分要点

  1. 能写出或口述 h = W₀x + (α/r)BAx,并说清每项含义
  2. 知道基座冻结、只训 A 和 B
  3. 能算参数量 r×(d+k) 并给出一个具体数量级
  4. 知道 B 初始化为 0 及其原因
  5. 知道 α/r 是缩放系数
  6. 知道推理可合并、零额外延迟
  7. (加分)知道不合并可做多适配器热切换
  8. (加分)能说出 LoRA 的容量边界(信息量超过容量就落后于全参)
  9. (加分)知道 target_modules 应为 all-linear,且知道旧默认值的坑

常见错误

"LoRA 就是只训练一小部分参数"把 PEFT 的共性当成 LoRA 的定义,没说清它特有的低秩并联结构。
"LoRA 会修改原始权重"事实错误。基座是冻结的。
"alpha 就是学习率"概念混淆,追问一层即崩。
"LoRA 推理会变慢"不知道可合并,说明没部署过。
"LoRA 效果一定不如全参"2026 的共识是容量足够时能打平;掉点通常是配置问题。
说得出公式但说不出为什么低秩管用含糊回答的典型形态:复述结构,回避机制。 追问"为什么低秩就够"即见底。
全程不提部署工程岗减分。LoRA 最大的工程价值在服务侧。

关联学习