当前位置: 首页 > 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…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

什么是EULA和DPA

文章目录 EULA&#xff08;End User License Agreement&#xff09;DPA&#xff08;Data Protection Agreement&#xff09;一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA&#xff08;End User License Agreement&#xff09; 定义&#xff1a; EULA即…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

力扣热题100 k个一组反转链表题解

题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...

Linux系统部署KES

1、安装准备 1.版本说明V008R006C009B0014 V008&#xff1a;是version产品的大版本。 R006&#xff1a;是release产品特性版本。 C009&#xff1a;是通用版 B0014&#xff1a;是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存&#xff1a;1GB 以上 硬盘&#xf…...

在 Spring Boot 中使用 JSP

jsp&#xff1f; 好多年没用了。重新整一下 还费了点时间&#xff0c;记录一下。 项目结构&#xff1a; pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...

基于 HTTP 的单向流式通信协议SSE详解

SSE&#xff08;Server-Sent Events&#xff09;详解 &#x1f9e0; 什么是 SSE&#xff1f; SSE&#xff08;Server-Sent Events&#xff09; 是 HTML5 标准中定义的一种通信机制&#xff0c;它允许服务器主动将事件推送给客户端&#xff08;浏览器&#xff09;。与传统的 H…...