GRPO 损失

组相对策略优化(GRPO)及其变体实现了带有 PPO 风格裁剪和 KL 正则化的策略梯度损失。

GRPOLoss

标准 GRPO 损失,带有重要性采样、PPO 裁剪和可选的 KL 惩罚。

from twinkle.loss import GRPOLoss

loss_fn = GRPOLoss(
    clip_range=0.2,
    beta=0.01,        # KL 惩罚系数
)

model.set_loss(loss_fn)

参数:

  • clip_range: 重要性权重的 PPO 裁剪范围(默认: 0.2)

  • beta: KL 散度惩罚系数。设为 0 以禁用 KL 正则化

损失函数同时处理标准批次和打包序列(通过 position_ids 检测)。它计算每个 token 的重要性权重,应用 PPO 裁剪,并可选地添加针对参考策略的 KL 惩罚项。

变体

Twinkle 提供了多种 GRPO 变体:

GSPOLoss

序列级重要性采样变体,在序列级别而非 token 级别计算重要性权重。

from twinkle.loss import GSPOLoss
loss_fn = GSPOLoss(clip_range=0.2, beta=0.01)

SAPOLoss

软门控优势策略优化,在优势值上应用 sigmoid 门控来控制优化方向。

from twinkle.loss import SAPOLoss
loss_fn = SAPOLoss(clip_range=0.2, beta=0.01, tau=1.0)

CISPOLoss

裁剪重要性采样策略优化,在与优势值相乘之前对重要性权重进行显式裁剪。

from twinkle.loss import CISPOLoss
loss_fn = CISPOLoss(clip_range=0.2, beta=0.01)

BNPOLoss

批归一化策略优化,在聚合之前对批次内的每 token 损失进行归一化。

from twinkle.loss import BNPOLoss
loss_fn = BNPOLoss(clip_range=0.2, beta=0.01)

DRGRPOLoss

动态比率 GRPO,使用固定分母进行重要性权重计算。

from twinkle.loss import DRGRPOLoss
loss_fn = DRGRPOLoss(clip_range=0.2, beta=0.01)

所有 GRPO 变体共享相同的打包序列处理、对数概率对齐和 KL 惩罚计算基础流水线。它们的主要区别在于重要性权重和优势值的组合方式。