ChatGPT 中的人类反馈强化学习 (RLHF) 实战

目录

  • 1 前言
  • 2 人类反馈强化学习 (RLHF)
    • 2.1 奖励模型 (RM)
    • 2.2 近端策略优化算法 (PPO)
  • 3 总结
  • 4 参考


团队博客: CSDN AI小组


相关阅读

  • ChatGPT 简介
  • 大语言模型浅探一
  • 关于 ChatGPT 必看的 10 篇论文
  • 从 ELMo 到 ChatGPT:历数 NLP 近 5 年必看大模型

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 lengthsif exists(prompt_lengths):batch, seq_len = x.shapearange = 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 的 True 和 False,从 prompt_embed 或 response_embed 中取值# 如果为 True,则从 prompt_embed 中选,否则从 response_embed 中选prompt_response_mask_embed = torch.stack([self.prompt_embed,self.response_embed,self.padding_embed]).to(prompt_mask.device)extra_embed = Noneif exists(prompt_mask):extra_embed = prompt_response_mask_embed[prompt_mask]            # 获得最后一个 token 的 embeddinglast_token_embeds = self.rwkv(x,extra_embed=extra_embed,rm_train=True)[:, -1, :]# 计算奖励reward = self.pred_reward(last_token_embeds)reward = reward.squeeze(-1)return reward

c) train_forward 函数

    def train_forward(self, x_p, x_a, m_p, m_a):# 因为前向传播的时候,需要过两次模型。所以反馈的时候需要冻结其中一次的参数# 不然梯度会被计算两次,在包含 deepspeed 框架下会报错# 报错信息:Gradient computed twice for this partition.with torch.enable_grad():prefer_reward = self.forward(x_p, prompt_mask=m_p)with torch.no_grad():alter_reward = self.forward(x_a, prompt_mask=m_a)return prefer_reward, alter_reward

2.2 近端策略优化算法 (PPO)

近端策略优化算法(Proximal Policy Optimization, PPO)是一种深度强化学习算法,其目标是学习一个能够最大化长期累积回报的策略。

在这里插入图片描述

图3 PPO 训练架构详细版本

(1) PPO算法包含以下几个主要部分:

  • a) 策略网络 (Policy Network)
    用于学习并输出给定状态下不同行动的概率分布。它通常是一个神经网络,可以根据环境的反馈进行更新。对应图3中的 Actor,使用 SFT Model 进行初始化,在 PPO 中需要参与训练。

  • b) 价值网络 (Value Network)
    用于预测给定状态的预期回报值。它通常也是一个神经网络,它的输出可以用来计算优势函数,从而帮助更新策略网络。对应图3中的 Critic,使用 RM 进行初始化,在 PPO 中需要参与训练。

  • c) 奖励模型
    对应图3中的 Reward Model,是 2.1 节中训练得到的模型,在 PPO 中不参与训练,只提供奖励信号,用于 PPO 的训练。

  • d) SFT Model
    对应图3中的 Supervised Fine-Tune Model,用于更新策略网络,以使其能够产生更好的策略。通过限制每次更新的幅度,从而确保更新后的策略与原始策略之间的差异不会太大。该部分可以参与训练,也可以不参与,当参与训练时,PPO 被称为 PPO-ptx。

  • e) 经验采样
    用于收集与环境交互的经验数据,以供策略网络和价值网络的更新使用。在PPO算法中,经验采样通常采用基于行动价值估计的策略。对应图3中顶部的 Prompts -> Actor -> Response 流程。

在这里插入图片描述

图4 PPO 训练架构简化版本

(2)损失函数

  • a) actor loss (也称为 policy loss, 是最终要使用模型的 loss)
    在这里插入图片描述
    其中,πRL 是 actor,πSFT 是已经训练好的 SFT Model。损失函数的第1项和第2项是核心部分,第3项是可选项。该损失函数需要最大化。具体如下:
    • 第一项:这一项是奖励模型 RM 奖励得分,奖励需要最大化;
    • 第二项:这一项被用于惩罚 RL 策略在每个训练批次中生成大幅偏离初始模型,以确保模型输出合理连贯的文本。如果去掉这一惩罚项可能导致模型在优化中生成乱码文本来愚弄奖励模型提供高奖励值;
    • 第三项:这一项是预训练梯度 (可选项),传统的 PPO 中一般不包含该项,InstructGPT 中加入这一项是为了避免 RLHF 导致大模型在公开的 NLP 评测任务上效果下降。加入该项之后被命名为 PPO-ptx。
  • b) critic loss (也称为 value loss)
    使用的是 clipped_value_loss。

