当前位置: 首页 > news >正文

从RL的专业角度解惑 instruct GPT的目标函数

作为早期chatGPT背后的核心技术,instruct GPT一直被业界奉为里程碑式的著作。但是这篇论文关于RL的部分确写的非常模糊,几乎一笔带过。当我们去仔细审查它的目标函数的时候,心中不免有诸多困惑。特别是作者提到用PPO来做强化学习,但是那个目标函数却怎么看都和经典的PPO目标函数不大一样。网上关于这一点的解释资料也甚少,而且不免有理解错误的。所以,鉴于GPT技术在今天是如此的重要,我觉得有必要去把里面的一些误解澄清。这样,后人也可以更加透彻的理解这里面的核心思想,以及这篇文章所用的PPO和原始版本PPO之间的关联。

首先,我们来看原论文的目标函数(省略了pretrain约束的版本):

J(\theta)=E_{(x,y)\sim D_{\pi_\phi}}[r(x,y)-\beta log(\frac{\pi_\phi(y|x)}{\pi_{SFT}(y|x)})]

如果没有后面的惩罚项,这就是一个经典的策略梯度优化对象,我们可以直接把梯度算出来:

J(\phi)=E_{(x,y)\sim D_{\pi_\phi}}[r(x,y)]\approx E_{x\sim D_{\pi_\phi},y\sim \pi_\phi(\cdot|x)}[r(x,y)]=E_{x\sim D_{\pi_\phi}}[\sum_y\pi_\phi(y|x)r(x,y)]

\nabla_\phi J(\phi)=E_{x\sim D_{\pi_\phi}}[\sum_y\nabla_\phi\pi_\phi(y|x)r(x,y)]=E_{x\sim D_{\pi_\phi},y\sim \pi_\phi(\cdot|x)}[\nabla_\phi log \pi_\phi(y|x) r(x,y)]

接下来,经典的做法就是用采样来估计这个梯度,然后做梯度下降,用REINFORCE就可以优化。

但是REINFORCE和PPO最大的差异,在于对新老策略之间距离的约束,也就是KL项。这个项在某种意义上其实是改变了策略空间的度规,从而更自然的反应两个策略(概率分布)之间的真实距离(也就是自然梯度),而原始的REINFORCE之所以效果不好,是因为它默认选择用欧式度规,而这对描述概率分布之间的差异来说并不合适。

那么instruct GPT第一个令人困惑的问题来了,他的KL惩罚项在哪里?大多数人都是直觉上认为这个log(\frac{\pi_\phi(y|x)}{\pi_{SFT}(y|x)})就是KL项,但是这不够严谨,尽管KL的定义和两个分布的比值取对数有关。如果我们严格的把KL的定义写出来,它有如下形式:

KL[\pi_\phi(\cdot |x),\pi_{SFT}(\cdot |x)]=\sum_y\pi_\phi(y|x)log(\frac{\pi_\phi(y|x)}{\pi_{SFT}(y|x)})=E_{y\sim \pi_\phi(\cdot |x)}[log(\frac{\pi_\phi(y|x)}{\pi_{SFT}(y|x)})]

看到这里我们就发现了第一个端倪,这里其实是有一个近似的,而这个近似只有在抽样足够多的时候才成立:

E_{x\sim D_\phi,y\sim \pi_\phi(\cdot |x)}[log(\frac{\pi_\phi(y|x)}{\pi_{SFT}(y|x)})]\approx E_{(x,y)\sim D_\phi}[log(\frac{\pi_\phi(y|x)}{\pi_{SFT}(y|x)})]

所以这个KL项其实是被吸收到期望内部去了,而吸收的前提就是上面提到的这个近似。我们把这个KL项单独提出来,就得到了PPO的目标函数形式(注意,这里是KL形式,而非CLIP形式):

J(\phi)=E_{(x,y)\sim D_{\pi_\phi}}[r(x,y)]-\beta E_{(x,y)\sim D_{\pi_\phi}} [log(\frac{\pi_\phi(y|x)}{\pi_{SFT}(y|x)})]\approx E_{(x,y)\sim D_{\pi_\phi}}[r(x,y)]-\beta E_{x\sim D_{\pi_\phi}}[KL[\pi_\phi(\cdot|x), \pi_{SFT}(\cdot|x)]]

