大模型PPO中的奖励是什么?

在强化学习的过程中,奖励通常只在序列结束时才会出现,其他中间步骤的奖励为 0,折扣因子为 1,为Reward Model输出的标量结果。

为了防止模型被 Reward Model 过度优化,需要在奖励中加入 KL 惩罚项。

在奖励函数中,额外加入的这一项基于强化学习(RL)策略 \pi^\text{RL}_\phi 和初始监督模型 \pi^\text{SFT} 之间的 Kullback-Leibler(KL)散度。总奖励可以表示为:

r_{\text{total}} = r(x, y) - \eta \text{KL}(\pi^\text{RL}_\phi(y|x), \pi^\text{SFT}(y|x))

其中,\eta 是 KL 惩罚系数,用于控制 KL 惩罚的强度。KL 散度项在这个上下文中有两个重要作用。首先,它作为一种熵奖励(entropy bonus),促进策略空间中的探索,防止策略过早收敛到单一模式。其次,它确保 RL 策略的输出不会与奖励模型在训练过程中遇到的样本出现显著偏离。

在TRL中计算总奖励的代码:

def compute_rewards(
    self,
    scores: torch.FloatTensor,
    logprobs: torch.FloatTensor,
    ref_logprobs: torch.FloatTensor,
    masks: torch.LongTensor,
):
    rewards, non_score_rewards = [], []
    for score, logprob, ref_logprob, mask in zip(scores, logprobs, ref_logprobs, masks):
        # compute KL penalty (from difference in logprobs)
        kl = self._kl_penalty(logprob, ref_logprob)
        non_score_reward = -self.kl_ctl.value * kl
        non_score_rewards.append(non_score_reward)
        reward = non_score_reward.clone()
        last_non_masked_index = mask.nonzero()[-1]

        # reward is preference model score + KL penalty
        reward[last_non_masked_index] += score
        rewards.append(reward)
    return torch.stack(rewards), torch.stack(non_score_rewards)

def _kl_penalty(self, logprob: torch.FloatTensor, ref_logprob: torch.FloatTensor) -> torch.FloatTensor:
    if self.config.kl_penalty == "kl":
        return logprob - ref_logprob

    if self.config.kl_penalty == "abs":
        return (logprob - ref_logprob).abs()

    if self.config.kl_penalty == "mse":
        return 0.5 * (logprob - ref_logprob).square()

    if self.config.kl_penalty == "full":
        return F.kl_div(ref_logprob, logprob, log_target=True, reduction="none").sum(-1)

    raise NotImplementedError

什么是熵奖励?

熵奖励 (Entropy bonus) 是强化学习(Reinforcement Learning)中一种技术,通常用于增强策略梯度算法(例如 Proximal Policy Optimization, PPO),目的是增加探索性行为,以避免策略过早收敛到次优解。

在强化学习中,策略(policy)通过学习确定在特定状态下采取何种行动,而 entropy(熵)衡量了策略的随机性或不确定性。如果策略的熵较大,说明它在不同行动之间保持了一定程度的随机性,从而能够更好地探索环境;而熵较小则意味着策略变得过于确定,可能陷入局部最优。

Entropy bonus 通过向损失函数中添加一项与策略熵相关的正则项来鼓励策略的随机性。其形式为:

\text{Loss} = \text{Original Loss} - \beta \cdot \text{Entropy}

其中,\beta 是一个系数,控制熵对总损失的影响。通过这种方式,算法会倾向于选择具有较高随机性的策略,这有助于更全面地探索状态空间,避免过早陷入局部最优解。

总结来说,entropy bonus 用来在强化学习训练过程中保持探索性,鼓励模型在不确定时尝试不同的行动,以提高学习效率和最终性能。