强化学习/对齐(个人理解)
Bradley-Terry 奖励模型含义给定选中和拒绝响应的隐藏状态将其投影为标量奖励并计算偏好损失。def reward_model_loss(chosen_hidden, rejected_hidden, reward_head): r_chosen (chosen_hidden reward_head).squeeze(-1) # (B,) r_rejected (rejected_hidden reward_head).squeeze(-1) # (B,) margin r_chosen - r_rejected # manual log-sigmoid: log(1/(1exp(-x))) -log(1exp(-x)) loss -torch.log(1.0 / (1.0 torch.exp(-margin))).mean() return lossloss -torch.log(1.0 / (1.0 torch.exp(-margin))).mean()成对损失通常使用 log-sigmoid 形式等同于二元交叉熵损失DPO含义 无需强化学习即可将语言模型与人类偏好对齐使用配对的选中/拒绝对数概率。。def dpo_loss(policy_chosen_logps, policy_rejected_logps, ref_chosen_logps, ref_rejected_logps, beta0.1): chosen_rewards beta * (policy_chosen_logps - ref_chosen_logps) rejected_rewards beta * (policy_rejected_logps - ref_rejected_logps) diff chosen_rewards - rejected_rewards return -torch.log(torch.sigmoid(diff)).mean()参考模型是为了防止模型偏离初始语言能力避免退化。policy_chosen_logps这些参数是整个对话的对数似然取每个token 的 log probs 求和GRPO含义每个提示组内归一化奖励以计算优势值然后使用这些组相对优势优化策略。def grpo_loss(logps: Tensor, rewards: Tensor, group_ids: Tensor, eps: float 1e-5) - Tensor: Group Relative Policy Optimization (GRPO) loss. logps: (B,) policy log-probs for each sampled response rewards: (B,) scalar rewards for each response group_ids: (B,) integers, same id same prompt/group returns: scalar loss (Tensor) # Compute per-group normalized advantages A_i unique_ids group_ids.unique() advantages torch.empty_like(rewards) for gid in unique_ids: mask group_ids gid r_g rewards[mask] mean_g r_g.mean() std_g r_g.std(unbiasedFalse) advantages[mask] (r_g - mean_g) / (std_g eps) # Stop gradient through advantages advantages_detached advantages.detach() # GRPO objective: -E[A_i * logpi_i] return -(advantages_detached * logps).mean()在反向传播时不通过优势值回传梯度。优势值被视为“常数”或“目标”只用于加权策略梯度。无需 Critic 网络。传统 PPO 需要训练一个价值网络critic来估计优势GRPO 用组内统计量替代简化架构。同一 prompt 的多个回答相互比较消除 prompt 难度差异带来的偏差。PPO含义通过裁剪重要性采样比率来约束策略更新防止强化学习中的破坏性大幅更新。def ppo_loss(new_logps: Tensor, old_logps: Tensor, advantages: Tensor, clip_ratio: float 0.2) - Tensor: PPO clipped surrogate loss. new_logps: (B,) current policy log-probs old_logps: (B,) old policy log-probs (treated as constant) advantages: (B,) advantage estimates (treated as constant) returns: scalar loss (Tensor) # Detach old_logps and advantages so gradients only flow through new_logps old_logps_detached old_logps.detach() adv_detached advantages.detach() # Importance sampling ratio r pi_new / pi_old in log-space ratios torch.exp(new_logps - old_logps_detached) # Unclipped and clipped objectives unclipped ratios * adv_detached clipped torch.clamp(ratios, 1.0 - clip_ratio, 1.0 clip_ratio) * adv_detached # PPO objective: negative mean of the more conservative objective return -torch.min(unclipped, clipped).mean()通过裁剪比率防止单次更新步长过大避免策略崩溃。DAPO含义GRPO 往往因clip 范围设置不合理、采样冗余以及长序列梯度被稀释等问题导致大量训练信号被浪费。提高了裁剪上界当 old policy 对某个 token 的概率很低而该 token 的 advantage 又是正值会因为上界而受限。动态采样可能出现组内优势值为0因此保证每次采样出来的回答reward 不全是 0 或者 1如果采样出来的回答全是 0 或者 1 就继续采样直到不满足为止。Token-Level Gradient Loss GRPO 在训练长回答时 gradient 的权重会随着采样回答的长度变长而下降的问题。如果一个回答长度是100一个是10他们的token的权重会不一样。因此把所有生成的token总数加起来求平均。Overlong Reward Shaping当生成长度超过第一个预设阈值时惩罚会随长度线性增加一旦超过第二个阈值惩罚将抵消因回答正确获得的所有奖励相当于将该回答视为无效GSPO含义直接调整了优化目标的颗粒度从 token-level 跳到 sequence-level主要为了解决MOE训练中GRPO不稳定的问题因为新旧策略可能激活不同的专家导致重要性比例被频繁截断导致训练不稳定。之前的做法使用Routing Replay方法即在训练时强制使用推理时相同的激活路径但这会带来工程复杂性与效率损失。GSPO的做法重要性比例使用的是句子级的比例而不是每个token级的所以一旦 clipping 发生所 clip 掉的将是整个采样到的 sequence而不是一次采样中的某些 token。