GPT-2充当reward model时,是怎么得到分数的
1️⃣ 考察意图
面试官想考察你对RLHF中reward model实现细节的掌握,而非泛泛而谈“用GPT打分”。刁钻点在于:GPT-2是decoder-only模型,没有显式的分类头,如何从语言模型输出中提取标量分数?答好了能展示你理解RLHF pipeline的工程落地能力,包括模型改造、损失函数设计、以及训练稳定性问题。这属于系统设计+工程取舍型问题,需要具体到代码级实现。
2️⃣ 标准答
GPT-2作为reward model的核心思路是:将语言模型最后一层的隐藏状态映射为标量分数,而非直接使用其语言建模的logits。具体实现分三步:
- 模型改造:在GPT-2的transformer层后,取最后一个token的hidden state(维度d_model=768或1024),接一个线性层(Linear(d_model, 1))输出标量。实践中常用两层MLP(如768->256->1)增加非线性,但需注意过拟合——小数据集下线性层更稳。
- 训练数据与损失:基于人类偏好对(chosen/rejected)。输入格式为
[prompt, response]拼接,对每个pair分别计算分数。使用Bradley-Terry模型:损失函数为-log(sigmoid(score_chosen - score_rejected))。这等价于二分类交叉熵,但直接优化分数差。 - 实际落地的坑:GPT-2的最后一个token位置可能不是response结尾(因padding或截断)。解法:用attention mask定位最后一个非padding token,或强制统一截断到固定长度(如512)。另一个坑:分数尺度不稳定——初始时分数可能随输入长度漂移。解法:对分数做LayerNorm或batch normalization,或初始化线性层权重为小值(如0.01)。
工程取舍:为什么不直接用GPT-2的logits?因为logits是词表分布,无法直接反映偏好。而取hidden state加线性层,本质是学习一个“偏好投影”,保留了模型对文本质量的隐式理解。但代价是:GPT-2的预训练目标(next token prediction)与偏好评分任务不直接对齐,需要大量偏好数据微调。
对比其他方案:早期工作(如InstructGPT)用GPT-3 175B做reward model,但成本太高。现代常用更小的专门模型(如6B参数)或基于LLM的reward model(如用Llama加分类头)。GPT-2作为reward model的优点是轻量(124M参数),但泛化差,容易过拟合到训练集风格。
3️⃣ 答题模板(30 秒电梯版)
“这个问题我从模型改造、训练损失、工程坑三个层面回答。模型层面:在GPT-2最后一层取最后一个token的hidden state,接线性层输出标量分数。训练层面:用Bradley-Terry损失优化分数差。工程坑:注意padding位置和分数尺度漂移。总结一句:GPT-2作为reward model本质是学习一个偏好投影,而非直接利用语言建模能力。”
4️⃣ 高频追问 & 应对
追问 1:为什么取最后一个token的hidden state,而不是平均池化或第一个token?
最后一个token在decoder-only模型中能通过因果注意力看到整个序列,包含完整上下文信息。平均池化会稀释关键信息(如response末尾的否定词),第一个token则看不到后续内容。实验表明(如InstructGPT论文),最后一个token效果最好。但注意:如果response长度差异大,最后一个token可能对应不同语义位置,此时可考虑用[EOS] token的hidden state(如果模型有显式结束符)。
追问 2:如果训练数据只有单条评分(无pair),怎么训练?
可以用回归损失:直接优化MSE,但需要人工标注的连续分数(如1-5分),成本高且主观性强。更常见的是用pair数据,因为人类更容易比较两个回答而非打分。如果只有单条数据,可构造伪pair:用同一prompt的不同模型输出,或对同一response加噪声生成负样本。但效果会打折扣,因为噪声分布可能不反映真实偏好。
追问 3:GPT-2作为reward model的分数范围是多少?怎么保证一致性?
分数无固定范围,取决于线性层输出。训练时分数差(chosen-rejected)通常稳定在[-5,5]之间。但不同batch间分数尺度可能漂移,导致PPO训练不稳定。解法:在reward model输出后加一个running mean/std归一化,或使用reward scaling(如除以标准差)。另一种方案:用对比学习目标(如InfoNCE)约束分数分布,但会增加训练复杂度。
5️⃣ 避坑 · 常见错误答法
- ❌ 说“GPT-2直接输出logits作为分数” → ✅ 正确:logits是词表分布,需要取hidden state加线性层映射为标量。
- ❌ 说“取所有token的hidden state平均” → ✅ 正确:最后一个token能通过因果注意力看到全序列,平均会丢失位置信息。
- ❌ 说“用交叉熵损失训练” → ✅ 正确:交叉熵用于分类,reward model用Bradley-Terry损失(分数差sigmoid),本质是pairwise ranking。
6️⃣ 简历呼应
- 如果你有RLHF项目:从“我在项目中用GPT-2 small做reward model,发现分数尺度漂移问题,通过加LayerNorm和梯度裁剪解决”切入,展示实战细节。
- 如果你只做过传统NLP:类比“类似文本分类中的CLS token,但GPT-2没有CLS,所以取最后一个token”,强调迁移能力。
- 如果你是校招无项目:聚焦“我复现了InstructGPT的reward model部分,在HH-RLHF数据集上训练,发现线性层比MLP更稳”,展示论文理解深度。
7️⃣ 延伸阅读
- InstructGPT论文(Training language models to follow instructions with human feedback)
- Bradley-Terry模型在RLHF中的应用(A General Theory of Additive Preference Models)
- 关于reward model分数归一化的博客(Reward Scaling in PPO: Best Practices)
- GPT-2源码中hidden state提取的HuggingFace实现(transformers库GPT2Model类)
- 对比学习在reward model中的应用(Contrastive Preference Learning)