模型微调_1__什么是LoRA

最近一直在尝试模型的微调,都是小打小闹,主要用于学习体验。你可能不知道的是,国内很多商用大模型都是微调出来的——在开源基座模型(如 Llama、Qwen 等)的基础上,用特定领域的数据进行微调或继续训练,是业界非常普遍的路线。本文分享一些与大模型微调相关的知识——LoRA。

1. 一、什么是模型微调

模型微调(Fine-tuning)是指在一个已经预训练好的大型模型(例如 BERT、GPT、ResNet 等)的基础上,使用特定领域或任务的数据进行额外的训练,使模型适应新的任务或数据分布。

为什么要微调?原因包括但不限于以下几点:

  • 节省成本与算力:从零训练一个大型模型需要海量数据和巨大的算力,成本极高;微调只需相对较少的数据和计算资源,也不用从零开发基础模型。
  • 提升性能:预训练模型已经从海量通用数据中学习了丰富的特征和知识(如图像纹理、语言语法)。微调相当于在这个"知识渊博"的基础上进行"专项强化训练",从而在新任务上快速达到很高的性能。
  • 避免过拟合:当特定任务的数据较少时,从头训练一个复杂模型很容易过拟合,而微调预训练模型则有效得多。

2. 二、模型微调的主流方法(PEFT)

目前主流的高效微调方法大多属于 PEFT(Parameter-Efficient Fine-Tuning,参数高效微调)的范畴,核心思想都是冻结原模型的大部分参数,只选择性地微调一小部分参数,或添加少量额外参数,以实现高效微调。具体包括:

  • Adapter:在每个 Transformer 层内部(通常位于前馈网络 FFN 之后)插入一个小的神经网络模块(Adapter 层),训练时只更新这些 Adapter 的参数。
  • Prompt Tuning:不修改模型本身,只在输入前添加一些可训练的"软提示"(soft prompt)向量,通过引导模型关注特定信息来完成任务。
  • Prefix Tuning:与 Prompt Tuning 思想类似,但不仅在最前面的输入层添加可训练前缀,而是在每一层都添加。
  • LoRA:通过向模型的部分层添加可训练的低秩矩阵模块实现高效微调,是目前应用最广的 PEFT 方法,详见下一节。
  • QLoRA:可以看作是 LoRA 的量化升级版——先将预训练模型量化为 4-bit(大大减少显存占用),再冻结参数、添加 LoRA 旁路矩阵进行训练,并配合分页优化器进一步降低显存峰值。这是目前消费级硬件上微调大模型最流行的方法之一。
  • IA³:通过引入可训练的"缩放向量"对模型的激活值进行缩放,从而调整模型行为,需要训练的参数量极少。

全量微调、LoRA、QLoRA 三种微调方式对比

图 1:全量微调、LoRA、QLoRA 三种微调方式的架构与内存对比(图源:QLoRA 论文)

3. 三、什么是 LoRA(Low-Rank Adaptation)

LoRA(Low-Rank Adaptation,低秩适配)是一种主流的参数高效微调方法,能大幅降低微调成本。它通过向模型的部分层添加可训练的低秩矩阵模块,实现对模型在特定任务上的能力调整,同时保持原模型参数不变。

LoRA 由微软研究员 Edward J. Hu 等人于 2021 年提出,原论文为《LoRA: Low-Rank Adaptation of Large Language Models》(发表于 ICLR 2022)。

MTLoRA 框架示意图

图 2:MTLoRA(多任务 LoRA)框架示意,是 LoRA 在多任务场景下的扩展研究方向之一(图源:MTLoRA 论文)

LoRA 的灵感来源于一个发现:模型在适应新任务时,其权重变化往往具有较低的"内在秩"。这意味着完整的权重更新矩阵 $\Delta W$ 可以用更低维度的矩阵来近似表示($\Delta W \approx BA$)。

全量微调与 LoRA 的权重更新对比

图 3:LoRA 原论文 Figure 1——全量微调(更新整个 $\Delta W$)与 LoRA(冻结 $W$、只训练低秩矩阵 $A$、$B$)的对比(图源:LoRA 论文)

