ChatGPT技术原理

news2025/2/24 18:26:46

Task03 ChatGPT技术原理

目录

  • 阶段一:有监督微调Supervised fine-tuning (SFT)
  • 阶段二:训练回报模型(Reward Model, RM)
  • 阶段三:使用强化学习微调 SFT 模型

ChatGPT 是由 GPT-3 迭代来的,原有的 GPT-3 可能难以从文本中学会一些更高层次的表示,这就导致了 GPT-3 这样的语言模型,很难理解用户的真实意图,经常出现答非所问的情况,一本正经的胡说八道

ChatGPT 又是如何做的改进?ChatGPT要解决的核心问题就是怎么让模型和用户对齐。

那么模型和用户对齐是什么呢?就是让模型学会理解人类的命令指令的含义(比如给我写一段小作文生成类问题、知识回答类问题、头脑风暴类问题等不同类型的命令),以及让模型学会判断对于给定 prompt 输入指令(用户的问题),什么样的答案是优质的(富含信息、内容丰富、对用户有帮助、无害、不包含歧视信息等多种标准)。

在这里ChatGPT做的改进是通过引入“人工标注数据+强化学习”(RLHF,Reinforcement Learning from Human Feedback ,这里的人工反馈其实就是人工标注数据)来不断Fine-tune预训练语言模型。

在“人工标注数据+强化学习”框架下,训练 ChatGPT 主要分为三个阶段:

  • 第一阶段使用标准数据(prompt 和对应的回答)进行微调,也就是有监督微调 SFT(Supervised fine-tuning)
  • 第二个阶段,训练回报模型(Reward Model, RM)。给定 prompt(大约3万左右),使用微调后的模型生成多个回答,人工对多个答案进行排序,然后使用 pair-wise learning 来训练 RM,也就是学习人工标注的顺序(人工对模型输出的多个答案按优劣进行排序)。
  • 最后一个阶段就是使用强化学习,微调预训练语言模型。

使用强化学习的目的是让模型的答案更接近人类意图,这一阶段不需要人工标注数据,而是利用上一阶段学好的RM模型,靠RM模型的打分结果来更新预训练模型参数。那么这里又有一个问题,为什么不直接使用SFT,主要原因还是标注数据太少。

下面来详细介绍这三个阶段:

阶段一:有监督微调Supervised fine-tuning (SFT)

为了让 ChatGPT 初步具备理解指令中(prompt)蕴含的意图,首先会从测试用户提交的 prompt (就是指令或问题)中随机抽取一批,靠专业的标注人员,给出指定 prompt 的高质量答案,然后用这些人工标注好的<prompt, answer> 数据来 Fine-tune GPT-3 模型。经过这个过程,我们可以认为 ChatGPT 初步具备了理解人类 prompt 中所包含意图,并根据这个意图给出相对高质量回答的能力,但是由于样本太少,很难达到理想效果。

总的来说,第一阶段主要做的工作是使用人工标注的指令答案数据对来微调GPT3,这一部分就认为ChatGPT初步具备理解prompt中的人类意图。

标注数据集主要是一些问答、生成任务等问题,主要分为如下部分:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

阶段二:训练回报模型(Reward Model, RM)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这个阶段的主要目的是通过人工标注训练数据,来训练回报模型。具体而言,随机抽样一批用户提交的 prompt (大部分和第一阶段的相同),使用第一阶段 Fine-tune 好的模型,对于每个 prompt,由之前的 SFT 模型生成 K 个不同的回答,于是模型产生出了<prompt, answer1>, <prompt, answer2>….<prompt, answerK>数据(这里面 K 是4到9之间)。之后,标注人员对 K 个结果按照很多标准(上面提到的相关性、富含信息性、有害信息等诸多标准)综合考虑进行排序,给出 K 个结果的排名顺序,这就是此阶段人工标注的数据。

接下来,我们准备利用这个排序结果数据来训练回报模型,采取的训练模式其实就是平常经常用到的 pair-wise learning to rank(配对学习排序)。对于K个排序结果,两两组合,形成 ( k 2 ) \binom{k}{2} (2k)个训练数据对,ChatGPT 采取 pair-wise loss 来训练回报模型。RM 模型接受一个输入<prompt, answer>,给出评价回答质量高低的回报分数 Score。对于一对训练数据<answer1, answer2>,我们假设人工排序中 answer1 排在 answer2 前面,那么 Loss 函数则鼓励 RM 模型对<prompt, answer1> 的打分要比 <prompt, answer2> 的打分要高。

下面是回报模型的损失函数:

loss ( θ ) = − 1 ( k 2 ) E ( x , y w , y l ) ∼ D [ log ( σ ( r θ ( x , y w ) − r θ ( x , y l ) ) ) ] \text{loss}\left( \theta \right)=-\frac{1}{\binom{k}{2}}E_{\left( x,y_w,y_l \right)\sim D}\left[ \text{log}\left( \sigma\left( r_{\theta}\left( x,y_w \right)-r_{\theta}\left( x,y_l \right) \right) \right) \right] loss(θ)=(2k)1E(x,yw,yl)D[log(σ(rθ(x,yw)rθ(x,yl)))]

