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

每天给你送来NLP技术干货!


作者简介

作者:何枝

原文:https://zhuanlan.zhihu.com/p/595116794

排版:关于NLP那些你不知道的事

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

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

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

ChatGPT是怎样被训练出来的?

https://www.zhihu.com/zvideo/1584941670507896832

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

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

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

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

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

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

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

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

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

output 1: 刚收到货,感觉有 点 不 符 合 预 期 ,不 好                -> 0.2 分
output 2: 刚收到货,感觉有 挺 无 奈 的 送 货 速 度 不 太 行          -> 0.1 分
output 3: 刚收到货,感觉有 些 惊 喜 于 货 物 质 量                  -> 0.9 分
...

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

整个流程如下图所示:

9416608a066eb909ab692617e13c3e9f.jpeg

基于 RL 的 LM 更新流程
引入判别模型代替人工打分

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

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

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

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

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

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

89a1023f3df9377b9a9e003c78846fff.jpeg

「情绪识别」模型

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

2. 训练流程详解

2.1 生成采样(Rollout)

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

785f9dc44e771948caa00a3865bfc51f.jpeg

生成采样示意图

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

# prompt池
prompts = ['刚收到货,感觉','这部电影很','说实话,真的很','这次购物总的来说体验很'
]
...for _ in range(config['batch_size']):random_prompt = random.choice(prompts)                                  # 随机选择一个prompttokens = 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:])

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

['刚收到货,感觉 很 一 般','这部电影很 俗 而 且 很 无 趣','这次购物总的来说体验很 烂 不 是 我 想 要 的',...
]

2.2 Reward 评估(Evaluation)

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

# 情绪识别模型初始化
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)  # 计算正向/负向情感得分

daa6ceed0656093412639bd065bc3d0a.jpeg

Reward 评估示意图

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

[0.4,0.3,0.3,...
]

2.3 模型迭代(Optimization)

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

ppo_trainer.step(query_tensors, response_tensors, rewards)  # PPO Update

3a37ea335e9f32f7e477de2a9e523075.jpeg

模型迭代示意图

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

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 应该是多少:

6808fa70d985d158f2b0cde89e40a29a.png

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

for t in reversed(range(gen_len)):nextvalues = values[:, t + 1] if t < gen_len - 1 else 0.0delta = rewards[:, t] + self.ppo_params['gamma'] * nextvalues - values[:, t]          # 优势函数:r + Vnext - Vlastgaelam = delta + self.ppo_params['gamma'] * self.ppo_params['lam'] * lastgaelam   # GAE, 用于平衡 bias 和 varianceadvantages_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 向量:

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 = 1self.transformer = GPT2Model(config)self.lm_head = nn.Linear(config.n_embd, config.vocab_size, bias=False)self.v_head = ValueHead(config)                                       # 添加 Value Headself.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 之间的差值:

2b5e3c6aba17c324a7d43907f4479da0.png

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 左右:

880f5072d88c726b5fdcf8870ae7f1bc.jpeg

训练曲线图

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

ea35b5635be871d8c8118585826d72b8.jpeg

训练初期模型的生成结果

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

ebd4a225926a97451548db401a2ff120.jpeg

训练后期模型的生成结果

好啦,以上就是 RLHF 的全部内容,感谢观看。

完整源码在这里:

RLHF 复现代码

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

最近文章

深入理解Pytorch中的分布式训练


点击这里进群—>加入NLP交流群

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/12226.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

真假李逵!你不是CHATGPT吗?

感觉这个VIP买的真是呵呵。。。。。

ChatGPT专业应用:日报速成器

正文共 337字&#xff0c;阅读大约需要 1 分钟 职场人士必备技巧&#xff0c;您将在1分钟后获得以下超能力&#xff1a; 日报速成 Beezy评级 &#xff1a;B级 *经过简单的寻找&#xff0c; 大部分人能立刻掌握。主要节省时间。 推荐人 | 圆圆子 编辑者 | Ramy 每日还在为日…

