Instrct-GPT 强化学习奖励模型 Reward modeling 的训练过程原理实例化详解
Instrct-GPT 强化学习奖励模型 Reward modeling 的训练过程原理实例化详解
- 一、批次处理的本质:共享上下文的比较对捆绑
- (1)为什么同一prompt的比较对必须捆绑?
- (2)InstructGPT的优化方案
- 二、输入输出与损失函数的具体构造
- (1)输入输出示例
- (2)人工标注数据的处理
- (3)损失函数的计算过程
- (4)反向传播的核心逻辑
- 三、为什么不需要人工标注分值?
- (1)排序数据的天然属性
- (2)避免主观评分的不一致性
- (3)比较对的数学优势
- 四、批次处理的计算效率提升
- (1)显存占用对比
- (2)计算量对比
- 五、验证实验与效果
- (1)过拟合控制
- (2)人类评估
- 六、总结
Instrct-GPT强化学习奖励模型的训练过程是不是有疑问,下面是其原理的实例化详解!解答你下面的问题:
- 为什么将同一 prompt 的所有 C (K,2) 对作为一个批次元素进行训练。例如,K=4 时,一个批次包含 6 对比较,但仅需对该 prompt 的 4 个响应各进行一次前向传播,而非 6 次。
- 奖励模型在训练过程中的输入和输出究竟是什么。
- 人工标注数据究竟怎么和输出的分值构造出损失函数,从而进行反向传播。
- 原本的训练数据集是否只是排序的顺序,而没有分值?
一、批次处理的本质:共享上下文的比较对捆绑
(1)为什么同一prompt的比较对必须捆绑?
假设我们有一个prompt:“如何提高代码可读性?”,SFT模型生成4个响应:
- y₁:“使用清晰的变量命名和注释”
- y₂:“遵循代码风格指南”
- y₃:“增加单元测试覆盖率”
- y₄:“减少嵌套层级”
标注者对这4个响应排序为 y₁ ≻ y₂ ≻ y₃ ≻ y₄。传统方法会将6个比较对(如(y₁,y₂)、(y₁,y₃)等)打散到不同批次中训练,但这样会导致两个问题:
- 过拟合:模型可能记住特定比较对的局部模式(例如"y₁优于y₂"),而无法泛化到同一prompt的其他比较对(如"y₁优于y₃")。
- 计算冗余:每个比较对需单独前向传播,对于K=4需6次推理,显存占用和计算量翻倍。
(2)InstructGPT的优化方案
- 输入:将prompt和4个响应作为一个批次元素(形状为
[4, token_length]
)。 - 前向传播:仅需一次推理得到4个响应的奖励值:
r 1 = r θ ( x , y 1 ) , r 2 = r θ ( x , y 2 ) , r 3 = r θ ( x , y 3 ) , r 4 = r θ ( x , y 4 ) r_1 = r_\theta(x, y_1), \quad r_2 = r_\theta(x, y_2), \quad r_3 = r_\theta(x, y_3), \quad r_4 = r_\theta(x, y_4) r1=rθ(x,y1),r2=rθ(x,y2),r3=rθ(x,y3),r4=rθ(x,y4) - 比较对生成:根据排序生成所有6对比较,例如:
- (y₁,y₂) → (r₁, r₂)
- (y₁,y₃) → (r₁, r₃)
- …
- (y₃,y₄) → (r₃, r₄)
这种方法的核心是:同一prompt的比较对共享相同的上下文,模型需学习上下文依赖的相对偏好,而非独立处理每个比较对。
二、输入输出与损失函数的具体构造
(1)输入输出示例
- 输入:
- Prompt: “如何提高代码可读性?”
- 响应集合: [y₁, y₂, y₃, y₄](token化后的序列)
- 输出:
- 奖励值: [r₁=0.9, r₂=0.7, r₃=0.5, r₄=0.3](假设模型预测)
(2)人工标注数据的处理
标注者仅提供排序顺序 y₁ ≻ y₂ ≻ y₃ ≻ y₄,未给出具体分值。训练时需将排序转换为比较对:
- 比较对生成:
- 所有升序对:(y₁,y₂), (y₁,y₃), (y₁,y₄), (y₂,y₃), (y₂,y₄), (y₃,y₄)
- 每个对中,前一个是winner(yw),后一个是loser(yl)。
(3)损失函数的计算过程
对于每个比较对(yw, yl),损失项为:
loss p a i r = − log σ ( r w − r l ) \text{loss}_{pair} = -\log \sigma(r_w - r_l) losspair=−logσ(rw−rl)
其中, σ \sigma σ是sigmoid函数,将奖励差异转换为概率:
σ ( r w − r l ) = 1 1 + e − ( r w − r l ) \sigma(r_w - r_l) = \frac{1}{1 + e^{-(r_w - r_l)}} σ(rw−rl)=1+e−(rw−rl)1
以比较对(y₁,y₂)为例:
- 模型输出r₁=0.9,r₂=0.7
- 奖励差异:0.9 - 0.7 = 0.2
- 概率: σ ( 0.2 ) ≈ 0.55 \sigma(0.2) ≈ 0.55 σ(0.2)≈0.55
- 损失项: − log ( 0.55 ) ≈ 0.597 -\log(0.55) ≈ 0.597 −log(0.55)≈0.597
所有6个比较对的损失求平均:
loss = 1 6 ∑ i = 1 6 loss p a i r i \text{loss} = \frac{1}{6} \sum_{i=1}^6 \text{loss}_{pair_i} loss=61i=1∑6losspairi
(4)反向传播的核心逻辑
- 梯度计算:
对每个比较对,计算梯度:
∂ loss p a i r ∂ θ = − 1 1 + e − ( r w − r l ) ⋅ ( 1 − 1 1 + e − ( r w − r l ) ) ⋅ ( r w − r l ) ′ ⋅ ∂ r w ∂ θ + ⋯ \frac{\partial \text{loss}_{pair}}{\partial \theta} = -\frac{1}{1 + e^{-(r_w - r_l)}} \cdot (1 - \frac{1}{1 + e^{-(r_w - r_l)}}) \cdot (r_w - r_l)' \cdot \frac{\partial r_w}{\partial \theta} + \cdots ∂θ∂losspair=−1+e−(rw−rl)1⋅(1−1+e−(rw−rl)1)⋅(rw−rl)′⋅∂θ∂rw+⋯
(注:实际计算涉及链式法则,此处简化) - 参数更新:
累加所有比较对的梯度,通过Adam等优化器更新模型参数 θ \theta θ,使得:- 偏好响应的奖励值更高(如r₁ > r₂ > r₃ > r₄)
- 非偏好响应的奖励值更低
三、为什么不需要人工标注分值?
(1)排序数据的天然属性
排序本身隐含了相对偏好关系。例如,标注者认为y₁优于y₂,等价于希望模型学习到 r 1 > r 2 r₁ > r₂ r1>r2。这种相对关系可以通过比较对直接建模,无需具体分值。
(2)避免主观评分的不一致性
若要求标注者给出具体分值(如1-5分),可能导致:
- 评分标准不统一:不同标注者对"3分"的理解可能差异很大。
- 数据稀疏性:高分和低分样本不足,模型易过拟合。
(3)比较对的数学优势
比较对的损失函数直接优化奖励差异的对数几率(log odds),与人类偏好的概率模型一致。例如,若人类选择y_w的概率是y_l的2倍,则:
log ( P ( y w ) P ( y l ) ) = r w − r l \log \left( \frac{P(y_w)}{P(y_l)} \right) = r_w - r_l log(P(yl)P(yw))=rw−rl
这种映射关系使得模型能更准确地捕捉人类偏好的概率分布。
四、批次处理的计算效率提升
(1)显存占用对比
- 传统方法:K=4时,每个比较对需单独前向传播,显存占用为 6 × [batch_size, token_length]。
- InstructGPT方法:只需一次前向传播,显存占用为 1 × [4, token_length],降低至原来的1/6。
(2)计算量对比
- 传统方法:6次前向传播 + 6次反向传播。
- InstructGPT方法:1次前向传播 + 1次反向传播(梯度累加)。
这种优化对于K=9的情况更显著,计算量从36次减少到1次,提升36倍效率。
五、验证实验与效果
(1)过拟合控制
- 传统方法:验证集log loss较高,模型倾向于记忆特定比较对。
- InstructGPT方法:验证集log loss显著降低(如从0.8降至0.4),表明模型真正学习到了上下文依赖的偏好模式。
(2)人类评估
在人工评估中,使用批次处理训练的奖励模型引导的RL策略,其输出被人类偏好的比例比传统方法高15%~20%。
六、总结
InstructGPT的批次处理机制通过共享上下文的比较对捆绑,实现了三大突破:
- 计算效率跃升:单次前向传播处理所有比较对,显存和计算量显著降低。
- 抗过拟合能力增强:强制模型学习上下文依赖的相对偏好,而非局部模式。
- 与人类偏好的精准对齐:通过Pairwise Ranking Loss,将排序数据直接映射到奖励差异的对数几率,避免主观评分的缺陷。
这一设计不仅解决了大规模训练的工程挑战,更从理论上建立了人类偏好与可微分损失函数的直接联系,为后续RLHF阶段提供了可靠的价值函数基础。非常棒的工作!