趋近智
实施大型语言模型 (LLM) 的监督微调 (SFT) 过程,需要理解其具体实践。这个阶段涉及到一个预训练的基础模型,并使用特定的演示数据集对其进行进一步训练,以在更复杂的强化学习 (RL) 阶段之前调整其行为。仔细关注实施细节对于获得表现良好的 SFT 模型十分重要,这为成功的 RLHF 奠定了基础。
SFT 的起点通常是一个大型的预训练语言模型。常用的选择包括 GPT 系列、Llama、Mistral 模型或其他开源替代方案。选择取决于任务要求、计算资源和许可限制等因素。
大多数 SFT 实施会利用 PyTorch 或 TensorFlow 等已有的深度学习框架,通常结合专门为 Transformer 模型设计的库,例如 Hugging Face 的 transformers。这些库提供预置的模型架构、分词器和训练工具,大大简化了微调过程。使用 transformers,你只需几行代码就能加载一个预训练模型及其对应的分词器:
from transformers import AutoModelForCausalLM, AutoTokenizer
model_name = "meta-llama/Llama-2-7b-hf" # 示例模型
model = AutoModelForCausalLM.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)
由提示-响应对组成的整理好的 SFT 数据集需要为模型正确格式化。这包括:
结构化输入: 将提示和响应连接成一个单一序列。一种常用格式是这样构造输入:"<s>[INST] 提示文本 [/INST] 响应文本 </s>"。特殊标记(如 <s>、</s>、[INST]、[/INST])用于区分输入的不同部分,并标识回合或序列的开始/结束。这些标记取决于所使用的具体基础模型;请查阅模型文档。
分词: 将结构化文本序列转换为模型可以理解的数值输入 ID。必须使用与基础模型关联的分词器。请注意填充(添加特殊标记以使批次中的序列长度相同)和截断(裁剪超出模型最大上下文长度的序列)。
# 使用 Hugging Face 分词器的示例
prompt = "Explain the difference between supervised and unsupervised learning."
response = "Supervised learning uses labeled data..."
formatted_text = f"<s>[INST] {prompt} [/INST] {response} </s>"
# 对格式化文本进行分词
inputs = tokenizer(formatted_text, return_tensors="pt", padding=True, truncation=True, max_length=1024)
# inputs['input_ids'],inputs['attention_mask']
标签遮蔽: 在训练期间,模型应只学习预测响应标记,而不是提示标记。我们通过将与提示标记对应的标签 ID 设置为一个特殊值(通常是 -100)来实现此目的,该值会被标准交叉熵损失函数忽略。只有响应标记对损失计算有贡献。
配置训练循环包括设置优化器、损失函数以及控制学习过程的各种超参数。
调整超参数对于稳定有效的 SFT 训练非常重要。其中一些最重要的包括:
典型的学习率调度从零开始,在预热期线性增加,然后在剩余的训练步数中线性衰减至零。
完全微调(即更新所有模型参数)对于亿级参数模型来说计算成本可能很高。参数高效微调 (PEFT) 方法提供了替代方案,它们只更新一小部分参数或添加新的可训练模块。
peft 等库提供了 LoRA 的简便实现。说明 LoRA 机制的图示。输入
x由冻结的预训练权重W0和低秩分解矩阵A和B共同处理。训练期间只更新A和B。
在训练期间定期保存模型检查点。这可以让你:
当使用 LoRA 等 PEFT 方法时,你通常只需保存小的适配器权重,这些权重比完整模型小得多,这使得检查点保存非常高效。
通过仔细配置这些实施细节,你可以有效地在演示数据上微调你的基础 LLM,创建一个强大的 SFT 模型,为 RLHF 流水线中后续的奖励模型和 RL 微调阶段做好准备。下一节将介绍如何评估这个 SFT 模型的性能。
这部分内容有帮助吗?
transformers库的官方文档,提供了LLM模型加载、分词和训练工具的详细信息,与本节的代码示例直接相关。peft库的官方文档,提供了各种参数高效微调技术(包括LoRA)的实用实现和指南,与本节内容相关。© 2026 ApX Machine Learning用心打造