低秩适应 (LoRA) 是一种高效微调大型语言模型的技术,它通过冻结预训练模型权重,并在transformer的每一层中注入可训练的秩分解矩阵。这种方法显著减少了可训练参数的数量,同时保持了模型质量,使得在有限计算资源下微调大型模型更加实用。
本页基于论文 LoRA: 大型语言模型的低秩适应,介绍了 labml_nn 库中 LoRA 的实现。
LoRA 的工作原理是冻结预训练权重,并添加可高效训练的低秩分解。
对于预训练权重矩阵 $W_0 \in \mathbb{R}^{d \times k}$,LoRA 引入:
在微调期间
输出乘以一个缩放因子 $\frac{\alpha}{r}$,其中 $\alpha$ 是一个超参数。
来源:labml_nn/lora/__init__.py28-98
该实现提供了两个关键的 LoRA 组件:
将标准线性层替换为 LoRA 增强版本。它将冻结的预训练权重与可训练的低秩矩阵相结合。
实现细节
x @ W0.T + (x @ A.T @ B.T) * scaling来源:labml_nn/lora/__init__.py28-98
将相同的概念应用于嵌入层,用 LoRA 增强版本替换标准嵌入。
实现细节
embedding(x, W0) + (embedding(x, A.T) @ B.T) * scaling来源:labml_nn/lora/__init__.py101-151
该实现展示了在 GPT-2 模型中使用 LoRA 模块,将 LoRA 应用于模型中的所有线性变换。
使用 LoRA 的关键组件
来源:labml_nn/lora/gpt2.py19-192
| 组件 | 描述 | 实现 |
|---|---|---|
| 词元嵌入 | 将词元 ID 转换为嵌入 | GPTModel.token_embedding 使用带 LoRA 的 Embedding |
| 位置嵌入 | 添加位置信息 | GPTModel.position_embedding 使用带 LoRA 的 Embedding |
| QKV 投影 | 将输入投影到查询、键、值 | MultiHeadAttention.qkv_projection 使用带 LoRA 的 Linear |
| 注意力输出 | 将注意力输出投影到模型维度 | MultiHeadAttention.output_projection 使用带 LoRA 的 Linear |
| FFN 输入 | 前馈网络中的第一个线性层 | FFN.linear_in 使用带 LoRA 的 Linear |
| FFN 输出 | 前馈网络中的第二个线性层 | FFN.linear_out 使用带 LoRA 的 Linear |
| LM 头部 | 投影到词汇表进行词元预测 | GPTModel.lm_head 使用带 LoRA 的 Linear |
来源:labml_nn/lora/gpt2.py19-192
该实现包含一个训练流程,用于在 Tiny Shakespeare 数据集上使用 LoRA 微调 GPT-2。
训练过程的关键特点
Trainer 训练器类管理微调过程实现细节
_load_pretrained_weights 方法加载预训练权重并将其映射到模型strict=False,因为 LoRA 参数不在原始模型中来源:labml_nn/lora/experiment.py26-169
LoRA 微调的关键超参数
| 参数 | 描述 | 默认值 |
|---|---|---|
lora_r | 低秩矩阵的秩 | 32 |
alpha | 缩放参数 | 如果未指定,则等于 r |
learning_rate | Adam 优化器的学习率 | 1e-4 |
batch_size | 训练批大小 | 32 |
epochs | 训练轮数 | 10 |
context_len | 训练的上下文长度 | 512 |
来源:labml_nn/lora/experiment.py26-52
参数效率:
d 和 k 维度以及秩 r 的模型,参数减少的因子为 dk/(r(d+k))内存效率:
适应性:
性能:
评估微调模型或用于推理时:
W_merged = W₀ + (α/r) * BA该实现包含一个在 Tiny Shakespeare 数据集上使用 LoRA 微调 GPT-2 的实际示例,可作为 Colab 笔记本使用。该过程包括:
来源:labml_nn/lora/experiment.py1-190 labml_nn/lora/experiment.ipynb1-97
LoRA 属于参数高效微调方法家族。
LoRA 与其他方法的不同之处在于:
r 提供对参数数量的精确控制刷新此 Wiki
最后索引时间2025 年 4 月 18 日(90e21b)