其中$ r_{\theta}\left( x,y \right) 表示回报模型的输出, 表示回报模型的输出, 表示回报模型的输出,x 是给定的 p r o m p t , 是给定的 prompt, 是给定的prompty 表示对于的回答。 表示对于的回答。 表示对于的回答。y_w 和 和 y_l 表示回答 表示回答 表示回答w 排在回答 排在回答 排在回答l$前面 ,类似上面的 answer1 排在 answer2 前面。

总结的来说,在这个阶段里,首先由 SFT 监督模型为每个 prompt 产生 K 个结果,人工根据结果质量由高到低排序,以此作为训练数据,通过 pair-wise learning to rank 模式来训练回报模型。对于学好的 RM 模型来说,输入<prompt, answer>,输出结果的质量得分,得分越高说明产生的回答质量越高。

阶段三:使用强化学习微调 SFT 模型

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

本阶段无需人工标注数据,而是利用上一阶段学好的 RM 模型,靠 RM 打分结果来更新预训练模型参数。具体而言,首先,从用户提交的 prompt 里随机采样一批新的命令(指的是和第一第二阶段不同的新的 prompt),且由一阶段的 SFT 模型来初始化 PPO 模型的参数。然后,对于随机抽取的 prompt,使用 PPO 模型生成回答answer, 并用上一阶段训练好的 RM 模型给出 answer 质量评估的回报分数 score,这个回报分数就是 RM 赋予给整个回答的整体 reward。

强化学习的目标函数如下:

object ( ϕ ) = E ( x , y ) ∼ D π ϕ R L [ r θ ( x , y ) − β  log ( π ϕ R L ( y ∣ x ) / π S F T ( y ∣ x ) ) ] + γ E x ∼ D pretrain [ log ( π ϕ R L ( x ) ) ] \text{object}\left( \phi \right)=E_{\left( x,y\right)\sim D_{\pi {\phi}^{RL}}}\left[ r{\theta}\left( x,y \right)-\beta\space \text{log}\left( \pi {\phi}^{RL}\left( y|x \right)/\pi^{SFT}\left( y|x \right) \right) \right]+\gamma E{x\sim D_{\text{pretrain}}}\left[ \text{log}\left( \pi _{\phi}^{RL}\left( x \right) \right) \right] object(ϕ)=E(x,y)DπϕRL[rθ(x,y)β log(πϕRL(yx)/πSFT(yx))]+γExDpretrain[log(πϕRL(x))]

这里面第一项是最大化回报 score,第二项是让强化学习的输出不要偏离 SFT 太多,最后一项是保证微调的同时,原有语言模型的效果不会变差。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HTML5+CSS3+JS小实例:鼠标控制飞机的飞行方向

实例:鼠标控制飞机的飞行方向 技术栈:HTML+CSS+JS 效果: 源码: 【html】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="viewport" conten…

在Scrapy框架中使用隧道代理

今天我要和大家分享一些实战经验&#xff0c;教你如何在Scrapy框架中使用隧道代理。如果你是一个热爱网络爬虫的开发者&#xff0c;或者对数据抓取和处理感兴趣&#xff0c;那么这篇文章将帮助你走上更高级的爬虫之路。 首先&#xff0c;让我们简单介绍一下Scrapy框架。Scrapy…

Windows服务器设置Nginx实现分布式服务

1.安装Nginx 下载Nginx-1.16.1版本。解压到如下目录&#xff1a; 设置环境变量&#xff1a; 检查版本&#xff1a; 启动nginx.exe&#xff0c;出现黑框一闪而过&#xff0c;进程中出现如下情况代表启动成功&#xff1a; 2.搭建模拟HTTP服务 下载wiremock-standalone-2.25.1.j…

分析key原理

总结&#xff1a; key是虚拟dom对象的标识&#xff0c;当数据发生变化时&#xff0c;vue会根据新数据生成新的虚拟dom&#xff0c;随后vue进行新虚拟dom与旧虚拟dom的差异比较 比较规则&#xff1a; ①旧虚拟dom中找到了与新虚拟dom相同的key 若虚拟dom中的内容没变&#xff0c…

Windows Linux 子系统迎来多项改进,并增加IPv6支持

日前微软发布了Windows Linux 子系统(WSL)的最新预览更新(2.0.0 版)&#xff0c;并且带来多项改进的同时还涉及部分实验功能。比如autoMemoryReclaim 和 Sparse VHD&#xff0c;而这些功能将有助于缓存和磁盘空间管理。 对此微软表示&#xff1a;“我们回收了虚拟机内存大小的…

Nginx代理配置详解

一、什么是代理 1、正向代理(forward proxy) 正向代理&#xff0c;简单的说就像是一个跳板&#xff0c;它隐藏了真实的请求客户端&#xff08;IP&#xff09;&#xff0c;服务端不知道真实的客户端是谁&#xff0c;客户端请求的服务都由代理服务器来代替请求。 举个例子来说…

