面试知识库
中 困难

LoRA微调原理#

一句话答案#

LoRA 冻结原始权重,在线性层旁边加一条低秩旁路 B·A 只训练它(最早只加在 Attention 的 q/v 投影上,现在常覆盖全部线性层),可训练参数减少 99% 以上;QLoRA 再把冻结的基座量化到 4bit。

核心要点

原理: W = W₀ + ΔW = W₀ + (α/r)·B·A(W₀: d×k,B: d×r,A: r×k,r ≪ min(d, k))。A 随机初始化、B 初始化为 0,所以训练开始时 ΔW = 0,模型行为和原模型一致

缩放因子 alpha: α/r 控制旁路对原权重的影响幅度,常见做法是固定 alpha=2r 或单独作为超参调;rsLoRA 把缩放改成 α/√r,让大 r 时也能稳定训练

加在哪些层: LoRA 论文只加在 Attention 的 W_q、W_v 上;QLoRA 发现加到所有线性层(含 MLP)效果更接近全量微调,现在这是常见默认(PEFT 里写 target_modules="all-linear")

优势: 训练参数量极小 / 不改原始模型 / 可合并推理零开销

QLoRA: 基座量化成 4bit NF4 并冻结,LoRA 旁路用 BF16 训练,再加双重量化(scale 也量化)和分页优化器,进一步减少显存;论文在单张 48GB GPU 上微调了 65B 模型

工具(以官方文档为准): Hugging Face PEFT 提供 LoraConfig 及 DoRA、rsLoRA、PiSSA 等变体;训练脚本常用 TRL 的 SFTTrainer,或 LLaMA-Factory、Unsloth 这类封装好的框架

面试回答(2分钟版)

LoRA全称Low-Rank Adaptation,核心思想是冻结预训练模型的原始权重W0不动,在线性层的权重矩阵旁边加一条低秩旁路(最早只加在Attention的q、v投影上,现在常覆盖全部线性层)。具体来说,权重更新量ΔW被分解为两个小矩阵的乘积BA,其中B的维度是dr,A是r*k,r远小于d和k(通常r=8或16),再乘一个缩放系数alpha/r,这样可训练参数量减少99%以上,一张消费级显卡就能微调几十亿参数的模型。训练完成后,旁路矩阵可以合并回原始权重(W=W0+(alpha/r)BA),推理时没有任何额外开销,这是LoRA相比Adapter等方法的显著优势。QLoRA在此基础上更进一步,把原始模型量化到4bit NF4存储,只有LoRA旁路用BF16训练,显存需求再大幅下降,论文里单张48GB显卡就能微调65B模型。实际应用中,LoRA适合领域适配和指令微调,比如让通用模型适配医疗、法律等垂直领域的表达风格和专业知识。

追问与易错

追问方向:

  • LoRA 的秩 r 怎么选?r=8 和 r=64 效果差多少? → r=8 适合简单任务(参数量仅全量的 0.1%),r=64 适合复杂任务。通常从 r=16 开始,在验证集上对比选最优
  • LoRA 和全量微调的效果差距大吗?什么时候必须全量微调? → 指令微调、风格和领域适配这类任务上差距通常不大(QLoRA 论文里加到全部线性层后能追平 16-bit 全量微调)。数据量很大、任务与预训练差异大(如新语言、大量注入新知识的继续预训练)时,全量微调更有优势,要在自己的评测集上对比
  • QLoRA 的量化会不会影响微调质量?和标准 LoRA 比怎样? → QLoRA 用 4-bit NF4 量化冻结的基座,梯度穿过反量化后的权重传到 BF16 的 LoRA 旁路;论文结果是效果能追平 16-bit LoRA/全量微调,代价是训练速度比标准 LoRA 慢(每步都要反量化)。显存上,65B 模型能在单张 48GB GPU 上微调,7B–14B 级别能放进 24GB 消费级显卡
  • 什么时候该用微调,什么时候 Prompt 工程就够了? → 数据量少(<1000 条)先用 Prompt + Few-shot;有大量标注数据且需要特定领域知识或风格才微调。微调成本高但效果上限也高

易错点:

  • ❌ 混淆 LoRA 和 Prompt Tuning → LoRA 修改模型权重(低秩分解),Prompt Tuning 只在输入前加可训练向量,不改权重
  • ❌ 认为微调一定比 Prompt 工程效果好 → 数据量少(<1000 条)时微调容易过拟合,Prompt 工程 + Few-shot 可能更稳定
  • ❌ 忽略微调数据质量 → 数据质量比数量重要,100 条高质量标注 > 10000 条噪声数据