ChatGPT中的强化学习:从零开始理解RLHF技术原理

1次阅读
没有评论

共计 2039 个字符,预计需要花费 6 分钟才能阅读完成。

image.webp

为什么 ChatGPT 需要强化学习?

传统的语言模型训练主要依赖监督学习(Supervised Learning),即给模型输入文本,让它预测下一个词。这种方法虽然简单直接,但在生成连贯、有用且符合人类偏好的对话时存在明显局限:

ChatGPT 中的强化学习:从零开始理解 RLHF 技术原理

  • 监督学习只能模仿现有数据,无法主动优化对话策略
  • 人类对文本质量的评判标准(如趣味性、安全性)难以通过简单标签表达
  • 模型容易生成看似合理但实际无用的内容(如 ” 作为 AI 我无法回答这个问题 ”)

RLHF(Reinforcement Learning from Human Feedback)通过三个关键改进解决了这些问题:

  1. 引入人类偏好数据训练奖励模型,量化文本质量
  2. 使用强化学习持续优化生成策略
  3. 通过 PPO 算法平衡探索与利用

RLHF 技术架构详解

三阶段训练流程

典型的 RLHF 实现包含三个阶段:

  1. 监督微调(SFT)
  2. 在高质量对话数据集上微调基础语言模型
  3. 目标:获得具备基本对话能力的基线模型

  4. 奖励模型训练

  5. 收集人类对多组回复的偏好排序数据
  6. 训练一个能预测人类偏好的神经网络(奖励模型)
  7. 关键点:使用 Bradley-Terry 模型构建损失函数

  8. 强化学习优化

  9. 用奖励模型作为环境反馈
  10. 使用 PPO 算法优化语言模型策略
  11. 特殊处理:将段落级奖励分配到每个 token
graph TD
    A[初始语言模型] -->| 监督学习 | B[SFT 模型]
    B -->| 生成对比样本 | C[人类标注]
    C --> D[奖励模型]
    B -->| 初始策略 | E[PPO 优化]
    D -->| 提供奖励 | E
    E --> F[最终 ChatGPT]

PPO 算法的语言生成适配

在文本生成任务中,PPO 需要特殊处理:

  1. Credit Assignment 问题
  2. 整句奖励需要合理分配到每个生成 token
  3. 解决方案:使用折扣累积奖励

  4. KL 散度约束

  5. 防止策略偏离原始 SFT 模型太远
  6. 实现方式:在目标函数中添加 KL 惩罚项

  7. 序列生成特性

  8. 每个时间步的动作空间是整个词表
  9. 需要处理超大的离散动作空间

代码实战:简化版奖励模型

import torch
import torch.nn as nn

class RewardModel(nn.Module):
    """
    基于 BERT 的奖励模型实现
    输入:文本对 (response_A, response_B)
    输出:人类偏好概率
    """
    def __init__(self, base_model):
        super().__init__()
        self.encoder = base_model
        self.head = nn.Linear(base_model.config.hidden_size, 1)

    def forward(self, input_ids, attention_mask):
        # 获取句向量 [batch, hidden_dim]
        outputs = self.encoder(input_ids, attention_mask)
        pooled = outputs.last_hidden_state[:, 0]  # CLS token

        # 计算标量奖励值
        return self.head(pooled)

# 关键训练代码
def train_step(batch):
    # batch 包含胜败样本对
    win_ids, win_mask = batch["winner"]
    lose_ids, lose_mask = batch["loser"]

    # 计算奖励差值
    r_win = model(win_ids, win_mask)
    r_lose = model(lose_ids, lose_mask)
    diff = r_win - r_lose

    # Bradley-Terry 损失
    loss = -torch.log(torch.sigmoid(diff)).mean()

    # 添加 L2 正则防止过拟合
    l2_reg = sum(p.pow(2).sum() for p in model.parameters())
    loss += 0.01 * l2_reg

    return loss

实战避坑指南

奖励模型过拟合检测

  • 监控验证集准确率与训练集的差距
  • 检查在对抗样本上的表现(如无意义但流畅的文本)
  • 使用早停(early stopping)策略

稀疏奖励处理

  1. 奖励塑形(Reward Shaping)
  2. 添加中间奖励(如连贯性评分)
  3. 使用课程学习(Curriculum Learning)

  4. 探索策略

  5. 在 PPO 中调高初始熵系数
  6. 采用 top- p 采样增加多样性

分布式训练同步

  • 使用 Ring-AllReduce 进行梯度聚合
  • 同步频率与 batch size 的权衡
  • 混合精度训练注意事项

开放性问题思考

  1. 多维度奖励设计如何平衡不同指标(如相关性、安全性、趣味性)之间的冲突?
  2. 在线学习能持续优化模型,但如何控制风险?离线 RL 是否更适合生产环境?
  3. 当模型安全性要求与训练效率发生矛盾时,哪些折中方案最有效?

写在最后

实现一个可用的 RLHF 系统远比理论推导复杂。在实际项目中,我们花了大量时间调试奖励模型的偏差问题——发现当标注员倾向于给较长回复高分时,模型学会了无意义的啰嗦。最终通过设计长度归一化奖励才解决这个问题。这也印证了 RLHF 的核心挑战:如何让人工反馈准确传导到模型行为。期待看到更多关于人类偏好建模的创新研究!

正文完
 0
评论(没有评论)