ChatGPT 中的人类反馈强化学习 (RLHF) 实战,看这篇就够了

本文详细介绍了ChatGPT中的人类反馈强化学习(RLHF),包括奖励模型(RM)和近端策略优化算法(PPO)。RM通过人工反馈对SFT Model的回答进行打分,PPO则利用RM提供的奖励信号进行策略优化,以生成更符合人类偏好的回答。RLHF训练流程包含奖励模型训练和强化学习调优两个阶段,但实际操作中因资源限制并未在大规模数据集上完整训练。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


团队博客: CSDN AI小组


相关阅读


1 前言

在当今数字化的时代,ChatGPT 的火热程度不断升级。ChatGPT 可以处理复杂的语言任务,从而解放人力资源,提高工作效率,减少成本。ChatGPT 的先进技术和广泛应用,使得它成为了当今最炙手可热的人工智能技术之一。无论是企业、学术机构,还是科技爱好者,都对 ChatGPT 的应用前景充满期待。

在这样的背景之下,CSDN AI 团队也想对 ChatGPT 进行简单的复现。根据ChatGPT官方博客可知,ChatGPT的训练方法与 InstructGPT 的训练方法基本一致 (如图1所示),只是使用的数据集不一样。故在训练方法上,我们主要参考 InstructGPT 进行复现,基础模型使用的是 RWKV,拆分后共包含以下四个阶段:

  • (1) 语言模型预训练 (Language Model Pre-training);
  • (2) 有监督指令微调 (Supervised Fine-Tuning, SFT);
  • (3) 奖励模型的训练 (Reward Modeling, RM);
  • (4) 使用近端策略优化算法进行强化学习 (Proximal Policy Optimization, PPO).

第 (1)、(2) 阶段的 Pre-training 和 SFT 由 @zxm2015 完成,可参考文章大语言模型浅探一。本文主要介绍第 (3)、(4) 阶段的内容,即人类反馈强化学习 (Reinforcement Learning from Human Feedback, RLHF)。

在这里插入图片描述

图1 InstructGPT 模型的训练过程

2 人类反馈强化学习 (RLHF)

人类反馈强化学习 (RLHF) 是 ChatGPT 中一种用于改善其回答效果的算法。它是一种基于强化学习的方法,通过结合人类反馈来优化 ChatGPT 的回答。

在 RLHF 中,ChatGPT 学习通过和人类用户的交互来提高其回答的质量。当 ChatGPT 生成一个回答时,它会将回答展示给用户并请求用户的反馈。用户可以对回答进行评分,比如“好”、“不错”、“一般”、“差”等。ChatGPT 会将用户的反馈作为奖励或惩罚信号,以此来更新自己的模型,以更好地满足用户的需求。

RLHF 可分为两个部分。第一部分是奖励模型,人类反馈主要就体现在这个地方;第二部分采用近端策略优化算法的强化学习阶段,基于奖励模型的反馈来优化模型,最终得到满足人类偏好的语言模型。下面将对这两个部分进行详细的说明。

2.1 奖励模型 (RM)

在 RLHF 之前,语言模型已经进行了 SFT (后续称该模型为 SFT Model),而奖励模型的任务主要是对 SFT Model 的回复进行打分,打分越高表示回答效果越好。训练好奖励模型之后,就可以用于下一阶段的 PPO 进行强化学习的调优,奖励模型是 PPO 中的一个子部分,用于 PPO 训练时提供奖励信号。

(1) 模型的输入输出
模型的输入是用户提问 (Prompt) 和 SFT Model 回复 (Response) 的 pair 对 <Prompt, Response>,输出是一个奖励得分,如下图所示:

在这里插入图片描述

图2 RM 的输入和输出

(2) 数据集的构建
这个阶段主要是通过人工标注训练数据,来训练 RM,人类反馈就体现在这个地方。在 Prompts 数据集中随机抽取问题,对于每个问题,生成 K 个不同的回答。人类标注者对这些结果综合考虑(例如:相关性、富含信息性、有害信息等诸多标准)给出排名顺序。

按照上述奖励模型的输入输出描述,构建数据集时应该是人工对 <Prompt, Response> 进行打分,但实际上对多个回答进行打分比较困难,得分是连续的,这会降低标注的速度。此外,我们其实关注的是多个选项之间哪个更好,哪个更差。所以标注的时候对多个选项进行排序就可以了,最后基于排序后的回答,构建数据集,选用合适的损失函数即可。

通常情况下,人类进行排序任务,当选项为 4-9 个 (即 K∈{4, 5, 6, 7, 8, 9}) 时速度最快且效果最准确,此处我们设定 K=4。最终一个 Prompt 我们就可以得到 C(4, 2)=6 条训练样本。