所以网络上所谓的“把KL惩罚直接加到reward上”的说法其实是不准确的,虽然在当前这个目标函数下这二者是等价的,但是一旦我们用类似于PPO中importance sampling的方法来处理这个目标函数,很多地方就说不通了。但是,当我们把它还原成这个标准形式后,我们就发现importance sampling其实不会作用在KL项上。

理解了上面说的,就会立马注意到另外一个令人困惑的地方:如果我们把\pi_{SFT}看作是PPO中的\pi_{old}, 那么这个KL惩罚项其实是和PPO中的KL惩罚项相反的

KL[\pi_\phi(\cdot|x), \pi_{old}(\cdot|x)]\neq KL[\pi_{old}(\cdot|x), \pi_{\phi}(\cdot|x)]

尽管这样并不会影响PPO算法的正确性,因为我们知道

KL[\pi_{old}(\cdot|x), \pi_{\phi}(\cdot|x)]<\delta \Rightarrow KL[\pi_\phi(\cdot|x), \pi_{old}(\cdot|x)]<\frac{\delta}{min_y\pi_{old}(y|x)}

尽管这两个KL都是衡量新策略​相对于旧策略的偏离程度,但是我们依然想搞清楚这二者之间的差异究竟是什么,我们又该在什么时候选择什么样的KL项呢?为了理解清楚这个问题,我们首先来需要注意到当新旧策略在单个数据点上出项差异的时候其实有两种情况:(\pi_{old}​:high,\pi_{\phi}​:low) 和 (\pi_{old}​:low,\pi_{\phi}​:high). 而这正好就对应了这两种KL惩罚项的作用对象。因为KL散度不具备对易性,所以一种KL只会对应的去作用于一种情况,而非二者兼备!

简单的说,当旧策略认为某个动作的概率高而新策略认为该动作的概率低时,KL[\pi_{old}(\cdot|x), \pi_{\phi}(\cdot|x)]会对此进行惩罚,但是KL[\pi_\phi(\cdot|x), \pi_{old}(\cdot|x)]却对此视而不见;同样的,当新策略认为某个动作的概率高而旧策略认为该动作的概率低时,KL[\pi_\phi(\cdot|x), \pi_{old}(\cdot|x)]会进行惩罚, 但KL[\pi_{old}(\cdot|x), \pi_{\phi}(\cdot|x)]会对此视而不见。

理解了这一点,我们就明白了KL[\pi_\phi(\cdot|x), \pi_{old}(\cdot|x)]其实比KL[\pi_{old}(\cdot|x), \pi_{\phi}(\cdot|x)]要更加严格且保守的,因为KL[\pi_\phi(\cdot|x), \pi_{old}(\cdot|x)]主要惩罚新策略增加旧策略低概率动作的概率,从而确保新策略保守更新,保持旧策略的高质量特性。相对的,KL[\pi_{old}(\cdot|x), \pi_{\phi}(\cdot|x)]主要惩罚新策略降低旧策略高概率动作的概率,但对新策略增加旧策略低概率动作的概率限制较少。所以说,PPO中的KL[\pi_{old}(\cdot|x), \pi_{\phi}(\cdot|x)]其实是更加鼓励新策略的exploration的,而instruct GPT中的KL[\pi_\phi(\cdot|x), \pi_{old}(\cdot|x)]则更侧重于保留经过监督微调策略的高质量特性,并不鼓励新策略过多的exploration和创新

相关文章:

从RL的专业角度解惑 instruct GPT的目标函数

作为早期chatGPT背后的核心技术&#xff0c;instruct GPT一直被业界奉为里程碑式的著作。但是这篇论文关于RL的部分确写的非常模糊&#xff0c;几乎一笔带过。当我们去仔细审查它的目标函数的时候&#xff0c;心中不免有诸多困惑。特别是作者提到用PPO来做强化学习&#xff0c;…...

location匹配的优先级和重定向

nginx的重定向&#xff08;rewrite&#xff09; location 匹配 location匹配的就是后面的uri /wordpress 192.168.233.10/wordpress location匹配的分类和优先级 1.精确匹配 location / 对字符串进行完全匹配&#xff0c;必须完全符合 2.正则匹配 ^-前缀级别&#xff…...

观察矩阵(View Matrix)、投影矩阵(Projection Matrix)、视口矩阵(Window Matrix)及VPM矩阵及它们之间的关系

