使用 LLaMA 3 8B 微调一个 Reward Model:从入门到实践
本文将介绍如何基于 Meta 的 LLaMA 3 8B 模型构建并微调一个 Reward Model,它是构建 RLHF(基于人类反馈的强化学习)系统中的关键一环。我们将使用 Hugging Face 的 transformers
、trl
和 peft
等库,通过参数高效微调(LoRA)实现高质量 Reward Model 的训练。
什么是 Reward Model?
Reward Model(RM)是 RLHF 流程中的评分器,它学习人类偏好:在多个候选回答中判断哪个更符合用户意图。训练目标是使模型给出更高 reward 分数的输出更符合人类偏好,常用于后续的强化学习微调如 PPO、DPO 等。
技术选型
-
模型基座:
LLaMA 3 8B
(你需要有模型访问权限) -
微调方法:
LoRA
(Parameter-Efficient Fine-Tuning) -
训练库:trl (Transformers Reinforcement Learning)
-
数据格式:偏好比较数据(prompt, chosen, rejected)
数据格式示例
Reward Model 使用的是 pairwise preference 数据,基本格式如下:
{ \"prompt\": \"什么是人工智能?\", \"chosen\": \"人工智能是让机器具备模拟人类智能的能力,例如学习、推理、感知等。\", \"rejected\": \"人工智能就是让机器变得更厉害。\"}
-
prompt
是输入问题 -
chosen
是较优回答 -
rejected
是较差回答
我们训练模型区分出“好回答”和“不好回答”。
安装依赖
pip install transformers peft trl accelerate datasets bitsandbytes
加载 LLaMA 3 模型
我们使用 Hugging Face 的 transformers
加载 LLaMA 3,并通过 LoRA 应用微调。
from transformers import AutoTokenizer, AutoModelForCausalLMfrom peft import LoraConfig, get_peft_modelmodel_name = \"meta-llama/Meta-Llama-3-8B\"tokenizer = AutoTokenizer.from_pretrained(model_name)tokenizer.pad_token = tokenizer.eos_token # 处理 paddingmodel = AutoModelForCausalLM.from_pretrained( model_name, load_in_8bit=True, # 节省显存 device_map=\"auto\")# 应用 LoRAlora_config = LoraConfig( r=8, lora_alpha=16, lora_dropout=0.05, bias=\"none\", task_type=\"CAUSAL_LM\")model = get_peft_model(model, lora_config)
准备数据集
我们使用本地 JSON 文件作为训练数据,并转换为 Hugging Face Dataset
格式。
from datasets import Datasetimport jsonwith open(\"data/reward_data.json\", \"r\", encoding=\"utf-8\") as f: raw_data = json.load(f)dataset = Dataset.from_list(raw_data)
使用 RewardTrainer 训练模型
我们使用 trl
中的 RewardTrainer
,它自动处理 pairwise loss(log-sigmoid ranking loss),非常适合训练 Reward Model。
from trl import RewardTrainer, RewardConfigtraining_args = RewardConfig( output_dir=\"./output/rm-llama3\", per_device_train_batch_size=2, gradient_accumulation_steps=4, learning_rate=1e-5, max_length=1024, num_train_epochs=3, logging_steps=10, save_strategy=\"epoch\", remove_unused_columns=False, bf16=True, # 或根据硬件选择 fp16/bf16)trainer = RewardTrainer( model=model, tokenizer=tokenizer, train_dataset=dataset, args=training_args,)trainer.train()
保存模型
trainer.save_model(\"./output/rm-llama3\")tokenizer.save_pretrained(\"./output/rm-llama3\")
保存后的模型可以直接用于 PPO、DPO 等强化学习阶段,作为 reward function 评估输出质量。
奖励评分逻辑(原理简述)
虽然你加载的是普通的语言模型(AutoModelForCausalLM
),但 RewardTrainer
会这样做:
-
输入
prompt + chosen
和prompt + rejected
两个序列 -
使用语言模型计算每个序列的 log-likelihood(对数似然)
-
总结每个序列的 log-prob 得分作为 reward 分数
-
用
log(sigmoid(reward_chosen - reward_rejected))
作为 loss,更新参数
这个过程实现了 pairwise preference learning,而你无需自定义 loss 函数。
非lora 的方式训练的reward 模型。
如何训练一个 Reward Model:RLHF 的核心组件详解_reward model训练-CSDN博客
参考资料
https://github.com/huggingface/trl