(3)核心代码
a) training_step

    def training_step(self, batch, batch_idx, optimizer_idx):sequences, \prompt_masks, \masks, \old_action_probs, \old_log_probs, \rewards, \old_values = batch# PPO trainingaction_masks = ~prompt_masks & masksaction_logits, values = self.actor_critic(sequences,mask = action_masks)action_logits = shift(action_logits, shift=1, dim=-2) # need to shift along sequence dimension by 1, since actions start from the last prompt (state) tokenaction_len = old_log_probs.shape[-1]action_probs = action_logits.softmax(dim = -1)action_log_probs = log_prob(action_probs, sequences)action_log_probs = action_log_probs[:, -action_len:]# calculate entropies, taking into account which part of the sequence is actually an actionentropies = masked_entropy(action_probs, mask = action_masks)# calculate kl div between old action probs and new ones, taking into account which part of the sequence is action or notkl_div_loss = 0.if self.args.kl_div_loss_weight > 0:kl_div_loss = masked_kl_div(action_probs, old_action_probs, mask = action_masks) * self.args.kl_div_loss_weight# handle non-pooled valuesnormalize_kwargs = dict()if old_values.ndim == 2:old_values, values = map(lambda t: shift(t, shift = 1, dim = -2), (old_values, values))old_values = old_values[:, -action_len:]values = values[:, -action_len:]rewards = rearrange(rewards, 'b -> b 1')normalize_kwargs = dict(dim = -1, mask = action_masks[:, -action_len:])if values.ndim < rewards.ndim:values = rearrange(values, '... -> ... 1')# calculate clipped surrogate objective, classic PPO lossratios = (action_log_probs - old_log_probs).exp()advantages = masked_normalize(rewards - old_values, **normalize_kwargs)if advantages.ndim == 1:advantages = rearrange(advantages, 'b -> b 1')surr1 = ratios * advantagessurr2 = ratios.clamp(1 - self.args.eps_clip, 1 + self.args.eps_clip) * advantagespolicy_loss = - torch.min(surr1, surr2) - self.args.beta_s * entropies# actor loss (也称为 policy loss, 是最终要使用模型的 loss)if optimizer_idx == 0:actor_loss = policy_loss.mean() + kl_div_lossreturn actor_loss# critic loss (也称为 value loss)# update value network separate from policy networkif optimizer_idx == 1:critic_loss = clipped_value_loss(values, rewards, old_values, self.args.value_clip)critic_loss = critic_loss.mean()return critic_loss

b) gen_experience_dataset

    def gen_experience_dataset(self):''' 通过与 environment 交互产生训练数据'''device = self.devicetime_cnt = 0for eps in tqdm(range(self.args.num_episodes), desc = 'episodes'):for timestep in range(self.args.max_timesteps):time_cnt += 1# select a bunch of random states (prompts)# and get the action (sampled sequence from rwkv as well as the action probs)# also calculate the reward using reward model and store# 随机挑选一条 promptrand_prompt_index = randrange(0, len(self.prompts))state = self.prompts[rand_prompt_index]# remove padding from statestate_mask = state != self.args.pad_valuestate = state[state_mask]# get predicted sequence# 与 environment 进行交互,其中返回的:#   action 是 response,#   sequence 是 prompt + response, (actions,sequence,mask,prompt_mask,action_logits,value) = self.actor_critic.generate(rearrange(state, 'n -> 1 n'),max_seq_len = self.args.ctx_len,return_values = True)action_logits = shift(action_logits, shift = 1, dim = -2) # need to shift along sequence dimension by 1, since actions start from the last prompt (state) tokenaction_prob = action_logits.softmax(dim = -1)action_len = actions.shape[-1]action_log_prob = log_prob(action_prob, sequence)action_log_prob = action_log_prob[:, -action_len:]actions = rearrange(actions, '1 ... -> ...')# get reward as given by supervised trained reward modelsequence = torch.cat((state, actions), dim = 0)prompt_length = len(state)prompt_mask = torch.arange(sequence.shape[-1], device = device) < prompt_lengthsequence = rearrange(sequence, 'n -> 1 n')prompt_mask = rearrange(prompt_mask, 'n -> 1 n')mask = rearrange(mask, 'n -> 1 n') if exists(mask) else torch.ones(sequence.shape, dtype = torch.bool, device = device)reward = self.reward_model(sequence,prompt_mask = prompt_mask,mask = mask,sample = True)self.sequence_batch.append(sequence)self.prompt_mask_batch.append(prompt_mask)self.mask_batch.append(mask)self.action_prob_batch.append(action_prob)self.action_log_prob_batch.append(action_log_prob)self.reward_batch.append(reward)self.value_batch.append(value)if time_cnt % self.args.update_timesteps == 0:train_data = zip(self.sequence_batch, self.prompt_mask_batch, self.mask_batch, self.action_prob_batch, self.action_log_prob_batch, self.reward_batch, self.value_batch)for _sequence, _prompt_mask, _mask, _action_prob, _action_log_prob, _reward, _value in train_data:yield _sequence, _prompt_mask, _mask, _action_prob, _action_log_prob, _reward, _valueself.sequence_batch.clear()self.prompt_mask_batch.clear()self.mask_batch.clear()self.action_prob_batch.clear()self.action_log_prob_batch.clear()self.reward_batch.clear()self.value_batch.clear()

