关键词:LoRA、低秩分解、参数高效微调、PEFT、Transformer
一、LoRA 是什么?(必问)
一句话回答
LoRA(Low-Rank Adaptation)是一种参数高效微调 方法,通过在预训练模型旁注入可训练的低秩分解矩阵,大幅减少需要训练的参数数量。
核心公式
W' = W + B × A
-
W:原始预训练权重(冻结,不训练)
-
A:低秩矩阵(随机初始化,维度:r × d)
-
B:低秩矩阵(全0初始化,维度:d × r)
-
r:秩(Rank),远小于 d
效果对比
| 方法 | 可训练参数量 | 显存占用 | 效果 |
|---|---|---|---|
| 全量微调 | 100% | 高 | 最好 |
| LoRA | 0.1%-1% | 低 | 接近全量微调 |
| Adapter | 3%-5% | 中 | 一般 |
| Prefix Tuning | 0.1%-0.5% | 低 | 训练不稳定 |
二、为什么需要 LoRA?(面试高频)
问题背景
-
大模型参数量巨大(如 LLaMA-7B、GPT-3 175B)
-
全量微调需要极多显存和时间
-
每个下游任务单独保存完整模型副本,存储成本高
LoRA 解决方案
| 问题 | LoRA 如何解决 |
|---|---|
| 显存不足 | 只训练低秩矩阵,冻结原始参数 |
| 训练时间长 | 参数量减少 99%+,训练更快 |
| 存储成本高 | 每个任务只保存几 MB 的 LoRA 权重 |
| 灾难性遗忘 | 原始权重不变,保留通用知识 |
三、低秩分解原理(核心)
什么叫"低秩"?
原始权重矩阵 W (d × d) ≈ B (d × r) × A (r × d)
其中 r << d(例如 d=512,r=4)
直观理解
原始矩阵:512 × 512 = 262,144 个参数
LoRA 分解:
矩阵 A:512 × 4 = 2,048 个参数
矩阵 B:4 × 512 = 2,048 个参数
总计:4,096 个参数
参数减少:262,144 → 4,096(减少 98.4%)
为什么可以用低秩?
预训练模型的权重更新往往是低秩的,即变化的"本质信息"只用少量维度就能表达。
面试回答:
研究发现,微调过程中的参数更新量 ΔW 具有较低的本征秩(intrinsic rank)。因此我们可以用低秩矩阵 B×A 来近似 ΔW,而不是直接更新整个 W。
用人话说:
微调的参数量更新比较适合低秩,而不是全部W
四、LoRA 在 Transformer 中的应用
Transformer 核心组件回顾
| 组件 | 功能 | 图中标注 |
|---|---|---|
| Q(Query) | 查询,代表当前词要"问"什么 | ✓ |
| K(Key) | 键,代表输入中每个词的"标签" | ✓ |
| V(Value) | 值,代表词的"实际内容" | ✓ |
| 输出线性层 | 将注意力输出映射回模型维度 | ✓ |
| 多头注意力 | 多组 Q/K/V 并行计算,捕捉不同关系 | 编码器/解码器部分 |
| Masked 多头注意力 | 解码器中,掩盖未来词,保证自回归生成 | 生成式 AI 关键 |
LoRA 应用位置
输入 → Q投影层(LoRA) →
K投影层(LoRA) → 多头注意力 → 输出投影层(LoRA) → 下一层
V投影层(LoRA)→
典型配置:
-
将 LoRA 应用于 Q、K、V、O 四个投影矩阵
-
Rank r 通常设为 4、8、16、32
-
缩放因子 α = 16 或 32
五、常见面试题 & 参考答案
Q1:LoRA 的 A 和 B 矩阵为什么初始化不同?
参考答案 :B✖A 前0后随机
-
B 全0初始化:保证初始时 B×A = 0,即 W' = W,不破坏预训练模型的能力
-
A 随机初始化:打破对称性,让不同位置学到不同的更新
Q2:LoRA 中的 Rank r 怎么选?
参考答案:
-
r 越小 → 参数量越少,但表达能力有限
-
r 越大 → 效果越好,但参数量增加
-
经验值:4、8、16 最常见
-
简单任务用 r=4,复杂任务用 r=16 或 32
Q3:LoRA 和全量微调的效果对比?
参考答案:
-
在不少任务上,LoRA 能达到或接近全量微调的效果
-
某些情况下甚至优于全量微调(因为避免了过拟合)
-
论文《LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS》在 RoBERTa、GPT-2、GPT-3 上验证了这一点
Q4:LoRA 有哪些变体?
| 变体 | 改进点 |
|---|---|
| QLoRA | LoRA + 4-bit 量化,消费级显卡可训练 65B 模型 |
| DoRA | 分解为方向和大小,分别微调 |
| AdaLoRA | 动态分配秩,重要模块给高秩 |
| VeRA | 所有层共享同一组低秩矩阵 |
Q5:LoRA 推理时怎么处理?
参考答案:
-
推理前可以合并:W' = W + B×A,然后像正常模型一样推理
-
也可以动态加载:保持 W 不变,运行时加上 B×A 的计算
-
合并后无额外推理延迟,动态加载会增加微小延迟
六、LoRA vs 其他 PEFT 方法
| 方法 | 可训练参数 | 推理延迟 | 适用场景 |
|---|---|---|---|
| LoRA | 极少 | 无(可合并) | 通用 |
| Adapter | 中等 | 有 | 层间插入 |
| Prefix Tuning | 极少 | 有 | 生成任务 |
| P-Tuning v2 | 中等 | 有 | NLU 任务 |
| IA3 | 极少 | 无 | 指令微调 |
面试回答:
PEFT全称:Parameter-Efficient Fine-Tuning(参数高效微调)。
LoRA 是目前最流行的 PEFT 方法,因为它的参数量极少、无推理延迟、效果好且稳定。
七、面试速记卡
| 概念 | 一句话解释 |
|---|---|
| LoRA | 通过低秩分解,只训练极小参数实现微调 |
| 低秩分解 | 用两个小矩阵乘积近似权重更新量 |
| Rank r | 低秩矩阵的维度,控制参数量和表达能力 |
| B 全0初始化 | 保证初始不改变原始模型 |
| Q/K/V | Transformer 注意力机制,LoRA 常应用于这些投影层 |
| Masked 多头注意力 | 解码器中掩盖未来词,保证自回归生成 |
| QLoRA | LoRA + 4-bit 量化,省显存 |
| 合并 | 推理前将 LoRA 权重合并回原始模型 |
八、一张图总结 LoRA
python
"""
LoRA 原理图
原始权重 W (冻结) 低秩矩阵 A (随机初始化)
┌─────────────┐ ┌───────┐
│ 512 × 512 │ │ 512×r │
└─────────────┘ └───┬───┘
│
│ B×A
↓
输出权重 W' ┌───────┐
┌─────────────┐ + │ r×512 │
│ 512 × 512 │ ←────── └───────┘
└─────────────┘ 低秩矩阵 B (全0初始化)
(训练时更新)
训练参数量: 512×r + r×512 = 1024×r
当 r=8 时: 8,192 参数 (原始是 262,144, 减少 97%)
"""
🎯 一句话总结
LoRA 通过低秩分解,用两个小矩阵 B×A 近似权重更新 ΔW,Rang r 控制参数量,B 全0初始化保证初始不破坏原模型,广泛应用于 Transformer 的 Q/K/V/O 层。QLoRA 加 4-bit 量化让消费级显卡也能微调百亿模型。 🚀