中科院学术专用版 ChatGPT,开源了!

公众号关注 “GitHubDaily” 设为 “星标”&#xff0c;每天带你逛 GitHub&#xff01; 周末的时候&#xff0c;一位开发者将名为「ChatGPT Academic」的项目开源至 GitHub。 仅用了短短一两天&#xff0c;该项目 Star 数便增长到了 1800&#xff0c;成为 GitHub 上又一个基于 …

玩转GPT--在线文本生成项目[可入坑~科普系列]

文章目录 前言效果页面说明文字个数top_KTop_Ptemperature聊天上下文关联记忆 项目部署获取项目获取模型运行 彩蛋总结 前言 没办法&#xff0c;最近ChatGPT杀疯了&#xff0c;没忍住&#xff0c;还是想look&#xff0c;look。没办法&#xff0c;哪个帅小伙能够忍受的了一个可…

硅谷大佬逃离谷歌发长文控诉:公司已迷失方向,员工被困在系统里

来源丨机器之心 从大厂离职&#xff0c;然后写小作文&#xff0c;似乎已经成为了一种新的流行趋势。 近日&#xff0c;AppSheet 创始人 Praveen Seshadri 宣布离开谷歌。在一篇题为《Google 出了什么问题》的 Medium 长博客中&#xff0c;Seshadri 对谷歌的未来发展做出了严峻的…

谷歌打响全面反击战!全新 PaLM 2反超GPT-4,朝着ChatGPT微软开炮

源 | 量子位 万众瞩目&#xff0c;谷歌的反击来了。 现在&#xff0c;谷歌搜索终于要加入AI对话功能了&#xff0c;排队通道已经开放。 当然这还只是第一步。 大的还在后面&#xff1a; 全新大语言模型PaLM 2正式亮相&#xff0c;谷歌声称它在部分任务超越GPT-4。 Bard能力大更…

最新ChatGPT GPT-4 NLU应用之实体分类识别与模型微调(附ipynb与python源码及视频)——开源DataWhale发布入门ChatGPT技术新手从0到1必备使用指南手册(六)

目录 前言最新ChatGPT GPT-4 自然语言理解NLU实战之实体分类识别与模型微调主题分类精准分类解决手段模型微调步骤核心代码 其它NLU应用及实战相关文献 参考资料其它资料下载 前言 想象一下&#xff0c;如果您也可以训练一个为特定场景和目的量身打造的大型自然语言模型&#…

斯坦福大学打响 ChatGPT 反击战,阻止学生用 AI 写作业

整理 | 朱珂欣 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 自 OpenAI 于 2022 年 11 月发布 ChatGPT 以来&#xff0c; ChatGPT 可谓是风靡各个领域&#xff1a;修bug、写代码、写周报、绘画、写小说……不仅如此&#xff0c;ChatGPT 也没“放过”教育圈&a…

研究成果将会开源!复旦MOSS团队深度访谈来了

来自&#xff1a;复旦大学 由美国OpenAI公司开发的ChatGPT模型在全球点燃了新一轮AI革命&#xff0c;海内外关注度陡增。前不久&#xff0c;复旦大学计算机科学技术学院邱锡鹏团队发布类ChatGPT模型MOSS&#xff0c;新闻迅速登上微博热搜。 MOSS“火”了。2月20日发布当天就收到…

AIGC的发展与机遇

陈老老老板&#x1f9b8; &#x1f468;‍&#x1f4bb;本文专栏&#xff1a;赠书活动专栏&#xff08;为大家争取的福利&#xff0c;免费送书&#xff09;试一下文末赠书&#xff0c;讲一些科普类的知识 &#x1f468;‍&#x1f4bb;本文简述&#xff1a;本篇内容的引用都已征…

自然语言处理数据增强魔法书:轻松解锁NLP技巧与方法

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

好物周刊#1:提示工程师养成指南

