大模型修炼秘籍 第十二章:人师指路——RLHF之精髓

第十二章:人师指路------RLHF之精髓

人师指路RLHF,人类偏好学真经。

【本章导读】

RLHF(Reinforcement 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))

【代码示例】

python 复制代码
import torch
import torch.nn as nn

class RewardModel(nn.Module):
    def __init__(self, base_model):
        super().__init__()
        self.base_model = base_model
        self.reward_head = nn.Linear(hidden_size, 1)
    
    def forward(self, input_ids, attention_mask):
        # 获取模型输出
        outputs = self.base_model(input_ids, attention_mask=attention_mask)
        # 取最后一个token的隐藏状态
        last_hidden = outputs.last_hidden_state[:, -1, :]
        # 计算奖励分数
        reward = self.reward_head(last_hidden)
        return reward

def compute_loss(reward_model, chosen_ids, rejected_ids, attention_mask):
    # 计算chosen和rejected的奖励
    reward_chosen = reward_model(chosen_ids, attention_mask)
    reward_rejected = reward_model(rejected_ids, attention_mask)
    
    # Bradley-Terry模型
    loss = -torch.log(torch.sigmoid(reward_chosen - reward_rejected))
    return loss.mean()

四、阶段三:PPO强化学习

【PPO心法】

PPO(Proximal Policy Optimization,近端策略优化)是强化学习的核心算法。它让模型在奖励模型的指导下,逐步优化生成策略。

【PPO原理】

PPO的核心思想:在优化策略时,不要偏离太远,保持稳定。

复制代码
原始策略: π_old
新策略: π_new

约束: π_new 不要偏离 π_old 太多

【PPO目标函数】

LCLIP=E[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)]LCLIP=E[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散度惩罚:

Ltotal=LCLIP−β⋅KL(πθ∣∣πref)L_{total} = L^{CLIP} - \beta \cdot KL(\pi_\theta || \pi_{ref})Ltotal=LCLIP−β⋅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. 重复以上步骤                                             │
│                                                             │
└─────────────────────────────────────────────────────────────┘

【代码框架】

python 复制代码
from transformers import AutoModelForCausalLM
import torch.optim as optim

class PPOTrainer:
    def __init__(self, policy_model, reward_model, ref_model, config):
        self.policy = policy_model
        self.reward_model = reward_model
        self.ref_model = ref_model  # 参考模型(冻结)
        self.optimizer = optim.Adam(self.policy.parameters(), lr=config.lr)
        self.kl_coef = config.kl_coef
        self.clip_range = config.clip_range
    
    def compute_reward(self, prompts, responses):
        """计算奖励"""
        inputs = self.reward_model.encode(prompts, responses)
        with torch.no_grad():
            rewards = self.reward_model(**inputs)
        return rewards
    
    def compute_kl(self, prompts, responses):
        """计算KL散度"""
        policy_logprobs = self.policy.log_prob(prompts, responses)
        ref_logprobs = self.ref_model.log_prob(prompts, responses)
        kl = (policy_logprobs - ref_logprobs).mean()
        return kl
    
    def train_step(self, prompts):
        # 生成回答
        responses = self.policy.generate(prompts)
        
        # 计算奖励
        rewards = self.compute_reward(prompts, responses)
        
        # 计算KL散度
        kl = self.compute_kl(prompts, responses)
        
        # 计算PPO损失
        # ... (简化)
        ppo_loss = -rewards.mean() + self.kl_coef * kl
        
        # 更新
        self.optimizer.zero_grad()
        ppo_loss.backward()
        self.optimizer.step()
        
        return ppo_loss.item()

五、RLHF的实践技巧

【技巧一:奖励模型规模】

奖励模型通常比策略模型小:

策略模型 奖励模型
7B 350M - 1B
70B 7B
175B 6B

【技巧二:KL系数调整】

KL系数 β\betaβ 需要动态调整:

  • β\betaβ 太大:学习太慢
  • β\betaβ 太小:策略可能崩溃

【技巧三:奖励塑形】

可以在奖励中加入额外约束:

Rtotal=RRM+λ1Rsafety+λ2RhelpfulnessR_{total} = R_{RM} + \lambda_1 R_{safety} + \lambda_2 R_{helpfulness}Rtotal=RRM+λ1Rsafety+λ2Rhelpfulness

【技巧四:迭代式RLHF】

复制代码
第一轮: 收集偏好 → 训练RM → PPO优化
    ↓
第二轮: 用新模型收集更多偏好 → 更新RM → 再次PPO
    ↓
...持续迭代

六、RLHF的局限性

【局限一:人类偏好不一致】

不同标注员可能有不同偏好,导致奖励模型学习到噪声。

【局限二:奖励模型过拟合】

奖励模型可能在训练数据上过拟合,泛化能力不足。

【局限三:奖励欺骗】

模型可能学会生成"讨好"奖励模型但不真正有用的回答。

【局限四:计算成本高】

PPO训练需要大量计算资源。


七、本章心法总结

【口诀】

奖励模型学偏好,PPO优化策略调。

KL散度防偏离,迭代训练效果高。

【要点回顾】

要点 说明
三阶段 SFT → RM训练 → PPO优化
奖励模型 学习人类偏好,输出奖励分数
PPO 近端策略优化,稳定训练
KL惩罚 防止策略偏离太远
实践技巧 奖励模型规模、KL系数调整、迭代训练

【下一章预告】

下一章,我们将学习DPO(直接偏好优化),一种更简单、更高效的对齐方法,跳过奖励模型,直接从偏好数据学习。

相关推荐
tiger从容淡定是人生3 分钟前
Vibe Coding——中国信创生态真正的“超级加速器”
大数据·人工智能·vibe coding·信创战略
叶沧ii大数据全栈呀4 分钟前
【数据智能】从“提需求等排期“到“数据追着人跑“:数据中台到Data Agent的变革复盘
大数据·人工智能·ai编程
2601_957190904 分钟前
超元力元宇宙科幻乐园整馆方案——数字科技重塑文旅研学新生态
大数据·人工智能·科技
tanis_20776 分钟前
PDF 解析后输出什么格式?MinerU 五类下游场景的选型指南
人工智能·pdf·csdn开发云
美摄科技6 分钟前
GAN美颜SDK技术方案,用AI重新定义 “真实”!
人工智能·神经网络·生成对抗网络
互联网推荐官6 分钟前
上海软件定制开发技术路径深度拆解:架构选型、工程落地与平台能力实测
人工智能·软件工程
水上冰石7 分钟前
2026主流大模型编程工具及对比
人工智能
红色星际11 分钟前
东软睿驰以安全开放的软件底座,加速AI Agent规模化上车
人工智能·安全
call me by ur name11 分钟前
多模态大模型轻量化
前端·网络·人工智能
北京阿法龙科技有限公司11 分钟前
真AR 眼镜 + AI 识别:重塑公安一线实战的智能天眼
人工智能·ar