大语言模型微调技术详解:从原理到实践
LLM 的生命周期
大型语言模型(LLM)的开发与部署包含多个关键步骤,其中微调(Fine-tuning)是连接通用预训练模型与特定应用场景的核心环节。
- 愿景和范围:定义项目目标,明确模型是作为通用工具还是处理特定任务(如命名实体识别)。
- 模型选择:决定从头训练还是基于已有模型微调。大多数场景下,微调现有模型更高效。
- 模型表现和调节:评估模型输出,通过 Prompt Engineering 或进一步微调确保符合预期。
- 评估与迭代:定期使用指标和基准测试,在提示工程、微调和评估之间循环优化。
- 部署:模型达标后优化计算效率并上线。
什么是 LLM 微调?
LLM 微调是指采用预训练模型,利用更小的专有数据集进行训练,以完善其能力并提升处理特定任务或领域表现的过程。它是连接通用预训练模型和特定应用需求之间的桥梁。
例如,医疗组织希望使用 GPT-3 生成病人报告。GPT-3 虽能理解通用文本,但可能无法准确处理复杂的医学术语。通过使用含医疗报告和病历记录的数据集进行微调,模型可以学习临床语言的细微差别及报告结构,从而生成准确、连贯的患者报告。
什么时候使用微调?
在使用微调前,需了解以下概念的区别:
- 上下文学习(In-context Learning):通过在提示中提供特定任务示例来改进模型表现,无需更新权重。
- 零样本推理(Zero-shot):无额外示例,直接将输入数据合并到提示中。
- 少样本推理(Few-shot):在提示中添加一个或多个完整示例,改善小模型表现。
当提示中包含大量示例会占用宝贵的上下文窗口空间时,或者需要模型具备特定的领域知识而非简单的模式匹配时,微调是更好的选择。与预训练阶段使用大量非结构化文本不同,微调是一个有监督的学习过程,需要使用标记示例的数据集来更新 LLM 的权重。
监督微调(Supervised Fine-Tuning, SFT)
SFT 意味着使用标记数据来更新预训练语言模型,用于处理特定任务。初始化训练通常是非监督的,而微调则是监督的。
实施步骤
- 准备训练数据:将开源数据转换为指导提示数据集(Instruction Dataset)。例如,将产品评论转换为指令 - 响应对。
- 划分数据集:分为训练集和验证集。
- 训练过程:模型接收提示并生成结果,计算预测值与实际标签之间的误差(Loss),通过梯度下降法调整权重。
- 迭代优化:经过多个 Epoch,模型逐渐接近最小化误差的配置,适应新数据的细微差别。
代码示例:使用 Hugging Face Transformers 进行 SFT
from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments, Trainer
import torch
# 加载预训练模型和分词器
model_name = "meta-llama/Llama-2-7b-hf"
model = AutoModelForCausalLM.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)
# 假设 data 为包含 prompt 和 completion 的列表
data = [{"prompt": "为什么天空是蓝色的?", : }]
training_args = TrainingArguments(
output_dir=,
per_device_train_batch_size=,
num_train_epochs=,
learning_rate=,
fp16=,
logging_steps=
)
trainer = Trainer(
model=model,
args=training_args,
train_dataset=train_dataset,
tokenizer=tokenizer
)
trainer.train()