3 总结

RLHF 可以根据用户反馈不断学习和优化对话,从而提高对话的质量和效果。但是由于算力资源的限制,我们只是简单调试并拉通了 RLHF 的训练流程,暂未在实际的数据集上训练模型。如若有纰漏指出,还请指正,感谢!

4 参考

[1] InstructGPT
[2] ChatGPT 背后的“功臣”——RLHF 技术详解
[3] ColossalAI
[4] PaLM-rlhf-pytorch
[5] Promixal Policy Optimization with PyTorch
[6] How ChatGPT Works Part 2: The Reward Model

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

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

相关文章

【回答问题】ChatGPT上线了!比较流行的强化学习算法

强化学习是人工智能和机器学习领域的一个重要分支。它主要研究的是如何让计算机在有目的的学习过程中自动找到最优的行动策略。 强化学习的基本过程是:环境与智能体之间不断进行交互,智能体根据环境的反馈来不断学习,并逐渐找到最优的行动策略。 在强化学习中,智能体的目…

ChatGPT自动生成思维导图

&#x1f34f;&#x1f350;&#x1f34a;&#x1f351;&#x1f352;&#x1f353;&#x1fad0;&#x1f951;&#x1f34b;&#x1f349; ChatGPT自动生成思维导图 文章目录 &#x1f350;问题引入&#x1f350;具体操作markmapXmind &#x1f433;结语 &#x1f…

AI绘画与虚拟人生成实践(二):智能不智障!用chatgpt自动写爆款内容

书接上回&#xff0c;本篇的目的是结合上篇生成的虚拟的女生形象&#xff0c;给它配上一段关于介绍AI绘画领域的脚本&#xff0c;下一篇会让生成的虚拟形象来念这段文案。先进入正题说明怎么使用chatgpt来生成想要的文案。 本文中使用的是chatgpt3.5 诉求 结合上篇生成的以假…

我们和ChatGPT聊了聊BI的未来

ChatGPT是什么? ChatGPT是OpenAI开发的聊天机器人&#xff0c;2022年11月上线&#xff0c;迅速火爆全球&#xff0c;1周突破100万用户&#xff0c;仅用2个月全球突破1亿用户&#xff0c;碾压史上所有应用程序。美国有学生用ChatGPT写论文拿下全班最高分&#xff0c;ChatGPT可以…

你都不知道网友们让ChatGPT画出了多丑的美女!

自从ChatGPT大火以来&#xff0c;网友们都疯了~各种去测试AI的底线&#xff0c;AI绘画也没能逃的了网友的毒手&#xff0c;以下请看网友们的杰作。 首先是让画美女的&#xff1a; 点评一下&#xff1a;宅男们让AI画出来的美女身材都还不错&#xff0c;就是脸部都有错误&#x…

ChatGPT 从入门到精通7 插件

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 新建了人工智能中文站https://ai.weoknow.com 每天给大家更新可用的国内可用chatGPT资源 《ChatGPT &#xff0c;从入门到精通》 教程列表 昨天介绍了 ChatGPT 的联网功能&#xff0c;今天介绍插件功能。 一、ChatGPT…

ChatGPT 插件,组合后更妙了

ChatGPT 插件&#xff0c;组合后更妙 大家好&#xff0c;我是章北海mlpy 昨天极简介绍了一些热门的ChatGPT插件 我测试了一些组合玩法&#xff0c;感觉效率、效果都远超预期。 今天就演示一下如何利用多个插件&#xff0c;高速阅读、理解一篇论文。 备注&#xff1a;一个C…

OpenAI发布ChatGPT插件功能,国内版本插件功能预计下周上线,可进群等待~

亲爱的读者朋友们&#xff0c;今天我们要为大家介绍一项颠覆性的技术进展——OpenAI发布了ChatGPT插件功能&#xff01;这一功能将带来全新的智能交互应用体验&#xff0c;为企业和个人开发者提供更多选择。让我们一起探索这个激动人心的新功能吧&#xff01; ChatGPT插件功能的…

国内版ChatGPT插件来了,快速帮你阅读分析一本书,拆书神器

好消息&#xff01; 我们都知道&#xff0c;自 OpenAI 开放插件后&#xff0c;其插件数量一直在迅速增加。 据国外网友统计&#xff0c;最新的插件总数已经有 430 个&#xff0c;与 5 月 13 日刚开放时的 74 个相比&#xff0c;增长超过 400%…… 而现在&#xff0c;文心一言…