3.1. LoRA 的具体实现步骤

  1. 冻结原始权重:锁定预训练模型(例如 LLaMA、ChatGLM)的所有参数。在微调过程中,这些参数保持不变,既不计算梯度也不更新。
  2. 注入旁路矩阵:对于模型中需要微调的层(通常是 Transformer 结构中自注意力机制的 Q、K、V、O 投影层和前馈网络层),并行地添加一对低秩矩阵 $A$ 和 $B$,其中 $A \in \mathbb{R}^{r \times d}$、$B \in \mathbb{R}^{d \times r}$,且 $r \ll d$。
  3. 前向传播:在前向计算时,原始权重矩阵 $W_0$ 的输出变为:

$$
h = W_0x + BAx
$$

即输入 $x$ 先经 $A$ 从 $d$ 维降到 $r$ 维,再由 $B$ 升回 $d$ 维,乘积 $BA$ 就是对权重更新 $\Delta W$ 的低秩近似。

  1. 只训练新参数:在微调过程中,只优化低秩矩阵 $A$ 和 $B$ 的参数,原始权重 $W_0$ 完全不参与更新。
  2. 合并权重(推理阶段):训练完成后,可以将低秩更新直接合并回原始权重:

$$
W_{\text{new}} = W_0 + BA
$$

合并后,模型架构和原始模型完全一样,没有任何推理延迟。当然,也可以不合并,在推理时动态加载 LoRA 权重。

LoRA 权重更新步骤示意

图 4:LoRA 权重更新示意——保持 $W$ 不变,仅训练 $A$、$B$

4. 四、LoRA 的优势

  • 显存占用大幅降低,硬件门槛更低:这是 LoRA 最突出的优势。全量微调需要保存"模型参数 + 梯度 + 优化器状态 + 激活值";而 LoRA 冻结了原始权重,无需为绝大部分参数计算和保存梯度及优化器状态(Adam 优化器的状态通常是参数量的 2 倍以上),显存占用变为"冻结的模型权重 + LoRA 参数 + 优化器状态 + 激活值"。这使得在单张 24GB 显存的消费级显卡(如 RTX 4090)上微调 70 亿参数(7B)的模型成为现实(配合 QLoRA 门槛还可以更低)。
  • 训练速度快:需要训练的参数数量可能仅为原模型的 0.01% 到 1%,因此训练速度非常快,通常几个小时就能完成微调。
  • 产出物小巧,易于共享与部署:训练得到的 LoRA 权重文件(如 adapter_model.safetensors)通常只有几 MB 到几百 MB,而不是原模型的几个 GB。这使得分享、存储和加载多个针对不同任务的微调模型变得极其方便。
  • 无推理延迟:将 LoRA 权重合并回原模型后,最终模型与原始模型在结构和速度上完全一致,不会引入任何额外的计算开销。
  • 模块化与任务切换:可以不合并权重,为同一个基座模型准备多个 LoRA 适配器(例如一个用于数学能力、一个用于法律咨询、一个用于角色扮演)。推理时按需动态加载不同的 LoRA 模块,实现"一个模型,多种能力"的灵活切换。

5. 五、应用场景

LoRA 的应用场景极其广泛,几乎所有基于 Transformer 架构的大模型微调任务都可以使用它:

  • 指令微调:让一个通用的基座模型(如 LLaMA 3)遵循人类的指令进行对话。这是最常见的场景,使用指令数据集(如 Alpaca 格式)进行 LoRA 微调,可以快速得到一个高质量的对话模型。
  • 领域知识注入:将特定领域的知识(如医疗、法律、金融、科技论文)注入模型,打造领域专家。例如,使用医学教科书和论文摘要微调一个模型,使其能回答专业的医学问题。
  • 代码模型微调:提升模型在特定编程语言、代码库或框架下的代码生成和理解能力。
  • 角色扮演与风格化:让模型模仿某个特定人物(如历史名人、虚拟角色)或某种风格(如莎士比亚文体、新闻稿风格)进行创作。
  • 控制模型输出:微调模型以生成特定格式的输出,例如严格的 JSON 结构、特定的摘要长度或情感倾向。

:模型实战部分将在后续文章中编写。

5.1. 参考资料

  • Hu E J, Shen Y, Wallis P, et al. LoRA: Low-Rank Adaptation of Large Language Models[C]. ICLR 2022. arXiv:2106.09685
  • Dettmers T, Pagnoni A, Holtzman A, et al. QLoRA: Efficient Finetuning of Quantized LLMs[C]. NeurIPS 2023. arXiv:2305.14314