第四章:大模型(LLM)

第十部分:微调方法与实战

第五节:LoRA

1️⃣ 背景与动机

  • 大规模语言模型(LLM)的参数量达到数十亿甚至上千亿,全参数微调成本极高

  • 前面的方法(Prompt Tuning、Prefix Tuning、Adapter Tuning)虽然高效,但:

    • Prompt 类方法主要依赖输入提示,难以深层调控。

    • Adapter 需要插入新模块,推理时增加额外计算。

LoRA(Low-Rank Adaptation,低秩适配)由微软在 2021 年提出,核心思路是:

  • 不修改模型结构,只在 权重矩阵更新时引入低秩分解

  • 在推理时,额外开销极小。


2️⃣ 核心思想

对于 Transformer 中的权重矩阵 W \in \mathbb{R}^{d \times k},若直接微调,需更新 d \times k 个参数。

LoRA 的做法:

  1. 冻结原始权重 W。

  2. 仅训练一个 低秩分解矩阵

    \Delta W = BA
    • A \in \mathbb{R}^{r \times k}

    • B \in \mathbb{R}^{d \times r}

    • r \ll \min(d,k)(通常 r=4~64)

  3. 推理时使用:

    W' = W + \Delta W = W + BA

这样就能用极少的参数更新完成大模型微调。


3️⃣ 方法流程

  1. 冻结模型原始权重 W。

  2. 插入 LoRA 模块:为目标层(如 Attention 的 Query/Value 投影矩阵)添加低秩分解。

  3. 训练 LoRA 参数 A, B,通常仅占原始参数的 0.1%~1%。

  4. 推理部署:与原始模型结构完全一致,额外开销可忽略。


4️⃣ 数学公式

输入向量 x \in \mathbb{R}^k

h = Wx \quad \Rightarrow \quad h' = W x + BAx

其中:

  • BAx 是 LoRA 学到的“增量”。

  • W 保持冻结,避免灾难性遗忘。


5️⃣ 特点与优势

极高参数效率:只需训练低秩矩阵,显著减少显存占用。
推理开销小:无需改变模型结构,部署方便。
可组合性:不同任务的 LoRA 模块可叠加或切换。
兼容性好:可与 Adapter、Prefix-Tuning 等结合。


6️⃣ 与其他方法对比

方法 参数规模 插入位置 推理开销 适用场景
Prompt Tuning 极小 输入层 简单分类、指令学习
Prefix-Tuning KV Cache 有少量额外计算 生成任务
Adapter Tuning 中等 Transformer 层内部 增加计算 多任务学习
LoRA 极小 线性层(W) 几乎无 通用,尤其是大模型微调

7️⃣ PyTorch 伪代码

import torch
import torch.nn as nn

class LoRALinear(nn.Module):
    def __init__(self, in_dim, out_dim, r=8, alpha=16):
        super().__init__()
        self.r = r
        self.alpha = alpha
        self.scale = alpha / r

        # 冻结的原始权重
        self.weight = nn.Parameter(torch.randn(out_dim, in_dim), requires_grad=False)

        # 可训练的低秩矩阵
        self.A = nn.Parameter(torch.randn(r, in_dim) * 0.01)
        self.B = nn.Parameter(torch.randn(out_dim, r) * 0.01)

    def forward(self, x):
        return x @ self.weight.T + self.scale * (x @ self.A.T @ self.B.T)

8️⃣ 总结

  • LoRA 是目前最流行的 参数高效微调(PEFT)方法,尤其适合大语言模型。

  • 通过 低秩分解 + 增量更新,在保持推理高效的同时实现与全参数微调相近的效果。

  • 广泛应用于 LLM 指令微调、领域适配、个性化定制 等场景。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