☰
AI之人类反馈强化学习(RLHF)
2026/9/28 19:13:32 网站建设 项目流程

人类反馈强化学习(Reinforcement Learning from Human Feedback, RLHF)是一种通过人类偏好信号迭代优化大语言模型(LLM)输出特征的技术框架。其核心意图在于解决大语言模型在预训练与有监督微调阶段产生的“生成能力强但对齐度差”的问题,将主观、模糊的人类偏好转化为可量化的标量梯度,驱动模型在开放域生成任务中实现安全、有用且诚实的输出。

  • 解决了传统有监督微调(SFT)仅能模仿固定文本模式、缺乏主观价值判断逻辑,且在开放域生成中极易触发模式崩溃或输出有害内容的问题。
  • 通过“SFT筑基 $ \rightarrow $ 偏好建模(RM) $ \rightarrow $ 强化学习(PPO)闭环对齐”的三阶段训练范式,利用四模型联动架构将离散的生成动作映射为带约束的偏好回报。
  • 引入动态 KL 散度约束与比率剪切(Clip)机制,在最大化偏好奖励的同时设定语言分布基准锚点,规避奖励黑客(Reward Hacking)现象,平衡模型对齐度与泛化生成能力。

架构解析

RLHF 系统架构通过四个核心语言模型的协同运行,完成偏好信号的捕获、评估、状态估计与策略更新。

层级职责与设计说明

  • 输入与状态采样层:提供连续的 Prompt 指令流 $ x $,构成强化学习环境的状态起点。
  • 策略与参考控制层:
    • 策略模型(Actor Model, $ \pi_\theta $):待优化的主网络,负责根据当前状态生成动作(Token)并接收梯度更新。
    • 参考模型(Reference Model, $ \pi_{\text{ref}} $):冻结参数的初始 SFT 模型,作为概率分布的基准锚点。
  • 偏好评估与价值估计层:
    • 奖励模型(Reward Model, $ r_\psi $):冻结参数的评估模型,对完整的生成序列输出全局偏好标量得分。
    • 价值模型(Critic Model, $ V_\phi $):可更新的评估网络,预测当前状态下的累积回报,降低策略梯度的估计方差。
  • 强化学习优化执行层:解耦计算 Token 级别的重构奖励、基于 GAE 的优势估计以及带 Clip 的 PPO 梯度反向传播。

四种模型说明

一、策略模型(Actor Model,$ \pi_\theta $)

  • Actor 直译为“演员 / 动作执行者”。
  • 在经典强化学习的 Actor-Critic 框架中,Actor 负责根据当前的环境状态(State)做出动作(Action)。在 LLM 场景中,“状态”是 Prompt + 已生成的文本,“动作”就是预测下一个 Token。

核心作用与用途

  • 核心角色:待训练的主模型,即最终我们要交付给用户使用的 AI 模型(如 ChatGPT 的主干模型)。
  • 主要职责:
    • 生成文本:接收 Prompt 输入,自回归地采样生成回答序列yyy。
    • 接收梯度更新:在强化学习训练过程中,根据奖励信号和优势估计(Advantage),通过 PPO 算法更新自身参数θ\thetaθ,使其未来生成高分回答的概率更高。

二、参考模型(Reference Model,$ \pi_{\text{ref}} $)

  • Reference 直译为“参考 / 参照物”。
  • 它充当 Actor 训练过程中的语言分布锚点(Anchor)。

核心作用与用途

  • 核心角色:冻结的 SFT(有监督微调)模型,参数在整个 RL 阶段完全不更新。
  • 主要职责:
    • 计算 KL 散度约束:对于 Actor 生成的同一个序列,Ref 模型同时计算其 Token 级别的对数概率$ \log \pi_{\text{ref}} $。
    • 防止策略漂移与模式崩溃(Reward Hacking):如果只追求高奖励分,Actor 可能会找到 RM 的漏洞(如反复输出特定冗余高分词汇、投机取巧)。Ref 模型通过衡量 Actor 与 Ref 之间的 KL 散度,惩罚偏离过远的行为,确保模型在学会“讨好人类”的同时保留基本的语言表达能力和通用知识。

