FEATURED · 精选文章

如何训练奖励模型:train-llm-from-scratch的Bradley-Terry损失详解

发布时间 / 2026/9/1 10:41:35
来源 / 创域科博编辑部
栏目 / 资讯中心
如何训练奖励模型:train-llm-from-scratch的Bradley-Terry损失详解 如何训练奖励模型train-llm-from-scratch的Bradley-Terry损失详解【免费下载链接】train-llm-from-scratchA straightforward method for training your LLM, from downloading data to generating text.项目地址: https://gitcode.com/GitHub_Trending/tr/train-llm-from-scratchtrain-llm-from-scratch是一个从零训练大语言模型LLM的开源项目覆盖数据下载、预训练、SFT 到 RLHF 全流程。其中奖励模型Reward Model是 RLHF 的关键一环它给模型回答打一个分数分数越高代表越受人类偏好。本文将带你用Bradley-Terry 损失亲手训练一个奖励模型并讲清每一步背后的原理。奖励模型在整体流程中的位置奖励模型不是孤立存在的它处于整个后训练流水线的中心位置——上游接收 SFT 模型下游为 PPO 提供奖励信号从图中可以看到预训练基座 → SFT 指令微调之后分三条支路Reward ModelBradley-Terry训练出奖励模型为 PPO 提供reward signalDPO / ORPO / KTO不依赖奖励模型的偏好对齐路线GRPO / RLVR使用可验证奖励的强化学习路线。三条路最终都会汇入评估与聊天环节。奖励模型长什么样给 Transformer 加一个打分头奖励模型的核心思路很简单沿用 InstructGPT 的做法取 SFT 训练好的 Transformer 主干扔掉语言模型头lm_head在最上面接一个极小的标量奖励头Linear(n_embed → 1)把隐藏状态压成一个数奖励值从最后一个真实 token的隐藏状态读取。为什么是最后一个 token因为注意力是因果的causal序列末尾的 token 看过了整段内容却不会注意到它右侧的填充padding——所以连注意力掩码都省了。模型定义见 RewardModel源码中的注释写得很直白a scalar reward head on top of a Transformer backbone在 Transformer 主干上叠加标量奖励头。Bradley-Terry 损失详解整个训练信号就一行代码给定同一个 prompt 下的两个回答chosen偏好和rejected拒绝奖励模型要学的事情只有一件——让 chosen 的分数高于 rejected。Bradley-Terry 模型把这变成如下损失L -log σ(r_chosen - r_rejected)其中 σ 是 sigmoid 函数。直观理解情况r_chosen − r_rejected损失 L含义分数差距很大判对≫ 0≈ 0几乎没有梯度模型满意两个分数相同瞎猜00.693随机水平训练起点分数判反了≪ 0很大强梯度逼模型纠正整个损失函数只有三行bradley_terry_lossdef bradley_terry_loss(chosen_rewards, rejected_rewards): return -F.logsigmoid(chosen_rewards - rejected_rewards).mean()除了损失还有两个配套指标reward_train.pypreference_accuracy偏好准确率r_chosen r_rejected的样本占比这是最值得盯的核心指标reward_margin奖励间隔平均r_chosen − r_rejected衡量模型是否还在有效区分好坏回答。偏好数据从哪来一条完整的数据管道Bradley-Terry 训练需要{prompt, chosen, rejected}三元组。项目的数据管道把公共数据集HH-RLHF、UltraFeedback转换成标准 JSONL 格式对应脚本是 prepare_preference_data.py它会分别从 HH-RLHF人类标注的 helpful/harmless 偏好和 UltraFeedbackLLM 评审的偏好对拉取数据过滤空 prompt、chosen rejected 的噪声样本输出训练集preferences.jsonl和留出测试集preferences_test.jsonl偏好准确率就在它上面测。批次构造逻辑在 preference_dataset.pychosen 和 rejected 两侧各自经 chat template 渲染成 token右侧填充right-padding到同长——这在因果注意力下是安全的。实战一条命令训练你的奖励模型先确认已完成前序阶段预训练 → SFT产出sft.pt和偏好数据然后运行# 单卡 PYTHONPATH. python scripts/train_reward.py # 双卡并行 PYTHONPATH. torchrun --standalone --nproc_per_node2 scripts/train_reward.py训练入口 train_reward.py 做了这些事从 SFT 检查点加载主干sft_ckpt加上奖励头每个 batch 把 chosen 与 rejected拼成 2B 条序列一次前向拿到所有奖励值再对半拆分计算 Bradley-Terry 损失 → 反向传播 → AdamW 余弦学习率更新参数定期在测试集上评估偏好准确率并保存检查点。关键超参在 configs/reward.json 中默认配置一目了然参数默认值说明batch_size8每步 8 对偏好实际过 16 条序列lr1e-5精细微调级别的学习率max_len768单条最大 token 长度grad_clip1.0梯度裁剪保稳定想调参可以直接传命令行参数例如--lr 1e-5 --max_len 768。训练结果怎么看三个数字背后的含义训练日志会打印loss / train_acc / test_acc / margin官方文档 docs/04_reward_model.md 给出了清晰的解读loss从 0.693纯随机起步随分数差距拉大而下降train_acc / test_acc在干净的小数据上能到 1.0在真实的、带噪声的HH-RLHF / UltraFeedback 上0.65–0.75 才是正常水平——人类偏好本身就很嘈杂别为 0.7 焦虑margin还在持续增长说明模型仍在有效区分好坏回答。训练完成后奖励模型保存为reward.pt供下游 PPO 直接加载。下一步奖励模型如何被 PPO 消费PPO 用奖励模型给每次采样rollout的回答打分作为强化学习的目标信号在 train_ppo.py 中通过--reward_source rm即可切换为使用训练好的奖励模型代码内部调用 load_reward_model 加载。小贴士如果你的任务不需要通用偏好打分比如数学题有标准答案也可以跳过奖励模型直接走 DPO 这条免奖励模型路线相关实现见 dpo.py 与 train_dpo.py。总结5 个文件看懂奖励模型训练文件职责src/post_training/reward_model.py奖励模型SFT 主干 标量奖励头src/post_training/reward_train.pyBradley-Terry 损失与评估指标data_loader/preference_dataset.py偏好数据批次构造右侧填充scripts/train_reward.py训练入口单卡 / 双卡 DDPconfigs/reward.json默认超参配置一句话回顾给 SFT 模型加一个打分头 → 用 Bradley-Terry 损失在偏好对上训练 → 偏好准确率 0.65–0.75 即为合格 → 交给 PPO 当老师。跟着 docs/04_reward_model.md 与 POST_TRAINING.md你就能完整复现这一经典 RLHF 环节。【免费下载链接】train-llm-from-scratchA straightforward method for training your LLM, from downloading data to generating text.项目地址: https://gitcode.com/GitHub_Trending/tr/train-llm-from-scratch创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