微调——什么是LoRA
- LoRA(Low-Rank Adaptation, 低秩自适应):由微软于 2021 年提出,是一种高效微调大型语言模型(LLM)的技术。LoRA 通过低秩矩阵乘积近似关键更新,仅调整最必要的参数。这种思想本质上利用了大模型的 “冗余性”—— 即预训练模型已具备强大基础能力,微调时只需在低维子空间中调整少数方向,即可实现任务适配。
LoRA 的工作原理
1. LoRA的核心假设与数学表达
LoRA认为:模型在微调时的权重更新矩阵ΔW本质上是低秩的,即ΔW可通过两个小矩阵的乘积近似表示。
-
传统微调:
- 假设原始预训练权重矩阵为 W∈Rd×kW \in \mathbb{R}^{d \times k}W∈Rd×k,其中:
- d:输入维度(例如 transformer 的 hidden_size)
- k:输出维度
- 全参数微调需要更新整个矩阵,参数量为 d×kd \times kd×k
- 假设原始预训练权重矩阵为 W∈Rd×kW \in \mathbb{R}^{d \times k}W∈Rd×k,其中:
-
LoRA:
-
原始权重矩阵为
W ∈ R^(d×k)
(如d=hidden_size=768,k=hidden_size=768)。 -
引入两个低秩矩阵:
W_A ∈ R^(d×r)
(降维矩阵,r≪d,k,通常r=8~128)W_B ∈ R^(r×k)
(升维矩阵)
- 则权重更新为:
- Wupdated=W+ΔW=W+WA⋅WBW_{updated} = W + \Delta W = W + W_A \cdot W_BWupdated=W+ΔW=W+WA⋅WB
- 其中,原始W保持冻结,仅训练W_A和W_B。
参数效率分析:
- 原始可训练参数:d×kd \times kd×k
- LoRA 参数:r×(d+k)r \times (d + k)r×(d+k)
- 实际应用中需要权衡:r 值过小可能导致性能下降,r 值过大会降低效率
这种低秩适应有效的深层原因是:模型在不同任务间的知识迁移主要发生在低维子空间,通过调整这些关键方向就能实现高效适应。
2. LoRA在Transformer架构中的应用位置
LoRA并非作用于所有层,而是选择性地应用于关键可训练层(稍后有这些层的意义):
- 必选层:
- 注意力层的Q/K/V投影矩阵(决定模型对输入的编码方式)。
- 前馈神经网络的两层线性变换矩阵(决定语义特征的变换逻辑)。
- 可选层:
- 输出层的投影矩阵(如分类任务的最后一层)。
- 嵌入层(较少使用,因词向量更新可能影响基础语义)。
- 示例:以LLaMA-7B为例,LoRA通常只更新约40%的可训练层,其余层保持冻结,进一步降低计算量。
预训练模型的权重矩阵W是什么
1. 预训练模型的权重矩阵W
在Transformer架构中,权重矩阵W主要存在于以下关键层:
- 注意力机制层(Attention Layer):
- 查询(Query, Q)、键(Key, K)、值(Value, V)投影矩阵:将输入向量映射到Q/K/V空间,如矩阵形状为
[hidden_size, hidden_size]
(假设hidden_size=768)。 - 输出投影矩阵:将多头注意力的结果合并后投影回隐藏空间,形状同上。
- 查询(Query, Q)、键(Key, K)、值(Value, V)投影矩阵:将输入向量映射到Q/K/V空间,如矩阵形状为
- 前馈神经网络层(Feed Forward Network, FFN):
- 第一层线性变换矩阵:将输入维度从
hidden_size
扩展到4×hidden_size
(如768→3072),形状为[hidden_size, 4×hidden_size]
。 - 第二层线性变换矩阵:将维度从
4×hidden_size
压缩回hidden_size
,形状为[4×hidden_size, hidden_size]
。
- 第一层线性变换矩阵:将输入维度从
- 嵌入层(Embedding Layer):
- 词嵌入矩阵:将token ID映射为词向量,形状为
[vocab_size, hidden_size]
(如vocab_size=50000,hidden_size=768)。
- 词嵌入矩阵:将token ID映射为词向量,形状为
这些矩阵W是模型在预训练阶段(如GPT在海量文本上训练)学习到的参数,承载了通用语义理解能力。
2. 传统全参数微调的过程
当使用新数据微调时:
- 目标:让模型适应特定任务(如情感分析、问答),更新W以优化任务性能。
- 操作:
- 加载预训练模型的所有权重矩阵W(冻结或不冻结)。
- 输入新任务数据,前向传播计算损失。
- 反向传播时计算所有W的梯度,并通过优化器(如Adam)更新所有W的参数。
- 问题:
- 参数量巨大:以GPT-3(1750亿参数)为例,全量微调需更新所有权重,显存需求超过百GB,普通硬件无法支持。
- 计算成本高:每次迭代需更新数十亿参数,训练时间长达数天甚至数周。
LoRA 的主要特点和优势
- 参数高效: LoRA 仅训练少量额外参数,而不是完整的模型权重。典型场景下可训练参数减少 10-100 倍(具体取决于原模型尺寸和r值)
- 训练速度快: 由于需要更新的参数大幅减少,LoRA 微调比全参数微调速度更快,训练时间更短。
- 存储空间小: LoRA 适配器通常只有几十到几百 MB,而完整的模型可能需要几十 GB。这使得存储和分发多个专门的微调版本变得更加实际。
- 推理性能优化: LoRA 权重可以在推理前合并回原始模型,不会增加推理时的计算开销。
- 可组合性: 多个 LoRA 适配器可以被合并或按不同比例混合,创建具有混合能力的模型。
- 质量保持: 在许多任务中,LoRA 微调的性能与全参数微调相当甚至更好,同时减少了过拟合风险。
LoRA与传统微调的对比(以GPT-3 125M参数为例)
指标 | 传统全参数微调 | LoRA微调(r=8) |
---|---|---|
可训练参数 | 125M | 8×(768+768)×层数 ≈ 100K-1M |
显存需求 | 50GB+(16-bit浮点) | 5GB-10GB(16-bit浮点) |
训练时间(单卡A100) | 数天 | 数小时 |
性能损耗(任务精度) | 无损耗 | 损耗<5%(合理r值下) |
LoRA的优化技巧与实际应用场景
1. 关键超参数:秩r的选择
- r过小(如r=4):模型表达能力不足,任务性能下降。
- r过大(如r=256):参数减少优势减弱,接近全量微调。
- 经验法则:
- 小型模型(如7B):r=16-32
- 大型模型(如13B-175B):r=8-16
- 复杂任务(如代码生成):可适当增大r(32-64)。
2. LoRA与其他技术的结合
- 与PEFT(参数高效微调)结合:如搭配QLoRA(量化+LoRA),用4-bit量化预训练模型,进一步降低显存至2GB以下。
- 与适配器(Adapter)结合:在LoRA层外添加非线性激活函数,增强表达能力。
- 与提示工程(Prompt Tuning)结合:同时优化提示词和LoRA参数,实现更精准的任务适配。
3. 典型应用场景
- 垂直领域适配:
- 医疗问答:用医学文本微调LoRA,仅更新数千参数即可让GPT理解医学术语。
- 法律文书生成:训练LoRA适配法律条文逻辑,无需重训整个模型。
- 多任务学习:
- 为不同任务(如翻译、摘要)维护独立的LoRA权重,通过权重混合实现多任务切换。
- 个性化模型:
- 生成特定风格文本(如模仿某作家文风):仅需少量样本训练LoRA,避免全量微调导致的过拟合。
参考资料
https://github.com/karminski/one-small-step/blob/main/20250228-what-is-LoRA/what-is-LoRA.md?plain=1