ChatGPT正进军各行各业,抓住机遇,拥有无限的可能性。

每一个新技术的出现都会对各行各业产生冲击&#xff0c;但关键在于如何抓住这个机遇。ChatGPT是一项非常具有前途的技术&#xff0c;它可以在许多领域为人们提供更好的服务和体验。这项技术的优势之一是它可以快速而准确地理解和解释自然语言&#xff0c;从而使人们可以更轻松地…

ChatGPT 的未来挑战和风险

ChatGPT 是 OpenAI 开发的流行语言模型&#xff0c;彻底改变了我们与 AI 交互的方式。然而&#xff0c;随着像 ChatGPT 这样的语言模型的使用越来越广泛&#xff0c;重要的是要考虑它们未来可能面临的潜在风险和挑战。 一、数据质量和公平性 使用 ChatGPT 的主要风险之一是用于…

有人用ChatGPT月入十万了!我们整理了70+款可以免费使用的AI工具

策划丨KK 制图丨邬海雯 ChatGPT风靡全球&#xff0c;人人可用&#xff01; 小红书上有关ChatGPT的笔记已有10w篇&#xff0c;相关话题浏览量也达到了1.12亿次。其中讨论最为热烈的&#xff0c;要数“ChatGPT使用教程”。&#xff08;当然&#xff0c;类似的话题还包括&#x…

2023年计算机专业还值得无脑梭哈吗——计算机类专业在读一年学生个人分享

长忆观潮&#xff0c;满郭人争江上望。来疑沧海尽成空&#xff0c;万面鼓声中。 弄潮儿向涛头立&#xff0c;手把红旗旗不湿。别来几向梦中看&#xff0c;梦觉尚心寒。 IT 界每隔几年就有一波浪潮或者泡沫&#xff0c;新的一波大潮已经打过来了&#xff0c;躲&#xff1f;能跑多…

Chat2DB数据AI工具开源!对数据分析师行业影响如何?

大家好,我是千与千寻,千寻目前在互联网公司担任算法工程师,也要经常性的和数据打交道。那么数据都存放在哪里?当然是数据库啦! 说到数据库,我们就不得不提到一种编程语言——SQL数据语言,后端程序员,算法工程师。但是SQL语言虽然使用的广泛,不过SQL语言的操作与使用还…

AI 、无代码作为新时代的编程范式即将重新定义软件工业

在上个世纪 90 年代&#xff0c;我幼时所理解的软件是一段神秘的程序&#xff0c;又或者是一张不起眼的软盘&#xff0c;随着年龄渐长&#xff0c;它逐渐变成了光盘&#xff0c;互联网的出现&#xff0c;它又变成了一段可以在网络上传输的内容&#xff0c;但自我成为专业的软件…

ChatGPT 也许真的会导致底序员失业

上一篇&#xff1a;程序员的另一条出路&#xff01; ChatGPT 的出现会不会导致程序员失业&#xff1f; 首先问问 ChatGPT &#xff0c;它给出的回答是&#xff1a; 随着越来越多的人加入 ChatGPT&#xff0c;也会使它多的能力越来越完善&#xff0c;这就是AI的特点&#xff0c;…

【自然语言处理】【chatGPT系列】大语言模型可以自我改进

大语言模型可以自我改进 《Large Language Models Can Self-Improve》 论文地址&#xff1a;https://arxiv.org/pdf/2210.11610.pdf 相关博客 【自然语言处理】【大模型】BLOOM&#xff1a;一个176B参数且可开放获取的多语言模型 【自然语言处理】【大模型】PaLM&#xff1a;基…

以ChatGPT为例进行自然语言处理学习——入门自然语言处理

⭐️我叫忆_恒心&#xff0c;一名喜欢书写博客的在读研究生&#x1f468;‍&#x1f393;。 如果觉得本文能帮到您&#xff0c;麻烦点个赞&#x1f44d;呗&#xff01; 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧&#xff0c;喜欢的小伙伴给个三…

ChatGPT可以改变哪些行业?

ChatGPT&#xff08;OpenAI的语言模型&#xff09;可以改变多个行业&#xff0c;如&#xff1a; 客服机器人&#xff1a;ChatGPT 可以提供自然语言处理功能&#xff0c;以实现对客户提出的问题的自动回答。 语言翻译&#xff1a;ChatGPT 可以支持多种语言翻译&#xff0c;以便…

盘点一下chatGPT的10个优点

大规模语言培训: ChatGPT是一个大型的语言模型&#xff0c;通过OpenAI进行了大量的训练&#xff0c;因此它能够理解和回答各种类型的问题。 实时回答&#xff1a;ChatGPT可以立即回答您的问题&#xff0c;没有延迟。 准确性高&#xff1a;ChatGPT通过大量的训练&#xff0c;使…