模型微调_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³:通过引入可训练的"缩放向量"对模型的激活值进行缩放,从而调整模型行为,需要训练的参数量极少。
图 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)。
图 2:MTLoRA(多任务 LoRA)框架示意,是 LoRA 在多任务场景下的扩展研究方向之一(图源:MTLoRA 论文)
LoRA 的灵感来源于一个发现:模型在适应新任务时,其权重变化往往具有较低的"内在秩"。这意味着完整的权重更新矩阵 $\Delta W$ 可以用更低维度的矩阵来近似表示($\Delta W \approx BA$)。
图 3:LoRA 原论文 Figure 1——全量微调(更新整个 $\Delta W$)与 LoRA(冻结 $W$、只训练低秩矩阵 $A$、$B$)的对比(图源:LoRA 论文)
3.1. LoRA 的具体实现步骤
- 冻结原始权重:锁定预训练模型(例如 LLaMA、ChatGLM)的所有参数。在微调过程中,这些参数保持不变,既不计算梯度也不更新。
- 注入旁路矩阵:对于模型中需要微调的层(通常是 Transformer 结构中自注意力机制的 Q、K、V、O 投影层和前馈网络层),并行地添加一对低秩矩阵 $A$ 和 $B$,其中 $A \in \mathbb{R}^{r \times d}$、$B \in \mathbb{R}^{d \times r}$,且 $r \ll d$。
- 前向传播:在前向计算时,原始权重矩阵 $W_0$ 的输出变为:
$$
h = W_0x + BAx
$$
即输入 $x$ 先经 $A$ 从 $d$ 维降到 $r$ 维,再由 $B$ 升回 $d$ 维,乘积 $BA$ 就是对权重更新 $\Delta W$ 的低秩近似。
- 只训练新参数:在微调过程中,只优化低秩矩阵 $A$ 和 $B$ 的参数,原始权重 $W_0$ 完全不参与更新。
- 合并权重(推理阶段):训练完成后,可以将低秩更新直接合并回原始权重:
$$
W_{\text{new}} = W_0 + BA
$$
合并后,模型架构和原始模型完全一样,没有任何推理延迟。当然,也可以不合并,在推理时动态加载 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