前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >【RLHF】想训练ChatGPT?先来看看强化学习(RL)+语言模型(LM)吧(附源码)

【RLHF】想训练ChatGPT?先来看看强化学习(RL)+语言模型(LM)吧(附源码)

作者头像
汀丶人工智能
发布于 2023-10-11 10:26:53
发布于 2023-10-11 10:26:53
82600
代码可运行
举报
文章被收录于专栏:NLP/KGNLP/KG
运行总次数:0
代码可运行

随着最近 ChatGPT 的大火,越来越多人开始关注其中用到的 RLHF(Reinforcement Learning from Human Feedback)这一核心思想。

使用强化学习(而非监督学习)的方式更新语言模型,最大的优势是在于能够使得「模型更加自由的探索更新方向,从而突破监督学习的性能天花板」。

关于为什么使用 RL 技术能够达到更好的效果,可以参考下面这个视频中的例子(6:30 秒处):

在今天这篇文章中,我们将通过一个示例来完成利用「强化学习」更新「语言模型」的任务。

1. 任务描述:利用 RL 训练一个好评生成器

我们设定一个任务目标:学习一个「好评生成器」。

模型接收一段 prompt,例如:刚收到货,感觉

随即,让模型将这段话补全,例如:有点不符合预期,货物很差

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
prompt: 刚收到货,感觉

output 1: 刚收到货,感觉 有 点 不 符 合 预 期 ,不 好
output 2: 刚收到货,感觉 挺 无 奈 的 送 货 速 度 不 太 行
...

在初始状态下,模型将没有任何偏好的生成答案,这意味着有可能生成一些差评(如上述例子)。

现在,我们将利用强化学习(PPO)的方式来对生成模型进行「好评生成」的训练。

每当模型生成一个句子,我们就给出一个相应的得分(reward),用于表征该条生成评论是否是「正向好评」,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
output 1: 刚收到货,感觉有 点 不 符 合 预 期 ,不 好                -> 0.2 分
output 2: 刚收到货,感觉有 挺 无 奈 的 送 货 速 度 不 太 行          -> 0.1 分
output 3: 刚收到货,感觉有 些 惊 喜 于 货 物 质 量                  -> 0.9...

随即,我们利用打出的 reward 对生成模型进行迭代。

整个流程如下图所示:

引入判别模型代替人工打分

如果依靠人工为每一个输出打分,这将是一个非常漫长的过程。

如果我们能找到一个判别模型:接收一个句子作为输入,输出这个句子是好评的概率。

那么我们就可以直接利用这个判别模型的输出作为生成句子的 reward。

因此,我们引入另一个「情绪识别模型」来模拟人工给出的分数。

「情绪识别模型」我们选用 transformers 中内置的 sentiment-analysis pipeline 来实现。

该模型基于网络评论数据集训练,能够对句子进行「正向、负向」的情绪判别,如下所示:

我们利用该「情感识别模型」的判别结果(0.0~1.0)作为 GPT 生成模型的 reward,以指导 GPT 模型通过强化学习(PPO)算法进行迭代更新。

2. 训练流程详解

2.1 生成采样(Rollout)

生成采样阶段的目的是为了让当前模型生成一些采样结果。

为了保证生成句子的多样性,我们设定了一个 prompt 池,模型会从中随机选择一个 prompt 来进行答案生成:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# prompt池
prompts = [
    '刚收到货,感觉',
    '这部电影很',
    '说实话,真的很',
    '这次购物总的来说体验很'
]
...

for _ in range(config['batch_size']):
        random_prompt = random.choice(prompts)                                  # 随机选择一个prompt
        tokens = gpt2_tokenizer.encode(random_prompt)
        batch['tokens'].append(tokens)
        batch['query'].append(random_prompt)
query_tensors = [torch.tensor(t).long().to(device) for t in batch["tokens"]]
...

for i in range(config['batch_size']):
    gen_len = config['gen_len']
    response = gpt2_model.generate(query_tensors[i].unsqueeze(dim=0),           # 利用当前选择的prompt生成句子
                                   max_new_tokens=gen_len, **gen_kwargs)
    response_tensors.append(response.squeeze()[-gen_len:])

这一步之后,我们将获得一堆模型的生成结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[
    '刚收到货,感觉 很 一 般',
    '这部电影很 俗 而 且 很 无 趣',
    '这次购物总的来说体验很 烂 不 是 我 想 要 的',
    ...
]

2.2 Reward 评估(Evaluation)

