目录
-
- 研究动机
- 核心创新点
- 算法性能
- 重要发现与见解
- 局限性
- 意义与影响
- 问题:使用LoRA微调,权重矩阵W是否被修改了?
-
- [✅ 微调时实际更新的参数包括:](#✅ 微调时实际更新的参数包括:)
- [❌ 原始权重矩阵W的状态:](#❌ 原始权重矩阵W的状态:)
- [📌 重要补充说明:](#📌 重要补充说明:)
- 问题:矩阵B和矩阵A的维数是什么?
-
- [📐 核心维度规则](#📐 核心维度规则)
- [🔍 实际案例(以典型Transformer层为例)](#🔍 实际案例(以典型Transformer层为例))
- [💡 关键补充说明](#💡 关键补充说明)
- [🌰 为什么这个设计精妙?](#🌰 为什么这个设计精妙?)
- [问题:lora算法的输入参数除了r和 α \alpha α,还有其它的吗?](#问题:lora算法的输入参数除了r和 α \alpha α,还有其它的吗?)
-
- [🔑 核心数值超参数(直接影响LoRA更新计算)](#🔑 核心数值超参数(直接影响LoRA更新计算))
- [⚙️ 关键应用配置参数(决定LoRA如何集成)](#⚙️ 关键应用配置参数(决定LoRA如何集成))
- [🛠️ 实现相关可选参数(依库/场景而定)](#🛠️ 实现相关可选参数(依库/场景而定))
- [📌 重要说明](#📌 重要说明)
- [💡 实践建议](#💡 实践建议)
研究动机
这篇论文针对大型预训练语言模型(如GPT-3 175B)在下游任务微调时面临的几个关键挑战:
-
参数效率问题:完全微调需要为每个下游任务保存一个完整模型副本,对GPT-3这样的超大规模模型来说,存储成本极其高昂。
-
计算资源需求:微调大型模型需要大量GPU内存,主要用来存储优化器状态和梯度,硬件门槛极高。
-
现有方法的局限性:
- Adapter方法会引入额外推理延迟
- Prefix-tuning等方法会减少可用序列长度
- 多数参数高效方法无法达到与完全微调相当的性能
核心创新点
-
低秩适应机制 :论文基于一个关键假设------模型权重在适应下游任务时的更新(ΔW)具有"内在低秩"特性。而不是直接优化原始权重矩阵W,LoRA通过低秩分解表示权重更新:W + ΔW = W + BA,其中B∈ℝ(d×r)和A∈ℝ(r×k)是低秩矩阵(r << min(d,k))。
-
无推理延迟设计:与Adapter等方法不同,LoRA在部署时可以将训练好的低秩矩阵与原始权重合并(W + BA),因此不会引入任何额外推理延迟。
-
高效任务切换:基础预训练模型可以共享,只需加载不同的低秩矩阵即可切换任务,大大降低了存储和切换成本。
-
显著的资源优化:
- 减少需要存储优化器状态的参数数量
- 降低训练所需的VRAM需求(对GPT-3减少到原需求的1/3)
- 检查点大小从350GB减少到35MB(减少10,000倍)
算法性能
-
模型质量:在多个基准测试中表现优异:
- 在RoBERTa、DeBERTa、GPT-2和GPT-3上与完全微调持平甚至更好
- 在GLUE基准上,DeBERTa XXL + LoRA几乎匹配完全微调性能(91.3% vs 91.1%)
- 在GPT-3 175B上,LoRA在WikiSQL、MNLI和SAMSum任务上超过完全微调
-
参数效率惊人:
- 仅用0.01%的可训练参数(GPT-3 175B中约4.7M vs 175B)
- 实验表明,即使秩r=1或2也能在某些任务上取得很好效果
-
训练加速:
- 在GPT-3 175B上训练速度提高25%
- 减少约3倍的GPU内存需求,使普通设备也能进行大型模型微调
重要发现与见解
-
低秩特性验证:通过子空间相似性分析,论文证明了权重更新矩阵确实具有低秩特性。即使使用大秩(r=64)训练,模型也主要利用了前几个奇异向量方向。
-
权重更新与原始权重的关系:研究发现,适应矩阵ΔW与原始权重W之间的关系并非简单地增强W中的主要方向,而是放大W中已存在但未被强调的特征,放大因子可达21.5倍。
-
最佳应用位置:在Transformer中,将LoRA应用于查询(Query)和值(Value)投影矩阵(Wq和Wv)比其他组合效果更好,表明这些权重在任务适应中更为关键。
局限性
-
当需要合并低秩矩阵到原始权重以消除推理延迟时,难以在同一前向传播中批处理不同任务的输入。
-
对于与预训练任务差异极大的下游任务(如不同语言),小秩r的LoRA可能不够,需要更大秩或完全微调。
意义与影响
LoRA提供了一种优雅的解决方案,在保持模型性能的同时极大降低了大型语言模型适应的成本。它不仅解决了实际部署问题,还揭示了预训练模型适应过程中的内在低秩特性,为理解大模型的泛化机制提供了新视角。该方法已成为当前大模型高效微调的标准技术之一,被广泛应用在各种大型语言模型的适应任务中。
论文开源的实现(https://github.com/microsoft/LoRA)使其迅速成为研究和工业界的重要工具,为大模型的低成本定制化铺平了道路。
问题:使用LoRA微调,权重矩阵W是否被修改了?
权重矩阵W被冻结,没有被修改。LoRA微调,修改的参数是矩阵A和矩阵B。
✅ 微调时实际更新的参数包括:
-
LoRA引入的低秩矩阵(核心参数):
- 对每个应用LoRA的目标权重矩阵 W ∈ R d × k W \in \mathbb{R}^{d \times k} W∈Rd×k,引入两个可训练矩阵:
- A ∈ R r × k A \in \mathbb{R}^{r \times k} A∈Rr×k(通常初始化为零或小随机值)
- B ∈ R d × r B \in \mathbb{R}^{d \times r} B∈Rd×r(通常初始化为零)
- 其中 r ≪ min ( d , k ) r \ll \min(d,k) r≪min(d,k)(如 r = 8 r=8 r=8),构成增量 Δ W = B A \Delta W = BA ΔW=BA
- 仅这些 A A A 和 B B B 在训练中通过反向传播更新
- 对每个应用LoRA的目标权重矩阵 W ∈ R d × k W \in \mathbb{R}^{d \times k} W∈Rd×k,引入两个可训练矩阵:
-
(可选)偏置项(Bias):
- 论文第3节明确说明:"We freeze the pre-trained model weights and only train the rank decomposition matrices and (optionally) the bias vectors."
- 实践中(如Hugging Face PEFT库),常选择微调LayerNorm的bias或Linear层的bias以小幅提升性能,但这属于辅助设计,并非LoRA核心机制
❌ 原始权重矩阵W的状态:
- 全部冻结(Frozen) :包括被应用LoRA的 W q , W v W_q, W_v Wq,Wv 等投影矩阵,以及模型中所有未应用LoRA的层(如FFN、Embedding等)
- 不参与梯度计算与更新 :训练时仅作为常量用于前向计算 h = W x + B A x h = Wx + BAx h=Wx+BAx
📌 重要补充说明:
| 场景 | 参数组成 | 说明 |
|---|---|---|
| 训练阶段 | 仅 A , B A, B A,B (+ 可选bias) | 原始W完全冻结,优化器状态仅针对LoRA参数 |
| 保存适配器 | 仅LoRA参数文件(如 .safetensors) |
通常<100MB(GPT-3仅35MB),与原始模型分离存储 |
| 推理部署 | 方案1:动态加载 W + B A W + BA W+BA方案2:合并为 W ′ = W + B A W' = W + BA W′=W+BA | 合并后参数变为新权重 W ′ W' W′,但原始W与LoRA参数物理上已融合 |
问题:矩阵B和矩阵A的维数是什么?
在LoRA方法中,A和B的维度严格由原始权重矩阵W的维度和设定的秩r共同决定,遵循明确的数学规则:
📐 核心维度规则
设原始权重矩阵 W ∈ R d × k W \in \mathbb{R}^{d \times k} W∈Rd×k( d d d = 输出特征数 , k k k = 输入特征数 ),设定低秩 r ≪ min ( d , k ) r \ll \min(d, k) r≪min(d,k):
- B ∈ R d × r B \in \mathbb{R}^{d \times r} B∈Rd×r
(将低秩中间表示映射回原始输出空间) - A ∈ R r × k A \in \mathbb{R}^{r \times k} A∈Rr×k
(将原始输入压缩至低秩中间空间)
✅ 验证: Δ W = B × A ∈ R d × k \Delta W = B \times A \in \mathbb{R}^{d \times k} ΔW=B×A∈Rd×k,与 W W W 维度完全一致,确保可加性。
🔍 实际案例(以典型Transformer层为例)
| 权重矩阵 | 原始维度 W W W ( d × k d \times k d×k) | LoRA参数维度 ( r = 8 r=8 r=8) | 说明 |
|---|---|---|---|
| Query投影 W q W_q Wq | 768 × 768 768 \times 768 768×768 | B : 768 × 8 B: 768 \times 8 B:768×8 A : 8 × 768 A: 8 \times 768 A:8×768 | 输入/输出均为hidden_size |
| Value投影 W v W_v Wv | 768 × 768 768 \times 768 768×768 | B : 768 × 8 B: 768 \times 8 B:768×8 A : 8 × 768 A: 8 \times 768 A:8×768 | 同上(LoRA论文推荐重点应用于此) |
| FFN第一层 | 3072 × 768 3072 \times 768 3072×768 | B : 3072 × 8 B: 3072 \times 8 B:3072×8 A : 8 × 768 A: 8 \times 768 A:8×768 | 将hidden_size扩至intermediate_size |
| FFN第二层 | 768 × 3072 768 \times 3072 768×3072 | B : 768 × 8 B: 768 \times 8 B:768×8 A : 8 × 3072 A: 8 \times 3072 A:8×3072 | 将intermediate_size压缩回hidden_size |
| GPT-3 W q W_q Wq | 12288 × 12288 12288 \times 12288 12288×12288 | B : 12288 × 8 B: 12288 \times 8 B:12288×8 A : 8 × 12288 A: 8 \times 12288 A:8×12288 | 超大模型示例( r = 8 r=8 r=8仅需~200KB) |
💡 关键补充说明
-
初始化惯例(论文Algorithm 1):
- A A A:高斯随机初始化( N ( 0 , σ 2 ) \mathcal{N}(0, \sigma^2) N(0,σ2))
- B B B:全零初始化 → 训练初期 Δ W ≈ 0 \Delta W \approx 0 ΔW≈0,模型行为与原始冻结权重完全一致,保证训练稳定性
-
缩放因子 (实践常见):
实际实现中常引入缩放 Δ W = α r ⋅ B A \Delta W = \frac{\alpha}{r} \cdot B A ΔW=rα⋅BA( α \alpha α 为超参,常设 α = r \alpha = r α=r),但不改变A/B的维度 -
维度易错点:
- ❌ 错误理解:" A A A 是 k × r k \times r k×r"(会导致 B A B A BA 维度不匹配)
- ✅ 正确逻辑:A A A 先作用于输入 x ∈ R k x \in \mathbb{R}^k x∈Rk → A x ∈ R r A x \in \mathbb{R}^r Ax∈Rr,再经 B B B 映射至输出空间 → B ( A x ) ∈ R d B(Ax) \in \mathbb{R}^d B(Ax)∈Rd
-
代码验证 :
在Hugging Face PEFT库中,
lora_A权重形状为(r, in_features),lora_B为(out_features, r),与理论完全一致。
🌰 为什么这个设计精妙?
- 参数量计算 :单个LoRA层参数量 = r × ( d + k ) r \times (d + k) r×(d+k)
(例: W q W_q Wq 768×768, r = 8 r=8 r=8 → 仅需 8 × ( 768 + 768 ) = 12 , 288 8 \times (768+768) = 12,288 8×(768+768)=12,288 参数,占原权重0.002%) - 维度自适应:无论W是方阵(注意力层)还是矩形(FFN层),公式自动适配
- 硬件友好 :小矩阵乘法( r × k r \times k r×k 和 d × r d \times r d×r)显著降低显存与计算压力
这一维度设计是LoRA实现"极低参数量+无推理延迟+任务隔离"三大优势的数学基石。
问题:lora算法的输入参数除了r和 α \alpha α,还有其它的吗?
是的,LoRA算法在实际应用中需要配置的参数远不止秩 r r r 和缩放因子 α \alpha α。根据原始论文与主流实现(如 Hugging Face PEFT),可系统分为以下几类:
🔑 核心数值超参数(直接影响LoRA更新计算)
| 参数 | 说明 | 典型值/范围 | 论文依据 |
|---|---|---|---|
| r r r | 低秩分解的秩 | 1--64(常用 4, 8, 16) | 核心设计 |
| α \alpha α (lora_alpha) | 缩放因子,实际缩放比例为 α r \frac{\alpha}{r} rα | 通常 α = r \alpha = r α=r 或 2 r 2r 2r | §3: "scaling factor α / r \alpha/r α/r" |
lora_dropout |
在 A A A 输出后、 B B B 输入前应用的 Dropout 概率 | 0.0--0.2(论文用 0.05) | Algorithm 1 明确包含 "optional dropout" |
💡 关键澄清 :Dropout 是 LoRA 算法组成部分(非可选技巧),用于防止低秩路径过拟合,论文实验中固定为 0.05 但用户可调。
⚙️ 关键应用配置参数(决定LoRA如何集成)
| 参数 | 作用 | 示例 |
|---|---|---|
target_modules |
指定应用LoRA的模块名称(必填) | ["q_proj", "v_proj"](论文推荐)["k_proj", "o_proj", "gate_proj"](依任务调整) |
bias |
偏置训练策略 | "none"(默认)"lora_only"(仅LoRA层bias)"all"(所有bias) |
modules_to_save |
额外需完整微调的模块(如分类头) | ["classifier"](用于下游任务头) |
🛠️ 实现相关可选参数(依库/场景而定)
| 参数 | 说明 |
|---|---|
init_lora_weights |
LoRA权重初始化方式(如 "gaussian", "olora") |
fan_in_fan_out |
针对 Conv1D 权重(如 GPT-2)是否需转置处理 |
layers_to_transform |
仅对指定层索引应用 LoRA(如 [0, 5, 10]) |
layers_pattern |
层命名匹配模式(用于复杂模型结构) |
task_type |
任务类型标识(如 "CAUSAL_LM", "SEQ_CLS",影响默认配置) |
📌 重要说明
-
α \alpha α 与 r r r 的关系 :
实际缩放强度由 α / r \alpha / r α/r 决定。例如 r = 8 , α = 16 r=8, \alpha=16 r=8,α=16 等价于缩放因子 2.0。调整时需联合考虑二者。
-
哪些是"必须设置"的?
- 训练时必配 :
r,lora_alpha,target_modules - 强烈推荐配置 :
lora_dropout(防过拟合),bias(控制bias策略) - 其他参数多为适配特定模型/任务的细节优化
- 训练时必配 :
-
论文 vs 实践差异 :
原始论文聚焦 r r r、 α \alpha α、dropout 三个核心超参数;但现代工具链(如 PEFT)将
target_modules等配置参数视为"输入参数",因缺失会导致应用失败。
💡 实践建议
在 Hugging Face PEFT 中初始化 LoRA 时,典型配置如下:
python
LoraConfig(
r=8,
lora_alpha=16, # 缩放因子 α
target_modules=["q_proj", "v_proj"],
lora_dropout=0.05, # Dropout 是算法组成部分!
bias="none",
task_type="CAUSAL_LM"
)
结论 :除 r r r 和 α \alpha α 外,lora_dropout 是算法内生的关键超参数 ,而 target_modules 等配置参数在工程实现中同等重要,共同决定 LoRA 的效果与适用性。