具体而言,假设我们选定了一个问题 x,接着使用 SFT Model 生成了 4 个回答 {y1, y2, y3, y4},人类标注者进行排序后为 y4 > y3 > y1 > y2},则得到的训练样本如下所示,左边<Prompt, Response>的得分要高于右边:

(<x, y4>, <x, y3>)
(<x, y4>, <x, y1>)
(<x, y4>, <x, y2>)
(<x, y3>, <x, y1>)
(<x, y3>, <x, y2>)
(<x, y1>, <x, y2>)

(3) 损失函数
根据上面构建的数据集可知,我们没有连续的得分目标去训练奖励模型,但是有正负例样本对,所以损失函数如下所示,该损失函数需要最小化:
在这里插入图片描述
其中,r(x,y) 为 <x, y> 输入到 RM 模型的得分,θ 是 RM 的参数,yw 和 yl 是输入为 x 时,SFT Model 生成的不同回答,其中人工标注时 yw > yl.

# loss function
def loss_function(prefer_reward, alter_reward):
    return -torch.mean(torch.log(torch.sigmoid(prefer_reward - alter_reward)))

(4) 核心代码
RM 的网络结构相比于 SFT Model,并不需要做太大的改动,输入 <Prompt, Response> 后,直接取最后一个 token 的 embedding,在其后面接一个线性层计算奖励得分即可

a) 线性层:

# reward 得分计算
self.pred_reward = nn.Linear(dim, 1, bias=False)

b) forword 函数

    def forward(
        self,
        x,
        mask = None,
        prompt_mask = None,
        prompt_lengths = None
    ):

        # prompt_mask 和 prompt_lengths 只能二选一
        assert not (exists(prompt_mask) and exists(prompt_lengths))

        # derive prompt mask from prompt lengths
        if exists(prompt_lengths):
            batch, seq_len = x.shape
            arange = torch.arange(seq_len, device=x.device)
            prompt_mask = repeat(arange, 'n -> b n', b = batch) < rearrange(prompt_lengths, 'b -> b 1')

        # reward model should have an understanding of which section is prompt, and which section is response
        # 根据 prompt_mask 中 token 的 Tr
### 人类反馈强化学习 (RLHF) 的概念 人类反馈强化学习(RLHF),作为一种创新性的机器学习方法,融合了强化学习(Reinforcement Learning, RL)与来自人类专家的直接反馈。这种方法旨在通过引入外部的人类监督来改进智能体(agent)的学习效率和效果,在处理复杂任务时尤为有效[^1]。 ### RLHF的工作原理 在RLHF框架下,整个学习流程被划分为几个关键阶段: - **预训练**:首先采用大规模无标注数据集对语言模型进行初步训练,使模型具备基本的语言理解和生成能力。 - **奖励模型构建**:接着收集由真实用户提供的对话样本,并邀请人工评估者针对每一对话给出评分;随后以此为基础建立专门用于衡量回复质量高低的奖励函数或称为偏好模型(preference model)[^2]。 - **强化学习微调**:最后一步则是借助上述获得的奖励信号作为指导,运用PPO(Policy Gradient with Proximal Policy Optimization)等算法进一步优化初始预训练得到的大规模语言模型参数配置,从而实现性能提升的目的[^3]。 ```python import torch.nn as nn from transformers import AutoModelForCausalLM, Trainer, TrainingArguments class RewardModel(nn.Module): def __init__(self, base_model_name="gpt2"): super().__init__() self.base_model = AutoModelForCausalLM.from_pretrained(base_model_name) def forward(self, input_ids, attention_mask=None): outputs = self.base_model(input_ids=input_ids, attention_mask=attention_mask) logits = outputs.logits[:, -1, :] return logits def train_reward_model(training_data_path="./data/reward_training.jsonl", output_dir="./results/"): training_args = TrainingArguments( per_device_train_batch_size=8, num_train_epochs=3, logging_steps=10, save_strategy='epoch', output_dir=output_dir ) trainer = Trainer( model=RewardModel(), args=training_args, data_collator=data_collator, tokenizer=tokenizer, compute_metrics=compute_metrics_function ) trainer.train() ``` 这段Python代码展示了如何定义一个简单的基于Transformer架构的奖励模型以及对其进行训练的过程。实际应用中可能还需要考虑更多细节和技术调整以适应具体场景需求。 ### RLHF的应用实例 RLHF已被广泛应用于自然语言处理领域内的多个方面,比如聊天机器人(chatbot)开发、自动问答系统(Q&A system)建设等方面。特别是对于像ChatGPT这样的大型预训练语言模型而言,通过融入人类反馈机制能显著改善其交互体验和服务质量,使得机器的回答更加贴近用户的期望并具有更高的实用价值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值