在获得了模型生成结果后,我们就可以利用「情感识别模型」进行打分了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 情绪识别模型初始化
senti_tokenizer = AutoTokenizer.from_pretrained('uer/roberta-base-finetuned-jd-binary-chinese')
senti_model = AutoModelForSequenceClassification.from_pretrained('uer/roberta-base-finetuned-jd-binary-chinese')
sentiment_pipe = pipeline('sentiment-analysis', model=senti_model, tokenizer=senti_tokenizer, device=pipe_device)
...


texts = [q + r for q,r in zip(batch['query'], batch['response'])]           # 将 prompt 和生成的 response 做拼接
pipe_outputs = sentiment_pipe(texts)                                        # 计算正向/负向情感得分

执行上述代码后,得到每个句子的 reward 得分:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[
    0.4,
    0.3,
    0.3,
    ...
]

2.3 模型迭代(Optimization)

模型迭代阶段我们会利用 PPO 进行模型参数的更新,更新代码只用一行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ppo_trainer.step(query_tensors, response_tensors, rewards)          # PPO Update

PPO 在更新时一共会计算 2 个 loss:pg_loss、value_loss:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
loss_p, loss_v, train_stats  = self.loss(logprobs, values, rewards, query, response, model_input)
loss = loss_p + loss_v
self.optimizer.zero_grad()
loss.backward()
self.optimizer.step()
...

pg_loss

pg_loss 是 PPO 中 actor 的 loss 函数,其通过 discount reward 和 importance ratio 来计算当前 step 的 reward 应该是多少:

losspg=Pπnew(token)Pπold(token)(r+γVnextVcurrent)

loss_{pg} = \frac{P_{\pi_{new}(token)}}{P_{\pi_{old}(token)}}(r + \gamma V_{next} - V_{current})

其中,importance ratio 是指产生同样的 token,在 active actor model 和 reference actor model 下的概率比值,这也是 PPO 模型中的 Importance Sampling 系数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for t in reversed(range(gen_len)):
    nextvalues = values[:, t + 1] if t < gen_len - 1 else 0.0
    delta = rewards[:, t] + self.ppo_params['gamma'] * nextvalues - values[:, t]          # 优势函数:r + Vnext - V
    lastgaelam = delta + self.ppo_params['gamma'] * self.ppo_params['lam'] * lastgaelam   # GAE, 用于平衡 bias 和 variance
    advantages_reversed.append(lastgaelam)
    advantages = torch.stack(advantages_reversed[::-1]).transpose(0, 1)

logits, _, vpred = self.model(model_input)                                  # 跑一遍模型,得到句子中每个token被选择的概率
logprob = logprobs_from_logits(logits[:,:-1,:], model_input[:, 1:])         # 将概率取log对数
ratio = torch.exp(logprob - old_logprobs)                                   # log相减,等同于概率相除
pg_losses = -advantages * ratio

value_loss

value_loss 是 PPO 中 critic 的 loss 函数,其目的在于评判每一个 token 被生成后的 value 是多少。

这是因为在 PPO 中需要有一个 critic 网络,为了实现这个效果,我们需要对 GPT 模型进行改造。

我们在 GPT 中加入一个 Value Head,用于将 hidden_size 向量映射到一个 1 维的 value 向量:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class GPT2HeadWithValueModel(GPT2PreTrainedModel):
    """The GPT2HeadWithValueModel class implements a GPT2 language model with a secondary, scalar head."""
    def __init__(self, config):
        super().__init__(config)
        config.num_labels = 1
        self.transformer = GPT2Model(config)
        self.lm_head = nn.Linear(config.n_embd, config.vocab_size, bias=False)
        self.v_head = ValueHead(config)                                       # 添加 Value Head
        self.init_weights()
    ...

class ValueHead(nn.Module):
    """The ValueHead class implements a head for GPT2 that returns a scalar for each output token."""
    
    def __init__(self, config):
        super().__init__()
        self.summary = nn.Linear(config.hidden_size, 1)                        # (hidden_size -> 1)
    ...

value_loss 就应该等于 Value Head 产生的预测值 v_pred 和真实值 r + v_next 之间的差值:

lossvalue=||Vpred(r+Vnext)||

loss_{value} = || V_{pred} - (r + V_{next}) ||

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
returns = advantages + values                      # r + v_next - v + v => r + v_next
logits, _, vpred = self.model(model_input)         # 跑一遍语言模型,得到每个 token 的 v_pred
vf_losses1 = (vpred - returns) ** 2                # MSE

3. 实验结果

训练曲线图如下所示,可以看到随着训练推进,模型的 reward 由最早的 0.68 -> 0.85 左右:

在模型刚开始训练的时候,GPT 会生成一些比较随机的答案,此时的平均 reward 也不会很高,会生成一些「负面」情绪的评论(如下所示):