不要哀求&#xff0c;学会争取。若是如此&#xff0c;终有所获。 &#x1f388; 项目 ddrun 后端采用 midway3.0&#xff0c;后台采用 nuxt2.x&#xff0c;小程序采用 uniapp 实现的一套跑腿下单接单系统。 适用于校园、社区、城市等场景&#xff0c;可提供打印服务、跑腿服…

它如何做到让我们持久且不感疲劳

写在前面 随着科技的进步和数字化生活的兴起&#xff0c;人们长时间使用显示器的需求增加&#xff0c;越来越多的人戴眼镜并且面临眼睛问题。显示器屏幕灯在当今社会也逐渐扮演着不可或缺的角色。 首先&#xff0c;显示器屏幕灯能够提供必要的亮度&#xff0c;确保我们在各种…

打不过就拉拢!ChatGPT和MidJourney已经成我小秘书!太爽了

大家好&#xff0c;我是晓衡。 这两周&#xff0c;我战斗力爆棚了&#xff01;每天大概睡了四~五个小时&#xff0c;而且中午也没有休息过&#xff0c;但精神却还很亢奋。 直到周一下午&#xff0c;身体才有种被掏空的感觉&#xff0c;晚上 10 点就睡了。可能是兴奋劲还在&…

最强组合HuggingFace+ChatGPT=「贾维斯」现在开放demo了!

来源&#xff1a;新智元 前段时间&#xff0c;浙大&微软发布了一个大模型协作系统HuggingGPT直接爆火。 研究者提出了用ChatGPT作为控制器&#xff0c;连接HuggingFace社区中的各种AI模型&#xff0c;完成多模态复杂任务。 整个过程&#xff0c;只需要做的是&#xff1a;用…

【ChatGPT实战】13.使用ChatGPT帮你搞定房屋装修

房屋装修是一项既令人兴奋又令人操劳的事情。随着人工智能技术的不断发展&#xff0c;在房屋设计方面我们可以借助ChatGPT和Midjourney这两个工具来更好地设计你的房屋装修。 在这篇文章中&#xff0c;我们将介绍如何使用ChatGPT和Midjourney这两个工具&#xff0c;来帮助你轻…

ChatGPT赋能Scrum实践

对于Scrum实践者来说&#xff0c;以ChatGPT为代表的的大语言模型是很有效的工具&#xff0c;但要用好这个工具需要一些技巧&#xff0c;本文介绍了60个适用于Scrum实践的提示&#xff0c;可以帮助ChatGPT有效输出适用于Scrum实践的内容。原文: 60 ChatGPT Prompts Plus Prompt …

人工智能的新时代:讯飞星火大模型Vs ChatGPT

近日&#xff0c;科大讯飞召开了星火认知大模型成果发布会&#xff0c;会上表示讯飞星火大模型将突破开放式问答&#xff0c;对标ChatGPT&#xff0c;在中文能力上超过ChatGPT&#xff0c;在英文能力上与ChatGPT相当。对此&#xff0c;你怎么看&#xff1f; 一、你有使用过这种…

5620亿参数,最大多模态模型控制机器人,谷歌把具身智能玩出新高度

关注并星标 从此不迷路 计算机视觉研究院 公众号ID&#xff5c;ComputerVisionGzq 学习群&#xff5c;扫码在主页获取加入方式 计算机视觉研究院专栏 作者&#xff1a;Edison_G 机器人越来越像人了&#xff01;谷歌等的这项研究将现实世界的信息通过传感器纳入多模态语言模型&a…

终结者最强大脑!谷歌发布史上最大「通才」模型PaLM-E,5620亿参数,看图说话还能操控机器人...

新智元报道 本文转载自新智元。 谷歌近日公布了一个炸弹级「通才」模型PaLM-E&#xff0c;足足有5620亿参数。它是一种多模态具身视觉语言模型&#xff0c;从引导机器人执行任务&#xff0c;到回答关于可观察世界的问题&#xff0c;全都能搞定。 大语言模型的飞速「变异」&am…