V表示摄像机的观察矩阵&#xff08;View Matrix&#xff09;&#xff0c;它的作用是把对象从世界坐标系变换到摄像机坐标系。因此&#xff0c;对于世界坐标系下的坐标值worldCoord(x0, y0, z0)&#xff0c;如果希望使用观察矩阵VM将其变换为摄像机坐标系下的坐标值localCoord(x…...

谷粒商城学习笔记-19-快速开发-逆向生成所有微服务基本CRUD代码

文章目录 一&#xff0c;使用逆向工程步骤梳理1&#xff0c;修改逆向工程的application.yml配置2&#xff0c;修改逆向工程的generator.properties配置3&#xff0c;以Debug模式启动逆向工程4&#xff0c;使用逆向工程生成代码5&#xff0c;整合生成的代码到对应的模块中 二&am…...

时序预测 | Matlab实现TCN-Transformer的时间序列预测

时序预测 | Matlab实现TCN-Transformer的时间序列预测 目录 时序预测 | Matlab实现TCN-Transformer的时间序列预测效果一览基本介绍程序设计 效果一览 基本介绍 基于TCN-Transformer模型的时间序列预测&#xff0c;可以用于做光伏发电功率预测&#xff0c;风速预测&#xff0c;…...

没想到MySQL 9.0这么拉胯

MySQL 7月1号发布了9.0版本&#xff0c;然而没想到并没有引起大家的狂欢&#xff0c;反而是来自DBA圈子的一篇吐槽&#xff0c;尤其是PG界吐槽更厉害。 难道MySQL现在真的这么拉胯了&#xff1f;本着好奇的态度&#xff0c;我也去下载了MySQL9.0的手册看了一下。确实有点让我大…...

开源 Wiki 系统 InfoSphere 2024.01.1 发布

推荐一套基于 SpringBoot 开发的简单、易用的开源权限管理平台&#xff0c;建议下载使用: https://github.com/devlive-community/authx 推荐一套为 Java 开发人员提供方便易用的 SDK 来与目前提供服务的的 Open AI 进行交互组件&#xff1a;https://github.com/devlive-commun…...

1.Introduction to Spring Web MVC framework

Web MVC framework 文档&#xff1a;22. Web MVC framework (spring.io) 概述 Web MVC框架&#xff08;Web Model-View-Controller Framework&#xff09;是一种用于构建Web应用程序的软件架构模式。MVC模式将应用程序分为三个主要组件&#xff1a;模型&#xff08;Model&am…...

Onnx 1-深度学习-概述1

Onnx 1-深度学习-概述1 一: Onnx 概念1> Onnx 介绍2> Onnx 的作用3> Onnx 应用场景4> Onnx 文件格式1. Protobuf 特点2. onnx.proto3协议3> Onnx 模型基本操作二:Onnx API1> 算子详解2> Onnx 算子介绍三: Onnx 模型1> Onnx 函数功能1. np.random.rand…...

网络基础——udp协议

UDP协议&#xff08;User Datagram Protocol&#xff0c;用户数据报协议&#xff09;是OSI&#xff08;Open System Interconnection&#xff0c;开放式系统互联&#xff09;参考模型中一种无连接的传输层协议&#xff0c;它提供了一种简单的、不可靠的数据传输服务。以下是关于…...

分布式锁理解

介绍分布式锁&#xff0c;我觉得从项目的背景入手把 在伙伴匹配系统中&#xff0c;我创建了一个定时任务&#xff0c;做为缓存预热的手段 这个具体原因在Redis-CSDN博客 接下来切入正题&#xff1a; 想象每个服务器都有一个定时任务&#xff0c;都要对数据库或者缓存进行操…...

Android Gradle 开发与应用 (十): Gradle 脚本最佳实践

目录 1. 使用Gradle Kotlin DSL 1.1 什么是Gradle Kotlin DSL 1.2 迁移到Kotlin DSL 1.3 优势分析 2. 优化依赖管理 2.1 使用依赖版本管理文件 2.2 使用依赖分组 3. 合理使用Gradle插件 3.1 官方插件和自定义插件 3.2 插件管理的最佳实践 4. 任务配置优化 4.1 使用…...

c#获取本机的MAC地址(附源码)

在前一次的项目中&#xff0c;突然用到了这个获取本机的MAC地址&#xff0c;然后就研究了一下&#xff0c;记录下来&#xff0c;防止以后再用到&#xff0c; 使用winfrom做的&#xff0c;界面一个button&#xff0c;一个textBox,点了button以后给textBox赋值显示mac地址 附上源…...

sqlmap使用之-post注入、head注入(ua、cookie、referer)