三、奖励模型(Reward Model / RM,$ r_\psi $)

  • Reward 意为“奖励 / 偏好打分器”。
  • 在强化学习中,环境需要给智能体(Agent)反馈一个标量 Reward。由于“回答质量好坏”无法用简单的硬编码规则衡量,因此专门训练了一个 AI 模型来模拟人类的偏好打分。

核心作用与用途

  • 核心角色:人类偏好的量化裁判(打分器)。
  • 主要职责:
    • 评价文本质量:输入“Prompt + 完整的生成回答”,输出一个标量实数得分$ r_\psi(x, y) $。
    • 引导对齐方向:RM 在 RLHF 阶段 2 已通过人类排序数据(Pairwise Loss)训练完成,参数在 PPO 阶段冻结不更新。它作为固定的外部环境反馈,指示回答是否符合人类的“有用、无害、诚实”标准。

四、价值模型(Critic Model,$ V_\phi $)

  • Critic 直译为“评论家 / 评估者”。
  • 在 Actor-Critic 架构中,Actor 负责“演”,Critic 负责“评”。不同于 RM 给出的终态结果得分,Critic 评估的是过程中的中间状态价值。

核心作用与用途

  • 核心角色:动态更新的状态价值预测网络。
  • 主要职责:
    • 预测累积回报(Value Estimation):输入当前状态(Prompt + 已生成的局部 Token),预测从当前位置开始到生成结束能够获得的预期累积回报$ V_t $。
    • 计算优势函数(Advantage Function):将实际获得的奖励与预测的基线值相减($ A_t = R_t - V_t $),从而计算出当前动作是“超出预期”还是“低于预期”。
    • 降低策略梯度的方差:在强化学习中,直接用全局 Reward 引导更新 ,会导致梯度的波动幅度极其巨大( 方差极大,训练极不稳定)。Critic 的存在相当于建立了一个“期望基线”,帮助 Actor 更稳定地学习。Critic 的参数$ \phi $会根据实际表现误差在训练中动态更新。

系统运行逻辑

系统运行遵循“指令输入 $ \rightarrow $ 多模型推理评估 $ \rightarrow $ 奖励重构与优势估计 $ \rightarrow $ 闭环更新”的严格时序逻辑。

执行链详细步骤

  1. 指令接收与生成:环境向 Actor 输入指令 $ x $,Actor 按自回归方式采样生成完整回答 $ y $。
  2. 多模型联合前向传播,序列 $ (x, y) $ 并行送入 :
  • Ref 模型计算对数概率 $ \log \pi_{\text{ref}}(y_t \vert{} x, y_{<t}) $。
  • RM 模型计算终止步的序列级标量奖励 $ r_\psi(x, y) $。
  • Critic 模型计算各个时间步 $ t $ 的状态价值估计 $ V_t $。
  1. 奖励信号重构:根据 Actor 与 Ref 的概率比值计算逐 Token 的 KL 散度惩罚,将 RM 的全局标量奖励叠加至末端 Token,推导出各步的即时奖励 $ r_t $。
  2. 优势估计与梯度更新:结合 $ V_t $ 与 $ r_t $ 构建广义优势估计(GAE),利用剪切目标函数更新 Actor 参数 $ \theta $,同时最小化价值预测误差更新 Critic 参数 $ \phi $。

代码实现样例

偏好奖励模型 (RM) 损失函数

奖励模型通过学习人类对不同候选回答的排序偏好,将非结构化文本评价转化为可计算的实数标量。

importtorchimporttorch.nnasnnimporttorch.nn.functionalasFclassPairwiseRewardLoss(nn.Module):""" 基于 Bradley-Terry 模型的 Pairwise Ranking Loss 实现 针对同一 Prompt 下的高质量回答 (winning) 与低质量回答 (losing) 计算交叉熵损失 """def__init__(self):super().__init__()defforward(self,rewards_chosen:torch.Tensor,rewards_rejected:torch.Tensor)->torch.Tensor:""" :param rewards_chosen: 优胜回答的标量得分,Shape: (batch_size,) :param rewards_rejected: 劣势回答的标量得分,Shape: (batch_size,) """# 防御性校验:断言输入张量形状一致ifrewards_chosen.shape!=rewards_rejected.shape:raiseValueError(f"Shape mismatch: chosen{rewards_chosen.shape}vs rejected{rewards_rejected.shape}")# 计算得分差值并应用 Sigmoid 交叉熵损失# L_RM = -E [ log(sigmoid(r_w - r_l)) ]logits=rewards_chosen-rewards_rejected loss=-F.logsigmoid(logits).mean()returnloss