Nginx 默认的location index设置网站的默认首页

/斜杠代表location定位的路径&#xff0c;路径当中最重要的字段就是root。 root默认值就是html&#xff0c;这个就是nginx安装路径下面的html文件夹作为root的路径。默认不配置就是root下面的内容&#xff0c;index指定了主页的内容。 [rootjenkins html]# echo test > te…

Pytorch-MLP-Mnist

文章目录 model.pymain.py参数设置注意事项初始化权重如果发现loss和acc不变关于数据下载关于输出格式 运行图 model.py import torch.nn as nn import torch.nn.functional as F import torch.nn.init as initclass MLP_cls(nn.Module):def __init__(self,in_dim28*28):super…

Redis之hash类型

文章目录 Redis之hash类型1. 设置一个字段/获取一个字段2. 获取所有字段值3. 判断字段是否存在4. 设置多个字段/获取多个字段5. 只获取字段名/字段值6. 获取某个key内全部数量7. 增加数字8. 删除key内字段9. 字段不存在时赋值10. 应用场景 Redis之hash类型 redis的hash类型&…

Google Play上线规范及流程

将应用发布到 Google Play 商店需要遵循一系列规范和流程&#xff0c;以确保应用的质量、安全性和用户体验。以下是发布应用到 Google Play 的一般规范和流程&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流…

【linux基础(七)】Linux中的开发工具(下)--make/makefile和git

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到开通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; Linux中的开发工具 1. 前言2.…

代码随想录算法训练营第一天(C)| 704. 二分查找 27. 移除元素

文章目录 前言一、704. 二分查找二、27. 移除元素三、34. 在排序数组中查找元素的第一个和最后一个位置总结 前言 这次是C&#xff1b; 代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素_愚者__的博客-CSDN博客 &#xff08;java&#xff09; 一、704. 二分查找 的优…

【HarmonyOS】【FAQ】HarmonyOS应用开发相关问题解答(四)

贴接上回。。。 【往期FAQ参考】 【HarmonyOS】【FAQ】HarmonyOS应用开发相关问题解答&#xff08;一&#xff09; 【HarmonyOS】【FAQ】HarmonyOS应用开发相关问题解答&#xff08;二&#xff09; 【HarmonyOS】【FAQ】HarmonyOS应用开发相关问题解答&#xff08;三&#x…

ELFK之zookeeper+kafka

目录 kafkazookeeper的系统架构 Zookeeper 一、zookeeper概述 二、zookeeper特点 三、zookeeper选举机制 四、应用场景 五、zookeeper实验实例 Kafka 一、概述 为什么需要消息队列(MQ) 使用消息队列的好处 消息队列的两种模式 Kafka 定义 二、Kafka 的特性 三、Ka…

【Linux系统编程】通过系统调用获取进程标识符 及 创建子进程(fork)

文章目录 1. 通过系统调用获取进程标示符&#xff08;PID&#xff09;1.1 进程id&#xff08;PID&#xff09;1.2 父进程id&#xff08;PPID&#xff09; 2. bash也是一个进程3. 通过系统调用创建进程-fork初识3.1 批量化注释3.2 取消注释3.3 fork创建子进程3.4 fork的返回值3.…

【AD】【PCB封装规范计划】 -CON排针类

像这种CON&#xff0c;排针的。画PCB封装的时候&#xff0c;要把数字用丝印标出来&#xff01;&#xff01;&#xff01;

浏览器调用本地exe

本地新建 .reg 文件添加注册表信息 修改路径和自定义协议名称 双击运行reg文件添加注册表信息 各参数说明&#xff0c;路径需要多加一个\转义 reg文件样例 Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\localexe] "URL Protocol""C:\\Use…

java集合之迭代器遍历元素

集合遍历 遍历、迭代、逐个获取容器中的元素 Iterable接口 实现了Iterable接口的类是可以遍历的&#xff0c;因为Iterable接口是Collection接口的父接口&#xff0c;而所有单列集合类都实现了Collection接口&#xff0c;从而也都实现了Iterable接口&#xff0c;所以所有单列集…

电压放大器在电子测试中的应用有哪些方面

电压放大器是一种常见的电子设备&#xff0c;广泛应用于各种测试和测量应用中。以下是电压放大器在电子测试中的几个主要方面应用的简要介绍。 信号采集与处理&#xff1a;电压放大器通常用于信号采集和处理&#xff0c;在测试过程中将低电平信号放大到适合进一步处理或分析的水…

【python基础】编写/运行hello world项目

1.编写hello world项目 编程界每种语言的第一个程序往往都是输出hello world。因此我们来看看&#xff0c;如何用Python输出hello world。 1.如果你是初学者&#xff0c;main.py中的代码暂时是无法看懂的&#xff0c;所以可以把main中的源代码直接删除。如下所示 这里我们要…