前言
随着大语言模型(LLM)技术的飞速发展,如何高效地利用预训练模型解决特定领域任务成为业界关注的核心问题。全量微调虽然效果显著,但计算成本高昂;参数高效微调(PEFT)则通过更新少量参数实现快速适配。本文将系统梳理大模型微调的技术分类、核心原理及实践流程。
图 1. 大模型微调技术分类
一、微调分类
1. 按微调参数规模划分
1.1. 全参微调(Full Parameter Fine-Tuning, FPFT)
全参微调是指使用预训练权重作为初始化权重,在特定数据集上继续训练,更新模型中的所有参数。这种方法能够最大程度地适应新任务的数据分布,但需要消耗大量的显存和算力资源,通常仅适用于拥有充足硬件资源的场景。
1.2. 低参微调(Parameter Efficient Fine-Tuning, PEFT)
低参微调旨在用更少的计算资源完成参数的更新。其核心思想是只更新部分参数,或者通过对参数进行某种结构化约束(如稀疏化或低秩近似解)来降低微调的参数量。PEFT 方法在保持预训练模型通用知识的同时,显著降低了训练成本和显存占用,使得在消费级显卡上也能进行大模型微调。
经典的低参微调方法包括: Adapter(谷歌 2019)、LoRA(微软 2021)、QLoRA(微软 2023)、Prefix Tuning(斯坦福 2021)、Prompt Tuning(谷歌 2021)、P-Tuning(清华 2022)、P-Tuning v2(清华 2022)。以下将对上述多种低参微调技术进行详细整理。
1.2.1. Adapter
Adapter 微调方法涉及向预训练模型中添加小型、任务特定的模块(适配器)。这些适配器被插入到原始模型的层之间(通常在 Transformer 的 Feed-Forward 网络之后),并使用任务特定的数据进行训练。原始模型保持冻结状态,使其具有高效性并保留其通用知识,同时适应特定任务。Adapter 的优势在于模块化设计,便于多任务学习时的参数复用。
图 2. Adapter 微调原理
1.2.2. LoRA
LoRA(Low-Rank Adaptation)是一种基于低秩矩阵分解的微调策略。它假设模型权重的变化具有较低的内蕴维度,因此不直接更新所有参数,而是将权重增量分解为两个低秩矩阵 $A$ 和 $B$ 的乘积($ riangle W = BA$)。这样可以显著减少需要训练的参数数量,并保持原始模型结构不变,以较小的成本实现对下游任务的良好适应。LoRA 是目前应用最广泛的 PEFT 方法之一。
图 3. LoRA 微调原理
1.2.3. QLoRA
QLoRA(Quantized Low-Rank Adaptation)是 LoRA 方法的一种变体,特别针对量化场景设计。它在 4-bit 量化基础上结合了低秩矩阵分解,进一步压缩模型大小并降低计算成本。QLoRA 允许在单张消费级 GPU 上微调 65B 甚至更大的模型,极大地降低了大模型微调的门槛。
图 4. QLoRA 微调原理
1.2.4. Prefix Tuning
该方法为预训练语言模型引入一个可学习的'前缀'向量序列,在生成过程中将其与输入文本拼接作为模型的额外输入。模型只需优化这个固定长度的前缀向量,就能引导模型在不同的下游任务上产生合适的结果,避免了对模型主体参数的大规模更新。Prefix Tuning 保留了离散提示词的可解释性,同时具备连续提示词的灵活性。
图 5. Prefix Tuning 微调原理
1.2.5. Prompt Tuning
Prompt Tuning 专注于对提示(prompt)的微调,即将待解决的任务转化为预训练模型熟悉的格式(如同自然语言问答)。这种方法只更新少量被称为'prompt token'的参数,其余大部分参数保持固定。相比人工设计的硬提示词,Prompt Tuning 学习到的软提示词能更好地捕捉任务语义。
图 6. Prompt Tuning 微调原理
1.2.6. P-Tuning
P-Tuning 是 Prompt Tuning 的一种扩展形式,通过将连续的向量(称为'软提示')插入到模型输入中,替代手工设计的离散提示词。这种连续的提示向量经过训练后,能够更灵活且有效地指导模型处理各种下游任务,同时大幅减少需要更新的参数量。P-Tuning 引入了重参数化编码器来增强表达能力。
图 7. P-Tuning 微调原理
1.2.7. P-Tuning v2
P-Tuning V2 在 P-Tuning V1 的基础上进行了多项改进:
- 层级注入:在每一层都加入了 Prompts tokens 作为输入,而不是仅仅加在输入层,这与 Prefix Tuning 的做法相同。这样得到了更多可学习的参数,且更深层结构中的 Prompt 能给模型预测带来更直接的影响。
- 移除重参数化:去掉了重参数化的编码器。研究发现重参数化的改进很小,尤其是对于较小的模型,同时还会影响模型的表现。
- 动态提示长度:针对不同任务采用不同的提示长度。实验表明不同的理解任务通常用不同的提示长度来实现其最佳性能。
- 多任务学习:支持先在多任务的 Prompt 上进行预训练,然后再适配下游任务,缓解连续提示随机惯性带来的优化困难。
图 8. P-Tuning v2 微调原理
2. 按训练流程划分
图 9. LLM 训练流程划分(Pre-Training、Fine-Tuning、Alignment)
2.1. 上下文学习 (In-Context Learning, ICL)
ICL 区别于普通微调 Fine-Tuning,不对 LLMs 执行任何的微调,直接将模型的输入输出拼接起来作为一个 prompt,引导模型根据输入的数据结构 demo,给出任务的预测结果。ICL 能够基于无监督学习的基础上取得更好模型效果,并且不需要根据特定的任务重新微调 Fine-Tuning 更新模型参数,避免不同任务要重新进行真正的微调。另外,提示微调(Prompt Tuning)属于 ICL 的方式之一。
2.2. 有监督微调(Supervised Fine-Tuning, SFT)
在预训练基础上,使用标记数据对预训练模型进行微调的过程,以便模型能够更好地执行特定任务。SFT 是将通用大模型转化为垂直领域模型的关键步骤,通常需要构建高质量的指令 - 回答对数据集。
图 10. 预训练–>有监督微调
2.3. 基于人类反馈的强化学习(Reinforcement Learning from Human Feedback, RLHF)
RLHF 是提升模型对齐人类价值观的重要环节,通常包含三个步骤:
(1)预训练模型的有监督微调:收集提示词集合,并要求 Label 人员写出高质量的答案,然后使用该数据集以监督的方式微调预训练模型,得到基础 SFT 模型。
图 11. SFT 阶段示意图
(2)创建奖励模型(Reward Model, RM):对于每个提示 Prompt,要求微调后的 LLMs 生成多个回复,再由标注人员根据真实的偏好对所有回复进行排序,也可以称为 Alignment。接着训练奖励模型 RM 来学习人类的偏好,用于后续优化。RM 的目标是最大化人类偏好的评分。
图 12. 奖励模型训练示意图
(3)PPO 微调:使用强化学习的算法(如 PPO, Proximal Policy Optimization),根据奖励模型 RM 提供的奖励分数,对 SFT 模型进一步优化用于后续的推理(文字生成)。此过程旨在最大化期望奖励,同时限制模型偏离初始 SFT 模型过远(KL 散度惩罚)。
图 13. PPO 微调流程
3. 按训练方式划分
3.1. 有监督微调(Supervised Fine-Tuning, SFT)
使用标记数据对预训练模型进行微调的过程,以便模型能够更好地执行特定任务。这是目前最主流的微调方式。
3.2. 指令微调(Instruction Tuning, IT)
指令微调 Instruction Tuning 可以被视为有监督微调 SFT 的一种特殊形式。通过构造特殊的数据集,即<指令,输出>对的数据集,进一步训练 LLM 的过程,以增强 LLM 能力和可控性。由人类指令和期望的输出组成进行配对。这种数据结构使得指令微调专注于让模型理解和遵循人类指令。作为有监督微调的一种特殊形式,专注于通过理解和遵循人类指令来增强大型语言模型的能力和可控性。
4. 微调优势
4.1. 定制化模型
通过微调大模型,可以根据用户自身的具体需求定制模型,从而提高准确性和性能,使其更贴合业务场景。
4.2. 提高资源利用率
通过减少从头开始构建新模型的方式进行预训练,从而来节省时间、算力资源和其他带来的成本。PEFT 技术更是将显存需求降低了数倍。
4.3. 性能提升
微调的过程,可以使用用户的独特数据集,来增强预训练模型的性能,特别是在专业领域的知识问答、文本生成等任务上。
4.4. 数据优化
可以充分利用客户的数据,调整大模型以更好地适应用特定数据场景,甚至在需要时合并新数据,实现持续学习。
二、微调实践(以 LoRA 为例)
在实际操作中,我们通常使用 Hugging Face 的 transformers 和 peft 库来实现 LoRA 微调。以下是完整的代码示例及关键步骤说明。
import transformers
import torch
from torch.utils.data import Dataset
from peft import LoraConfig, TaskType, get_peft_model
model_name_or_path = "baichuan-inc/Baichuan2-7B-Base"
training_args = type('obj', (object,), {'cache_dir': './cache', 'model_max_length': 2048})()
model = transformers.AutoModelForCausalLM.from_pretrained(
model_name_or_path,
trust_remote_code=True,
cache_dir=training_args.cache_dir,
device_map="auto"
)
tokenizer = transformers.AutoTokenizer.from_pretrained(
model_name_or_path,
use_fast=False,
trust_remote_code=True,
model_max_length=training_args.model_max_length,
cache_dir=training_args.cache_dir
)
peft_config = LoraConfig(
task_type=TaskType.CAUSAL_LM,
target_modules=["W_pack", "q_proj", "v_proj"],
inference_mode=False,
r=8,
lora_alpha=32,
lora_dropout=0.1
)
model.enable_input_require_grads()
model = get_peft_model(model, peft_config)
model.print_trainable_parameters()
class ():
():
.tokenizer = tokenizer
.max_length = max_length
data_path =
dataset = SupervisedDataset(data_path, tokenizer, training_args.model_max_length)
trainer = transformers.Trainer(
model=model,
tokenizer=tokenizer,
train_dataset=dataset,
args=transformers.TrainingArguments(
output_dir=,
per_device_train_batch_size=,
gradient_accumulation_steps=,
learning_rate=,
num_train_epochs=,
fp16=,
logging_steps=,
save_strategy=
)
)
trainer.train()
trainer.save_state()
trainer.save_model(output_dir=training_args.output_dir)
环境依赖建议:
- Python >= 3.8
- PyTorch >= 1.13
- transformers >= 4.30
- peft >= 0.4.0
- accelerate
三、数据准备与评估
1. 数据准备
高质量的数据是微调成功的关键。对于指令微调,建议采用 JSONL 格式,每条数据包含 instruction(指令)、input(输入,可选)和 output(输出)。数据清洗应去除噪声、重复样本及敏感信息。若数据量较小,可采用数据增强技术(如回译、同义词替换)扩充样本。
2. 评估指标
微调完成后,需从多维度评估模型效果:
- 困惑度(Perplexity, PPL):衡量模型对测试数据的预测不确定性,越低越好。
- BLEU/ROUGE:适用于文本生成任务,衡量生成内容与参考文本的相似度。
- 人工评估:邀请领域专家对生成结果的质量、准确性、安全性进行打分。
- 基准测试:在 MMLU、C-Eval 等标准榜单上进行对比测试。
四、常见问题与最佳实践
- 显存不足:若使用 4-bit 量化(QLoRA)仍报错,请检查
device_map 设置,或启用 gradient_checkpointing 以节省显存。
- 灾难性遗忘:微调可能导致模型丧失通用能力。可通过混合部分通用数据或使用较小的学习率来缓解。
- 过拟合:若验证集损失上升而训练集下降,应增加正则化(Dropout)或提前停止训练。
- 推理加速:微调后的模型可使用
bitsandbytes 库进行量化部署,提升推理速度。
总结
本文从微调参数规模、训练流程、训练方式三个角度对微调进行了系统分类,深入解析了 Adapter、LoRA、QLoRA 等主流 PEFT 技术的原理与差异。章节二以实战代码为例,分析了 LLM 微调的关键实现细节。章节三补充了数据准备与评估方法,帮助开发者构建完整的工作流。掌握大模型微调技术,是进入 AI 工程化领域的必经之路,建议结合具体业务场景反复实践,积累调优经验。