大模型修炼秘籍 第十二章:人师指路——RLHF之精髓
第十二章人师指路——RLHF之精髓人师指路RLHF人类偏好学真经。【本章导读】RLHFReinforcement Learning from Human Feedback人类反馈强化学习是对齐训练的核心方法。通过人类的反馈模型学会什么是好的回答逐步对齐人类价值观。一、RLHF的整体架构【三阶段流程】┌─────────────────────────────────────────────────────────────┐ │ RLHF三阶段流程 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 阶段一监督微调SFT │ │ └─ 用高质量指令数据微调预训练模型 │ │ │ │ 阶段二奖励模型训练RM │ │ └─ 用人类偏好数据训练奖励模型 │ │ │ │ 阶段三强化学习优化PPO │ │ └─ 用奖励模型指导策略优化 │ │ │ └─────────────────────────────────────────────────────────────┘二、阶段一监督微调SFT【SFT回顾】在RLHF之前首先需要通过SFT让模型学会基本的指令遵循能力。这部分在第三卷已详细讲解。【SFT在RLHF中的作用】提供一个良好的初始化策略让模型能够生成合理的回答为后续的偏好学习打下基础三、阶段二奖励模型训练【奖励模型心法】奖励模型Reward Model, RM是人类偏好的代言人。它学习判断哪个回答更好为强化学习提供指导信号。【偏好数据收集】提示: 请解释什么是机器学习 回答A: 机器学习是AI的一个分支让计算机从数据中学习... 回答B: 机器学习就是让机器学习东西... 人类标注: A比B好【数据格式】{ prompt: 请解释什么是机器学习, chosen: 机器学习是AI的一个分支..., rejected: 机器学习就是让机器学习东西... }【奖励模型训练】将两个回答分别输入模型计算奖励分数奖励模型 ↓ 输入: 提示 回答 ↓ 输出: 奖励分数 r(x, y) 训练目标: r(x, y_chosen) r(x, y_rejected)【损失函数】L−logσ(r(x,ychosen)−r(x,yrejected))L -\log\sigma(r(x, y_{chosen}) - r(x, y_{rejected}))L−logσ(r(x,ychosen)−r(x,yrejected))【代码示例】importtorchimporttorch.nnasnnclassRewardModel(nn.Module):def__init__(self,base_model):super().__init__()self.base_modelbase_model self.reward_headnn.Linear(hidden_size,1)defforward(self,input_ids,attention_mask):# 获取模型输出outputsself.base_model(input_ids,attention_maskattention_mask)# 取最后一个token的隐藏状态last_hiddenoutputs.last_hidden_state[:,-1,:]# 计算奖励分数rewardself.reward_head(last_hidden)returnrewarddefcompute_loss(reward_model,chosen_ids,rejected_ids,attention_mask):# 计算chosen和rejected的奖励reward_chosenreward_model(chosen_ids,attention_mask)reward_rejectedreward_model(rejected_ids,attention_mask)# Bradley-Terry模型loss-torch.log(torch.sigmoid(reward_chosen-reward_rejected))returnloss.mean()四、阶段三PPO强化学习【PPO心法】PPOProximal Policy Optimization近端策略优化是强化学习的核心算法。它让模型在奖励模型的指导下逐步优化生成策略。【PPO原理】PPO的核心思想在优化策略时不要偏离太远保持稳定。原始策略: π_old 新策略: π_new 约束: π_new 不要偏离 π_old 太多【PPO目标函数】LCLIPE[min(rt(θ)A^t,clip(rt(θ),1−ϵ,1ϵ)A^t)]L^{CLIP} \mathbb{E}[\min(r_t(\theta)\hat{A}_t, \text{clip}(r_t(\theta), 1-\epsilon, 1\epsilon)\hat{A}_t)]LCLIPE[min(rt(θ)A^t,clip(rt(θ),1−ϵ,1ϵ)A^t)]其中rt(θ)πθ(at∣st)πold(at∣st)r_t(\theta) \frac{\pi_\theta(a_t|s_t)}{\pi_{old}(a_t|s_t)}rt(θ)πold(at∣st)πθ(at∣st)策略比率A^t\hat{A}_tA^t优势函数估计ϵ\epsilonϵ裁剪参数【KL散度惩罚】为了防止策略偏离太远加入KL散度惩罚LtotalLCLIP−β⋅KL(πθ∣∣πref)L_{total} L^{CLIP} - \beta \cdot KL(\pi_\theta || \pi_{ref})LtotalLCLIP−β⋅KL(πθ∣∣πref)其中πref\pi_{ref}πref是参考策略SFT模型。【PPO训练流程】┌─────────────────────────────────────────────────────────────┐ │ PPO训练流程 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 1. 用当前策略生成回答 │ │ prompt → policy → response │ │ │ │ 2. 用奖励模型计算奖励 │ │ (prompt, response) → reward_model → reward │ │ │ │ 3. 计算优势函数 │ │ A reward - baseline │ │ │ │ 4. 更新策略PPO目标 │ │ 最大化 L^{CLIP} - β·KL │ │ │ │ 5. 重复以上步骤 │ │ │ └─────────────────────────────────────────────────────────────┘【代码框架】fromtransformersimportAutoModelForCausalLMimporttorch.optimasoptimclassPPOTrainer:def__init__(self,policy_model,reward_model,ref_model,config):self.policypolicy_model self.reward_modelreward_model self.ref_modelref_model# 参考模型冻结self.optimizeroptim.Adam(self.policy.parameters(),lrconfig.lr)self.kl_coefconfig.kl_coef self.clip_rangeconfig.clip_rangedefcompute_reward(self,prompts,responses):计算奖励inputsself.reward_model.encode(prompts,responses)withtorch.no_grad():rewardsself.reward_model(**inputs)returnrewardsdefcompute_kl(self,prompts,responses):计算KL散度policy_logprobsself.policy.log_prob(prompts,responses)ref_logprobsself.ref_model.log_prob(prompts,responses)kl(policy_logprobs-ref_logprobs).mean()returnkldeftrain_step(self,prompts):# 生成回答responsesself.policy.generate(prompts)# 计算奖励rewardsself.compute_reward(prompts,responses)# 计算KL散度klself.compute_kl(prompts,responses)# 计算PPO损失# ... (简化)ppo_loss-rewards.mean()self.kl_coef*kl# 更新self.optimizer.zero_grad()ppo_loss.backward()self.optimizer.step()returnppo_loss.item()五、RLHF的实践技巧【技巧一奖励模型规模】奖励模型通常比策略模型小策略模型奖励模型7B350M - 1B70B7B175B6B【技巧二KL系数调整】KL系数β\betaβ需要动态调整β\betaβ太大学习太慢β\betaβ太小策略可能崩溃【技巧三奖励塑形】可以在奖励中加入额外约束RtotalRRMλ1Rsafetyλ2RhelpfulnessR_{total} R_{RM} \lambda_1 R_{safety} \lambda_2 R_{helpfulness}RtotalRRMλ1Rsafetyλ2Rhelpfulness【技巧四迭代式RLHF】第一轮: 收集偏好 → 训练RM → PPO优化 ↓ 第二轮: 用新模型收集更多偏好 → 更新RM → 再次PPO ↓ ...持续迭代六、RLHF的局限性【局限一人类偏好不一致】不同标注员可能有不同偏好导致奖励模型学习到噪声。【局限二奖励模型过拟合】奖励模型可能在训练数据上过拟合泛化能力不足。【局限三奖励欺骗】模型可能学会生成讨好奖励模型但不真正有用的回答。【局限四计算成本高】PPO训练需要大量计算资源。七、本章心法总结【口诀】奖励模型学偏好PPO优化策略调。KL散度防偏离迭代训练效果高。【要点回顾】要点说明三阶段SFT → RM训练 → PPO优化奖励模型学习人类偏好输出奖励分数PPO近端策略优化稳定训练KL惩罚防止策略偏离太远实践技巧奖励模型规模、KL系数调整、迭代训练【下一章预告】下一章我们将学习DPO直接偏好优化一种更简单、更高效的对齐方法跳过奖励模型直接从偏好数据学习。