逻辑解析

  • 该阶段作用于 SFT 之后,为 PPO 阶段提供稳定、无偏的打分裁判。
  • 输入校验部分直接拒绝尺寸不匹配的 Batch 维度,确保张量计算的安全性。
  • F.logsigmoid(rewards_chosen - rewards_rejected)在数值上等价于 $ \log \sigma(r_w - r_l) $,相比显式调用torch.sigmoid再取log,能有效防止数值下溢(Underflow)。
  • 采用 Pairwise 相对排序而非直接回归绝对打分,避开了不同标注员在绝对打分标准上的主观偏差,使梯度更新更加稳定。

Token 级奖励重构与 KL 散度惩罚

在强化学习采样阶段,通过在即时 Reward 中嵌入针对策略模型偏离度的 KL 散度约束,防止模型走向模式崩溃。

$ \mathcal{L}{\text{RM}}(\psi) = -\mathbb{E}{(x, y_w, y_l) \sim D} \left[ \log \sigma \left( r_\psi(x, y_w) - r_\psi(x, y_l) \right) \right] $

$ r_t = \begin{cases} -\beta D_{\text{KL}}(\pi_\theta \parallel \pi_{\text{ref}})t & t < T \ r\psi(x, y) - \beta D_{\text{KL}}(\pi_\theta \parallel \pi_{\text{ref}})_t & t = T \end{cases} $

importtorchdefcompute_token_level_rewards(log_probs_actor:torch.Tensor,log_probs_ref:torch.Tensor,reward_score:torch.Tensor,kl_coef:float=0.02,pad_mask:torch.Tensor=None)->torch.Tensor:""" 计算逐 Token 的即时奖励,并在末端 Token 叠加 RM 标量得分 :param log_probs_actor: Actor 生成的对数概率, Shape: (batch_size, seq_len) :param log_probs_ref: Ref 模型对相同序列的对数概率, Shape: (batch_size, seq_len) :param reward_score: RM 模型对完整序列的评估得分, Shape: (batch_size,) :param kl_coef: KL 散度惩罚系数 (beta) :param pad_mask: Mask 矩阵,1 表示有效 Token,0 表示 Padding """# 1. 计算 Token 级别的近端 KL 散度近似值# D_KL(pi_theta || pi_ref)_t = log(pi_theta) - log(pi_ref)kl_divergence=log_probs_actor-log_probs_ref# 2. 计算纯 KL 惩罚项: -beta * D_KLkl_penalty=-kl_coef*kl_divergence rewards=kl_penalty.clone()# 3. 寻找序列最后一个有效 Token 的索引,叠加 RM 得分batch_size,seq_len=log_probs_actor.shapeifpad_maskisnotNone:# 获取每个序列最后一个有效 Token 的位置last_non_pad_indices=pad_mask.sum(dim=-1).long()-1else:last_non_pad_indices=torch.full((batch_size,),seq_len-1,device=log_probs_actor.device,dtype=torch.long)# 4. 在末端叠加环境终态奖励forbinrange(batch_size):last_idx=last_non_pad_indices[b]rewards[b,last_idx]+=reward_score[b]# 5. 清理 Padding 区域的异常数值ifpad_maskisnotNone:rewards=rewards*pad_maskreturnrewards

逻辑解析

  • 连接 Actor/Ref/RM 模型预测结果与后端的 GAE 优势估计,是防止 Reward Hacking 的核心防线。
  • 利用对数概率差值log_probs_actor - log_probs_ref替代准确的积分 KL 散度,属于极高效的逐样本点估计方法。
  • 通过pad_mask.sum(dim=-1).long() - 1精确定位动态 Variable-length 序列的实际结尾,避免将 RM 奖励错误叠加在 Padding 位置。
  • 将稀疏的序列级奖励 $ r_\psi(x, y) $ 拆分为密集(Dense)的 Token 级即时信号,大幅平滑了强化学习的credit assignment(贡献度归因)难度。