随着训练,GPT 会慢慢学会偏向「正面」的情绪评论(如下所示):

完整源码在这里:

github.com/HarderThenHarder/transformers_tasks/tree/main/RLHF

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-08-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
推理大模型的后训练增强技术-强化学习篇
人生中充满选择,每次选择就是一次决策,我们正是从一次次决策中,把自己带领到人生的下一段旅程中。在回忆往事时,我们会对生命中某些时刻的决策印象深刻:“唉,当初我要是去那家公司实习就好了,在那里做的技术研究现在带来了巨大的社会价值。”通过这些反思,我们或许能领悟一些道理,变得更加睿智和成熟,以更积极的精神来迎接未来的选择和成长。
致Great
2025/03/10
1320
推理大模型的后训练增强技术-强化学习篇
【强化学习】Reward Model(奖励模型)详细介绍
Reward Model(奖励模型)是近年来在深度学习和强化学习领域广泛应用的一种技术,特别是在生成式模型(如大型语言模型)和强化学习(RL)结合的场景中,起到了至关重要的作用。它在多个领域的应用中,尤其是在自然语言处理(NLP)和数学推理领域,展现了显著的潜力。
不去幼儿园
2025/03/22
2280
【强化学习】Reward Model(奖励模型)详细介绍
强化学习系列(十)--基于大语言模型的RLHF
推荐文章:《Linux本地部署开源项目OpenHands基于AI的软件开发代理平台及公网访问》
languageX
2024/11/27
4930
GPT大语言模型引爆强化学习与语言生成模型的热潮、带你了解RLHF。
随着 ChatGPT 的爆火,强化学习(Reinforcement Learning)和语言生成模型(Language Model)的结合开始变得越来越受人关注。
汀丶人工智能
2023/10/11
4040
GPT大语言模型引爆强化学习与语言生成模型的热潮、带你了解RLHF。
RLHF-Safe RLHF:带着脚镣跳舞的PPO!
该模型同样经过多轮safe RLHF,模型名为Beaver-V1/V2/V3, 项目是开源的:
zenRRan
2023/12/20
4630
RLHF-Safe RLHF:带着脚镣跳舞的PPO!
对抗思想与强化学习的碰撞-SeqGAN模型原理和代码解析
1、背景 GAN作为生成模型的一种新型训练方法,通过discriminative model来指导generative model的训练,并在真实数据中取得了很好的效果。尽管如此,当目标是一个待生成的非连续性序列时,该方法就会表现出其局限性。非连续性序列生成,比如说文本生成,为什么单纯的使用GAN没有取得很好的效果呢?主要的屏障有两点: 1)在GAN中,Generator是通过随机抽样作为开始,然后根据模型的参数进行确定性的转化。通过generative model G的输出,discriminative
石晓文
2018/04/11
4.6K3
对抗思想与强化学习的碰撞-SeqGAN模型原理和代码解析
北大硕士RLHF实践,基于DeepSpeed-Chat成功训练上自己的模型
最近两月倒腾了一波RLHF,从ColossalAI到TRLX以及DeepSpeed-Chat,最后基于DeepSpeed-Chat成功训练上了自己的模型,最后效果也是肉眼可见的提升。对这一部分进行下总结,包括原理,代码以及踩坑与解决方案。
新智元
2023/09/09
1K0
北大硕士RLHF实践,基于DeepSpeed-Chat成功训练上自己的模型
大语言模型中的 RLHF:强化学习如何优化 AI 交互体验
近年来,大语言模型(Large Language Model, LLM)取得了突破性的进展,GPT-3、GPT-4 以及其他基于 Transformer 架构的模型在自然语言处理(NLP)任务中展现出卓越的性能。然而,尽管这些模型具备强大的生成能力,它们的输出仍然可能存在不符合人类期望的情况,比如生成误导性信息、带有偏见的内容,或者在对话中缺乏连贯性。
编程小妖女
2025/02/03
1080
大语言模型中的 RLHF:强化学习如何优化 AI 交互体验
大语言模型 RLHF 技术的深度解析:从理论到实践的范式革命
在人工智能领域,人类反馈强化学习(Reinforcement Learning from Human Feedback,RLHF)已成为大语言模型(Large Language Models)进化过程中最具突破性的技术之一。这项技术不仅重新定义了人机协作的边界,更在模型伦理对齐、输出可控性、应用场景扩展等维度展现出独特价值。本文将通过技术解构、案例分析和代码实现三个维度,深入揭示 RLHF 的核心机理与实践应用。
编程小妖女
2025/02/03
1670
大语言模型 RLHF 技术的深度解析:从理论到实践的范式革命
使用Huggingface创建大语言模型RLHF训练流程的完整教程
ChatGPT已经成为家喻户晓的名字,而大语言模型在ChatGPT刺激下也得到了快速发展,这使得我们可以基于这些技术来改进我们的业务。
deephub
2023/12/05
1.8K0
使用Huggingface创建大语言模型RLHF训练流程的完整教程
强化学习-PPO2
仍旧是玩平衡杆游戏,不过这次用了更为强大的PPO2,看完之后不经感叹里面的思想真的是太奇妙了!相较于朴素的策略网络,多了好多新的trick,不敢想象发明这个算法的人是有多聪明。
luxuantao
2021/02/24
1.3K0
用 RNN 训练语言模型生成文本
---- 本文结构: 什么是 Language Model? 怎么实现?怎么应用? ---- cs224d Day 8: 项目2-用 RNN 建立 Language Model 生成文本 课程项目描
杨熹
2018/04/02
1.2K0
用 RNN 训练语言模型生成文本
万字长文教你如何做出 ChatGPT
作者:monychen,腾讯 IEG 应用研究员 简单来说,ChatGPT 是自然语言处理(NLP)和强化学习(RL)的一次成功结合,考虑到读者可能只熟悉其中一个方向或者两个方向都不太熟悉,本文会将 ChatGPT 涉及到的所有知识点尽可能通俗易懂的方式展现出来,有基础的同学可以选择性跳过一些内容。 GPT 的进化史 本节的主要目的是介绍自然语言处理中语言模型的一些基础知识,理解语言模型到底在做什么。 GPT 所谓的 GPT(Generative Pre-trained Transformer),其实是 G
腾讯技术工程官方号
2023/02/17
2.9K0
万字长文教你如何做出 ChatGPT
详解TensorFlow 2.0新特性在深度强化学习中的应用
TensorFlow 2.0的特性公布已经有一段时间了,但很多人对此应当还是一头雾水。
深度强化学习实验室
2019/11/20
9000
coach 模块化最好的强化学习框架
add agent http://coach.nervanasys.com/contributing/add_agent/index.html class Agent(object): class PolicyOptimizationAgent(Agent): class ActorCriticAgent(PolicyOptimizationAgent): presets.py class Carla_A3C(Preset): def __init__(self): Preset._
CreateAMind
2018/07/20
3970
【RL Base】强化学习:信赖域策略优化(TRPO)算法
在强化学习(RL)领域,如何稳定地优化策略是一个核心挑战。2015 年,由 John Schulman 等人提出的信赖域策略优化(Trust Region Policy Optimization, TRPO)算法为这一问题提供了优雅的解决方案。TRPO 通过限制策略更新的幅度,避免了策略更新过大导致的不稳定问题,是强化学习中经典的策略优化方法之一。
不去幼儿园
2024/12/03
2380
【RL Base】强化学习:信赖域策略优化(TRPO)算法
详解深度强化学习展现TensorFlow 2.0新特性
自TensorFlow官方发布其2.0版本新性能以来,不少人可能对此会有些许困惑。因此博主Roman Ring写了一篇概述性的文章,通过实现深度强化学习算法来具体的展示了TensorFlow 2.0的特性。
刀刀老高
2019/05/15
6700
详解深度强化学习展现TensorFlow 2.0新特性
AI helps AI -- 强化学习从入门到入门
推荐文章:《使用Python实现深度学习模型:智能食品配送优化》,作者:【Echo_Wish】。
languageX
2024/11/17
5210
AI helps AI -- 强化学习从入门到入门
【RLHF】想训练ChatGPT?得先弄明白Reward Model怎么训(附源码)
在上一篇文章中,我们已经讲解了如何将强化学习(Reinforcement Learning)和语言模型(Language Model)做结合:
汀丶人工智能
2023/10/11
1.9K0
【RLHF】想训练ChatGPT?得先弄明白Reward Model怎么训(附源码)
[AI实践笔记]DeepSeek-RLHF:新一代高效强化学习对齐框架项目实践指南
2017年,OpenAI研究员Paul Christiano在《Deep Reinforcement Learning from Human Preferences》中首次系统提出RLHF框架。该研究突破性地解决了传统RL面临的奖励函数设计困境——在复杂任务(如机器人控制)中,工程师难以用数学公式精确描述"优质行为"的标准。实验显示,通过让人类标注员对智能体行为片段进行偏好排序(如图1),系统可自动学习奖励模型,最终训练出完成后空翻的仿真机器人。
数字扫地僧
2025/03/20
1400
[AI实践笔记]DeepSeek-RLHF:新一代高效强化学习对齐框架项目实践指南
推荐阅读
相关推荐
推理大模型的后训练增强技术-强化学习篇
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文