1、post注入 1.1、方法一&#xff0c;通过保存数据包文件进行注入 bp抓包获取post数据 将数据保存到post.txt文件 加上-r指定数据文件 1.2、方法二、通过URL注入 D:\Python3.8.6\SQLmap>python sqlmap.py -u "http://localhost/login.php" --data "userna…...

XSS: 原理 反射型实例[入门]

原理 服务器未对用户输入进行严格校验&#xff0c;使攻击者将恶意的js代码&#xff0c;拼接到前端代码中&#xff0c;从而实现恶意利用 XSS攻击危害 窃取用户Cookie和其他敏感信息&#xff0c;进行会话劫持或身份冒充后台增删改文章进行XSS钓鱼攻击利用XSS漏洞进行网页代码的…...

Idea新增Module报错:sdk ‘1.8‘ type ‘JavaSDK‘ is not registered in ProjectJdkTable

文章目录 一&#xff0c;创建Module报错二&#xff0c;原因分析三&#xff0c;解决方案1&#xff0c;点击上图的加号&#xff0c;把JDK8添加进来即可2&#xff0c;点击左侧[Project]&#xff0c;直接设置SDK为JDK8 四&#xff0c;配置检查与验证 一&#xff0c;创建Module报错 …...

基于RHCE基础搭建简单服务

目录 项目标题与需求一 配置IP地址server机node02机 二 配置web服务三 搭建dns服务器四 开启防火墙server firewalld 五 配置nfs服务器node02 nfsserver autofs 六 开启SELinux七 验证是否能访问www.rhce.com 项目标题与需求 项目标题&#xff1a; 项目需求&#xff1a; 现有…...

威纶通触摸屏软件离线仿真时出现报错8000端口占用或服务器断线

现象 威纶通触摸屏软件离线仿真时出现报错 显示8000端口被占用 或者是设备服务器断线的状态 处理方法 系统参数——HMI属性 端口号更改一下即可 或者关闭占用8000端口的应用 分享创作不易&#xff0c;请多多支持&#xff0c;点赞、收藏、关注&#xff01; Ending~...

CAS详解

文章目录 CAS使用示例Unsafe类实现原理CAS问题 CAS CAS全称为Compare and Swap被译为比较并交换&#xff0c;是一种无锁算法。用于实现并发编程中的原子操作。CAS操作检查某个变量是否与预期的值相同&#xff0c;如果相同则将其更新为新值。CAS操作是原子的&#xff0c;这意味…...

【笔记】虚拟机中的主从数据库连接实体数据库成功后的从数据库不同步问题解决方法2

错误&#xff1a; Last_Errno: 1008 Last_Error: Coordinator stopped because there were error(s) in the worker(s). The most recent failure being: Worker 1 failed executing transaction ANONYMOUS at source log mysql-bin.000014, end_log_pos 200275. See error lo…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

【网络安全】开源系统getshell漏洞挖掘

审计过程&#xff1a; 在入口文件admin/index.php中&#xff1a; 用户可以通过m,c,a等参数控制加载的文件和方法&#xff0c;在app/system/entrance.php中存在重点代码&#xff1a; 当M_TYPE system并且M_MODULE include时&#xff0c;会设置常量PATH_OWN_FILE为PATH_APP.M_T…...

Caliper 负载(Workload)详细解析

Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...

vue3 daterange正则踩坑

<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...

【安全篇】金刚不坏之身:整合 Spring Security + JWT 实现无状态认证与授权

摘要 本文是《Spring Boot 实战派》系列的第四篇。我们将直面所有 Web 应用都无法回避的核心问题&#xff1a;安全。文章将详细阐述认证&#xff08;Authentication) 与授权&#xff08;Authorization的核心概念&#xff0c;对比传统 Session-Cookie 与现代 JWT&#xff08;JS…...

【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?

FTP&#xff08;File Transfer Protocol&#xff09;本身是一个基于 TCP 的协议&#xff0c;理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况&#xff0c;主要原因包括&#xff1a; ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...

【QT控件】显示类控件

目录 一、Label 二、LCD Number 三、ProgressBar 四、Calendar Widget QT专栏&#xff1a;QT_uyeonashi的博客-CSDN博客 一、Label QLabel 可以用来显示文本和图片. 核心属性如下 代码示例: 显示不同格式的文本 1) 在界面上创建三个 QLabel 尺寸放大一些. objectName 分别…...