PPO 策略截断损失计算 (Actor Loss)

基于新旧策略概率比率进行 Clip 截断,控制单次梯度更新的步伐步长。

$ \mathcal{L}_{\text{CLIP}}(\theta) = \hat{\mathbb{E}}_t \left[ \min(r_t(\theta)\hat{A}_t, \text{clip}(r_t(\theta), 1-\epsilon, 1+\epsilon)\hat{A}_t) \right] $

importtorchdefcompute_ppo_actor_loss(log_probs_current:torch.Tensor,log_probs_old:torch.Tensor,advantages:torch.Tensor,clip_eps:float=0.2,mask:torch.Tensor=None)->torch.Tensor:""" 计算 PPO 带 Clip 的 Actor 损失函数 :param log_probs_current: 当前更新步骤策略模型的 log_prob, Shape: (batch_size, seq_len) :param log_probs_old: 采样阶段旧策略模型的 log_prob, Shape: (batch_size, seq_len) :param advantages: GAE 计算出的优势估计 A_t, Shape: (batch_size, seq_len) :param clip_eps: 策略裁剪超参数 epsilon :param mask: Mask 矩阵,排除 Padding Token """# 1. 计算概率比率 ratio = pi_theta(a|s) / pi_theta_old(a|s)# 利用 exp(log_pi - log_pi_old) 避免数值下溢ratio=torch.exp(log_probs_current-log_probs_old)# 2. 未裁剪的目标函数surr1=ratio*advantages# 3. 裁剪后的目标函数ratio_clipped=torch.clamp(ratio,1.0-clip_eps,1.0+clip_eps)surr2=ratio_clipped*advantages# 4. 取两者的极小值(悲观估计),并加负号转化为最小化目标policy_loss=-torch.min(surr1,surr2)# 5. 应用 Mask 并计算全局均值ifmaskisnotNone:policy_loss=(policy_loss*mask).sum()/mask.sum().clamp(min=1.0)else:policy_loss=policy_loss.mean()returnpolicy_loss

逻辑解析

  • 实现强化学习梯度的反向传播,直接更新 Actor 模型参数 $ \theta $。
  • 通过torch.exp(log_probs_current - log_probs_old)安全求解概率比率 $ r_t(\theta) $。
  • torch.min(surr1, surr2)实现了 PPO 的“悲观界”思想(Pessimistic Bound),当优势为正且策略比率过高时强制截断梯度,避免单次梯度更新破坏已习得的对齐能力。
  • 使用固定窗口 $ \epsilon $ 截断而非计算代价高昂的二次 Hessians 矩阵 Hessian-vector 隐式优化(如 TRPO),极大地降低了在大语言模型规模下的计算复杂度。

总结

RLHF 成功构建了“人类意图偏好 $ \rightarrow $ 标量评估 $ \rightarrow $ 概率策略演进”的工程闭环,在大语言模型解决模式崩溃与价值观安全对齐层面起到了不可替代的作用。

工程洞见:

  1. 防范奖励黑客(Reward Hacking)的复合防御策略:
    单纯依赖固定超参数 $ \beta $ 的 KL 惩罚很难在训练后期抵御奖励模型的漏洞攻击(例如生成极长冗余文本刷高分)。生产环境中可采用动态 KL 系数控制器(根据当前 Batch 的平均 KL 散度偏离程度自适应放大或缩小 $ \beta $),或在 RM 输入端增加对抗性数据混洗。
  2. 多模型显存解耦与流水线并行:
    RLHF PPO 阶段需要同时维护 Actor、Ref、RM、Critic 四个模型,显存开销极大。推荐采用分布式拆分策略:Actor 和 Critic 执行频繁的梯度更新并驻留于训练 GPU,而 Ref 与 RM 模型仅做前向 Inference,可部署在独立的推理节点上,通过高性能 RPC/NCCL 框架传输概率与标量值。
  3. 优势函数归一化(Advantage Normalization):
    在计算 PPO 损失之前,务必在 Mini-batch 维度上对优势估计 $ \hat{A}_t $ 执行 Zero-mean 及 Unit-variance 的归一化处理。该步骤能极大平滑不同 Prompt 难度差异带来的奖励震荡,提高梯度更新的数值稳定性。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询