Note
如何解决信用分配?Token 级和序列级奖励有何不同?
整理奖励归因问题,以及不同奖励粒度对训练信号的影响。
如何解决信用分配问题?token级别和seq级别的奖励有何不同?
信用分配问题(Credit Assignment Problem)是强化学习中的一个经典难题。在语言模型生成的场景下,它指的是:当一个完整的回答(序列)得到一个最终的奖励分数后,我们如何确定这个分数应该归功于(或归咎于)序列中的哪些具体的词元(token)。一个好的结尾可能弥补了一个糟糕的开头,反之亦然。简单地将最终奖励分配给每一个词元是不公平且低效的。
Token级别奖励 vs. Sequence级别奖励
-
Sequence级别奖励 (Sequence-level Reward):
- 定义: 这是RLHF中最常见的形式。奖励模型(RM)读取整个生成的序列,并给出一个单一的标量分数作为对整个序列的评价。
- 优点:
- 与人类评估模式一致: 人类通常是读完整个回答后形成一个总体印象,这种方式更容易收集偏好数据和训练RM。
- 实现简单: 奖励函数的设计和计算都非常直接。
- 缺点:
- 信用分配模糊: 这正是信用分配问题的直接体现。序列中所有token都收到相同的奖励信号,无法区分“好词”和“坏词”,导致学习信号稀疏且充满噪声,降低了学习效率。
-
Token级别奖励 (Token-level Reward):
- 定义: 为序列中的每一个token都分配一个独立的奖励分数。这个分数应该反映该token在当时上下文中的贡献。
- 优点:
- 信号精细: 提供了非常精细和密集的学习信号,理论上可以极大地提高学习效率和最终性能,因为它直接告诉模型哪一步走对了,哪一步走错了。
- 缺点:
- 难以获取: 让标注者为每个token打分几乎是不可能的,认知负荷极大。因此,Token级别的奖励通常不是直接从人类那里获得的。
- 定义困难: 如何定义一个token的“好坏”本身就很复杂。一个词的好坏严重依赖于后续生成的上下文。
如何解决(或缓解)信用分配问题?
尽管我们通常只得到Sequence级别的奖励,但主流的RL算法(如PPO)内部有一些机制来尝试缓解信用分配问题:
- 优势函数(Advantage Function)和价值函数(Value Function):
- 方法: 在PPO中,除了策略模型(Actor),还会训练一个价值模型(Critic)。这个Critic的作用是估计在某个状态(即生成了部分序列的上下文)下,未来可能获得的期望奖励。
- 信用分配: 通过计算优势函数(Advantage),即
A(s, a) = R_t - V(s_t)(简化的形式),我们可以估计出在当前状态s_t选择动作a_t(生成某个token)比“平均水平”好多少。R_t是实际得到的未来总回报,V(s_t)是期望的平均回报。这个优势值可以被看作是一种伪Token级别的奖励信号。 - GAE(Generalized Advantage Estimation): PPO通常使用GAE来更稳定地估计优势函数,它通过指数加权平均综合了多个时间步的TD误差,进一步平衡了偏差和方差,为每个时间步提供了更可靠的信用分配信号。
简单来说,我们虽然只有一个最终的序列奖励,但通过引入一个学习未来期望的Critic,P-PO能够为每一步的token生成一个更合理的、间接的、反映其边际贡献的“优势”信号,从而在实践中有效地解决了信用分配问题。