7 种大模型微调方法详解:LoRA、QLoRA 及适配器技术
七种主流的大模型参数高效微调(PEFT)方法,包括 LoRA、QLoRA、Adapter Tuning、Prefix Tuning、Prompt Tuning、P-Tuning 和 P-Tuning v2。文章阐述了各方法的原理、适用场景及差异,对比了它们在参数量变化、推理速度及适用场景上的表现,并提供了基于 Python 的 LoRA 微调代码示例,旨在帮助开发者在资源受限环境下低成本地定制大模型。

七种主流的大模型参数高效微调(PEFT)方法,包括 LoRA、QLoRA、Adapter Tuning、Prefix Tuning、Prompt Tuning、P-Tuning 和 P-Tuning v2。文章阐述了各方法的原理、适用场景及差异,对比了它们在参数量变化、推理速度及适用场景上的表现,并提供了基于 Python 的 LoRA 微调代码示例,旨在帮助开发者在资源受限环境下低成本地定制大模型。

随着 ChatGPT 的爆火,许多机构开源了自己的大模型,例如清华的 ChatGLM-6B/10B/130B,HuggingFace 的 BLOOM-176B。此外,OpenAI 的 GPT-4、百度的文心一言、谷歌的 PaLM-540B、华为的盘古大模型以及阿里的通义千问等也备受关注。
大型公司或研究机构拥有充足资源开发大模型,但对于一般小公司或个人而言,从头训练大模型几乎不可能。以 ChatGPT 为例,一次训练成本高达上千亿美元。因此,如何利用开源大模型在自有数据上继续训练并应用于业务场景,成为关键问题。参数高效微调(Parameter-Efficient Fine-Tuning, PEFT)提供了一种低成本的方法。
PEFT 主要包括以下七种主流方法:
下图展示了这 7 种微调方法在 Transformer 网络架构中的作用位置及其简要说明。

LoRA 旨在微调大型预训练语言模型(如 GPT-3 或 BERT)。其核心理念是在模型的决定性层次中引入小型、低秩的矩阵来实现微调,而无需对整个模型结构进行大幅度修改。
LoRA 的操作流程:
实例:假设有一个用于广泛 NLP 任务的大型语言模型,现需微调以适应医疗健康领域。采用 LoRA 方法,无需直接修改大量权重,只需在关键部位引入低秩矩阵并通过乘积进行有效调整,使模型适应专业术语,避免大规模重新训练。
QLoRA 结合了 LoRA 与深度量化技术,是高效的模型微调手段。
QLoRA 的核心:
量化过程的挑战在于设计合适的映射策略以最小化精度损失。在大型模型中,这种方法显著减少内存和计算需求,使得资源有限环境下的部署成为可能。
适配器调整的目标是在保留预训练模型原始参数不变的前提下,使模型适应新任务。方法是在模型的每层或选定层之间插入小型神经网络模块,称为'适配器'。这些适配器是可训练的,而原始模型参数保持不变。
关键步骤:
LoRA 与适配器调整的区别:
前缀调整提出一种新策略,即在预训练语言模型输入序列前添加可训练、任务特定的前缀,实现针对不同任务的微调。这意味着可以为不同任务保存不同的前缀,而非每任务保存一套微调后的模型权重,节省存储空间和微调成本。
前缀是一种连续可微的虚拟标记(SoftPrompt/Continuous Prompt),相比离散 Token 更易优化且效果更佳。优势在于不需要调整所有权重,而是通过在输入中添加前缀来调整行为。前缀可以是固定的(静态提示)或可训练的(动态提示)。

提示调整是在预训练语言模型输入中引入可学习嵌入向量作为提示的微调方法。这些可训练向量在训练过程中更新,指导模型输出更适合特定任务的响应。
提示调整与前缀调整的区别:
训练示例:
[Prompt1][Prompt2]'这部电影令人振奋。'。问题:评价情感倾向。答案:模型预测情感倾向。提示:隐含判断文本情感。[Prefix1][Prefix2][Prefix3]'I want to watch a movie.'。问题:根据前缀生成后续文本。答案:模型生成文本如'that is exciting and fun.'。提示:前缀本身提供上下文信息。P-Tuning(基于提示的微调)和提示调整都是为了调整大型预训练语言模型以适应特定任务。两者都利用预训练模型执行下游任务(如文本分类、情感分析),并使用某种形式的'提示'引导模型输出。
主要区别:
P-Tuning 中使用 LSTM 的优势:
P-Tuning v2 是 P-Tuning 的进一步改进版。在 P-Tuning 中,连续提示被插入到输入序列的嵌入层中,除了语言模型的输入层,其他层的提示嵌入都来自于上一层。这种设计存在两个问题:
P-Tuning v2 的改进在于,不仅在第一层插入连续提示,而是在多层都插入连续提示,且层与层之间的连续提示相互独立。这样增加了可训练参数量,在应对复杂的自然语言理解(NLU)任务和小型模型方面具有更出色的效能。
当前还存在 PILL(Pluggable)、SSF(Scaling Instruction Language Learning)& Shifting Your Features 等其他类型的微调方法。
以下是使用 Hugging Face transformers 和 peft 库进行 LoRA 微调的基础代码示例:
from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import LoraConfig, get_peft_model, TaskType
import torch
# 加载模型和分词器
model_name = "microsoft/phi-2"
model = AutoModelForCausalLM.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)
# 配置 LoRA
lora_config = LoraConfig(
r=16,
lora_alpha=32,
target_modules=["q_proj", "v_proj"],
lora_dropout=0.1,
bias="none",
task_type=TaskType.CAUSAL_LM
)
# 应用 LoRA 配置
model = get_peft_model(model, lora_config)
model.print_trainable_parameters()
# 准备训练数据(此处省略数据处理细节)
# ...
# 开始训练
# trainer.train()
| 方法 | 参数量变化 | 推理速度 | 适用场景 |
|---|---|---|---|
| LoRA | 极少 | 无影响 | 大多数下游任务,显存受限 |
| QLoRA | 极少 | 无影响 | 超大模型,单卡训练 |
| Adapter | 少量 | 轻微下降 | 多任务学习,模块化扩展 |
| Prefix/Prompt | 极少 | 无影响 | 指令遵循,少样本学习 |
| P-Tuning | 少量 | 轻微下降 | 复杂上下文理解 |
选择合适的微调方法需权衡显存资源、任务复杂度及推理延迟要求。对于大多数应用场景,LoRA 和 QLoRA 是目前性价比最高的选择。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online