🎯 REINFORCE 策略梯度算法推导(完整)

1. 目标函数定义

我们希望最大化策略的期望回报:

J ( θ ) = E τ ∼ π θ [ R ( τ ) ] J(\theta) = \mathbb{E}_{\tau \sim \pi_\theta} \left[ R(\tau) \right] J(θ)=Eτπθ[R(τ)]

其中:

  • τ = ( s 0 , a 0 , s 1 , a 1 , . . . , s T , a T ) \tau = (s_0, a_0, s_1, a_1, ..., s_T, a_T) τ=(s0,a0,s1,a1,...,sT,aT):轨迹
  • R ( τ ) = ∑ t = 0 T r t R(\tau) = \sum_{t=0}^T r_t R(τ)=t=0Trt:轨迹总回报
  • π θ ( a t ∣ s t ) \pi_\theta(a_t | s_t) πθ(atst):策略函数,如果是连续动作空间则是(概率密度函数值),离散动作空间则是是一个概率值(如 softmax 输出)。

2. 轨迹的概率

轨迹的概率分布为:

P ( τ ) = ρ ( s 0 ) ⋅ ∏ t = 0 T π θ ( a t ∣ s t ) ⋅ P ( s t + 1 ∣ s t , a t ) P(\tau) = \rho(s_0) \cdot \prod_{t=0}^T \pi_\theta(a_t | s_t) \cdot P(s_{t+1} | s_t, a_t) P(τ)=ρ(s0)t=0Tπθ(atst)P(st+1st,at)

其中:

  • ρ ( s 0 ) \rho(s_0) ρ(s0):初始状态分布
  • P ( s t + 1 ∣ s t , a t ) P(s_{t+1} | s_t, a_t) P(st+1st,at):状态转移概率(与 θ \theta θ 无关), 就是选什么动作需要概率来描述,选了这个动作跳到什么状态,也是不确定的,也需要概率来描述。

3. 对目标函数求导

我们希望通过梯度上升更新策略参数 θ \theta θ

∇ θ J ( θ ) = ∇ θ E τ ∼ π θ [ R ( τ ) ] \nabla_\theta J(\theta) = \nabla_\theta \mathbb{E}_{\tau \sim \pi_\theta} \left[ R(\tau) \right] θJ(θ)=θEτπθ[R(τ)]

问题:如何求这个梯度?由于 π θ \pi_\theta πθ 依赖于 θ \theta θ,期望不能直接求导。

似然比技巧(likelihood ratio trick),推导如下:

∇ θ E x ∼ p θ ( x ) [ f ( x ) ] = ∇ θ ∫ f ( x ) p θ ( x ) d x = ∫ f ( x ) ∇ θ p θ ( x ) d x \nabla_\theta \mathbb{E}_{x \sim p_\theta(x)}[f(x)] = \nabla_\theta \int f(x) p_\theta(x) dx = \int f(x) \nabla_\theta p_\theta(x) dx θExpθ(x)[f(x)]=θf(x)pθ(x)dx=f(x)θpθ(x)dx
这里之所以不对 f ( x ) f(x) f(x)求导,是因为在强化学习中这里的 f ( x ) f(x) f(x)是reward,是一个标量,与环境交互得到的。

利用链式法则:

∇ θ p θ ( x ) = p θ ( x ) ∇ θ log ⁡ p θ ( x ) \nabla_\theta p_\theta(x) = p_\theta(x) \nabla_\theta \log p_\theta(x) θpθ(x)=pθ(x)θlogpθ(x)

代入得:

= ∫ f ( x ) p θ ( x ) ∇ θ log ⁡ p θ ( x ) d x = E x ∼ p θ ( x ) [ f ( x ) ∇ θ log ⁡ p θ ( x ) ] = \int f(x) p_\theta(x) \nabla_\theta \log p_\theta(x) dx = \mathbb{E}_{x \sim p_\theta(x)}[f(x) \nabla_\theta \log p_\theta(x)] =f(x)pθ(x)θlogpθ(x)dx=Expθ(x)[f(x)θlogpθ(x)]


4. 推导 log 概率项

注意:

log ⁡ P ( τ ) = log ⁡ ρ ( s 0 ) + ∑ t = 0 T [ log ⁡ π θ ( a t ∣ s t ) + log ⁡ P ( s t + 1 ∣ s t , a t ) ] \log P(\tau) = \log \rho(s_0) + \sum_{t=0}^{T} \left[ \log \pi_\theta(a_t | s_t) + \log P(s_{t+1} | s_t, a_t) \right] logP(τ)=logρ(s0)+t=0T[logπθ(atst)+logP(st+1st,at)]

由于 ρ ( s 0 ) \rho(s_0) ρ(s0) P ( s t + 1 ∣ s t , a t ) P(s_{t+1} | s_t, a_t) P(st+1st,at) θ \theta θ 无关:

∇ θ log ⁡ P ( τ ) = ∑ t = 0 T ∇ θ log ⁡ π θ ( a t ∣ s t ) \nabla_\theta \log P(\tau) = \sum_{t=0}^{T} \nabla_\theta \log \pi_\theta(a_t | s_t) θlogP(τ)=t=0Tθlogπθ(atst)


5. 得到策略梯度表达式

代入得到最终梯度表达式:

∇ θ J ( θ ) = E τ ∼ π θ [ ∑ t = 0 T ∇ θ log ⁡ π θ ( a t ∣ s t ) ⋅ R ( τ ) ] \nabla_\theta J(\theta) = \mathbb{E}_{\tau \sim \pi_\theta} \left[ \sum_{t=0}^T \nabla_\theta \log \pi_\theta(a_t | s_t) \cdot R(\tau) \right] θJ(θ)=Eτπθ[t=0Tθlogπθ(atst)R(τ)]


6. 替换为每步折扣回报 ( G_t )

为了更准确地归因每步动作的影响,引入:

G t = ∑ k = t T γ k − t r k G_t = \sum_{k=t}^{T} \gamma^{k-t} r_k Gt=k=tTγktrk

改写为:

∇ θ J ( θ ) = E τ [ ∑ t = 0 T ∇ θ log ⁡ π θ ( a t ∣ s t ) ⋅ G t ] \nabla_\theta J(\theta) = \mathbb{E}_{\tau} \left[ \sum_{t=0}^{T} \nabla_\theta \log \pi_\theta(a_t | s_t) \cdot G_t \right] θJ(θ)=Eτ[t=0Tθlogπθ(atst)Gt]


7. 引入 baseline 减少方差

减去一个与动作无关的 baseline b ( s t ) b(s_t) b(st)

∇ θ J ( θ ) = E τ [ ∑ t = 0 T ∇ θ log ⁡ π θ ( a t ∣ s t ) ⋅ ( G t − b ( s t ) ) ] \nabla_\theta J(\theta) = \mathbb{E}_{\tau} \left[ \sum_{t=0}^{T} \nabla_\theta \log \pi_\theta(a_t | s_t) \cdot (G_t - b(s_t)) \right] θJ(θ)=Eτ[t=0Tθlogπθ(atst)(Gtb(st))]

常用 baseline:

b ( s t ) = V π ( s t ) ⇒ A t = G t − V ( s t ) b(s_t) = V^\pi(s_t) \quad \Rightarrow \quad A_t = G_t - V(s_t) b(st)=Vπ(st)At=GtV(st)

最终得到优势形式:

∇ θ J ( θ ) = E [ ∑ t = 0 T ∇ θ log ⁡ π θ ( a t ∣ s t ) ⋅ A t ] \nabla_\theta J(\theta) = \mathbb{E} \left[ \sum_{t=0}^{T} \nabla_\theta \log \pi_\theta(a_t | s_t) \cdot A_t \right] θJ(θ)=E[t=0Tθlogπθ(atst)At]


✅ 常见策略梯度形式总结

名称表达式
REINFORCE ∇ θ J ( θ ) = E [ ∑ t ∇ θ log ⁡ π θ ( a t ∣ s t ) ⋅ G t ] \nabla_\theta J(\theta) = \mathbb{E} \left[ \sum_t \nabla_\theta \log \pi_\theta(a_t | s_t) \cdot G_t \right] θJ(θ)=E[tθlogπθ(atst)Gt]
baseline形式 ∇ θ J ( θ ) = E [ ∑ t ∇ θ log ⁡ π θ ( a t ∣ s t ) ⋅ ( G t − b ( s t ) ) ] \nabla_\theta J(\theta) = \mathbb{E} \left[ \sum_t \nabla_\theta \log \pi_\theta(a_t | s_t) \cdot (G_t - b(s_t)) \right] θJ(θ)=E[tθlogπθ(atst)(Gtb(st))]
Advantage形式 ∇ θ J ( θ ) = E [ ∑ t ∇ θ log ⁡ π θ ( a t ∣ s t ) ⋅ A t ] \nabla_\theta J(\theta) = \mathbb{E} \left[ \sum_t \nabla_\theta \log \pi_\theta(a_t | s_t) \cdot A_t \right] θJ(θ)=E[tθlogπθ(atst)At]

📌 附:连续动作高斯策略的梯度

假设策略为:

π θ ( a ∣ s ) = N ( μ θ ( s ) , σ 2 ) \pi_\theta(a|s) = \mathcal{N}(\mu_\theta(s), \sigma^2) πθ(as)=N(μθ(s),σ2)
则:
log ⁡ π θ ( a ∣ s ) = − ( a − μ θ ( s ) ) 2 2 σ 2 + const \log \pi_\theta(a|s) = -\frac{(a - \mu_\theta(s))^2}{2\sigma^2} + \text{const} logπθ(as)=2σ2(aμθ(s))2+const
对策略参数的梯度为:
∇ θ log ⁡ π θ ( a ∣ s ) = ( a − μ θ ( s ) ) σ 2 ⋅ ∇ θ μ θ ( s ) \nabla_\theta \log \pi_\theta(a|s) = \frac{(a - \mu_\theta(s))}{\sigma^2} \cdot \nabla_\theta \mu_\theta(s) θlogπθ(as)=σ2(aμθ(s))θμθ(s)


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

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

相关文章

Windows Sever Core安装及常用命令

一、Windows Sever Core 在安装 Windows Server 的过程中,可以选择“Server Core”(核心安装)这种没有图形用户界面(GUI)的安装方式。这种模式下,Windows Server 主要通过命令行或远程管理进行配置和维护&…

Java 单元测试实战:以“两数之和”为例,讲透测试思维

🌟Java 单元测试实战:以“两数之和”为例,讲透测试思维 在 Java 开发中,单元测试不仅是验证功能正确的手段,更是衡量开发者是否具备“测试思维”的标志。今天我们通过一个最简单的功能——“两数之和”来系统讲解如何…

Bootstrap 5学习教程,从入门到精通,Bootstrap 5 提示框(Tooltips) 语法知识点及案例(21)

Bootstrap 5 提示框(Tooltips) 语法知识点及案例 一、提示框语法知识点 1. 基本概念 提示框(Tooltips)是当用户悬停在元素上时显示的小浮动标签,用于提供额外信息。 2. 核心属性 data-bs-toggle"tooltip" - 标识元素为提示框触发器title - 提示框显示…

设计模式实战指南:从源码解析到Java后端架构的艺术

🎯 设计模式实战指南:从源码解析到Java后端架构的艺术 概述 本文档基于设计模式分类,详细介绍Java后端开发中各种设计模式的实际应用场景,结合Spring、MyBatis、Redis等主流框架的源码分析,帮助开发者深入理解设计模…

Python Arrow 库详解:更智能的日期时间处理

1. 安装与基本用法 安装 Arrow pip install arrow基本使用示例 import arrow# 获取当前时间 now arrow.now() print(now) # 输出: 2023-07-15T14:30:45.12345608:00# 创建特定时间 dt arrow.get(2023-07-15 14:30:00, YYYY-MM-DD HH:mm:ss) print(dt) # 输出: 2023-07-15T…

大家电破渠道困局,小家电攻用户体验,云徙有何解法?

中国家电行业正经历深刻转型。 自2018年市场规模触及8400亿顶峰后,行业从增量竞争转向存量博弈。与此同时,线上渠道在2023年首次以58%的占比超越线下,其中扫地机器人等小家电品类线上渗透率突破90%。消费需求也在同步重构——从家庭场景向个…

DMDPC多副本数据分布测试

需求:测试建表和插入数据是否会根据分布列进行自动分发。 验证方法:1)准备基础环境:创建用户和表空间。2)创建数据分布测试表,并插入数据。3)查询指定分区数据,验证数据分布情况。 …

Qt/C++开发监控GB28181系统/rtp解包/jrtplib库的使用/同时支持udp和tcp被动和主动三种方式解包

一、前言说明 通过sip协议仅仅是交互,音视频数据的收发最终并不是通过sip传输的,而是通过将数据打包成rtp的格式再通过udp或者tcp通信的,sip协议仅仅是告知对方待会要往哪里发数据,是udp还是tcp。由于数据都是rtp包格式&#xff…

集群聊天服务器---muduo库的使用

使用 C 和 muduo 网络库来实现一个简单的聊天服务器和客户端。 服务器端: class chatServer { public:// 初始化TcpServerchatServer(muduo::net::EventLoop *loop,const muduo::net::InetAddress &listenAddr): _server(loop, listenAddr, "chatServer&…

关于Net Core Web API 项目测试 数据库模拟的两种不同方法 DC_week 6

1.关系型数据库 插件:Microsoft.EntityFrameworkCore.InMemory Microsoft.EntityFrameworkCore.InMemory 是一个用于测试的“临时内存数据库”,让你在不连接真实数据库的情况下,测试 EF Core 的功能。 使用时就是用具体这个框架里面已经…

如何获取 vscode 的 vsix 离线插件安装包

1、搜索所需要的插件 Extensions for Visual Studio family of products | Visual Studio Marketplace网址 2、点击 Repository 跳转到对应的 git 仓库 3、在 git 仓库依次选择 main , Tags, View all tags 4、选择你想下载的版本,并点击 downloads 5、往下滑动&…

ULS23 挑战:用于计算机断层扫描中 3D 通用病变分割的基准模型及基准数据集|文献速递-深度学习医疗AI最新文献

Title 题目 The ULS23 challenge: A baseline model and benchmark dataset for 3D universal lesion segmentation in computed tomography ULS23 挑战:用于计算机断层扫描中 3D 通用病变分割的基准模型及基准数据集 01 文献速递介绍 每年进行的CT检查数量持续…

WebSocket 端点 vs Spring Bean

在websocket端点中注入业务service时,不能像普通的springbean一样通过Autowired或Resource注解进行注入。主要原因是websocket端点与spring容器中的bean的生命周期管理容器不同。 WebSocket 端点(ServerEndpoint)和 Spring Bean 的生命周期存…

MySQL8:jdbc插入数据后获取自增ID

pom文件&#xff1a; <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"&…

MyBatis(Web后端开发第二期)

p.s.这是萌新自己自学总结的笔记&#xff0c;如果想学习得更透彻的话还是请去看大佬的讲解 目录 JDBC、数据库连接池、lombok日志输出SQL注入数据封装XML映射文件动态SQL<if><where><set><foreach><sql><include> 配置文件 Mybatis是是一…

Angular1--Hello

最近有个小错误&#xff0c;因为最近还是在看thingsboard&#xff0c;最近终于看到前端的代码&#xff0c;突然发现怎么全是ts的文件&#xff0c;仔细一看原来并不是之前认为的AngularJS&#xff0c;而是Angular。。。我tm真的无语了&#xff0c;又要去重新学。。。 Angular的…

什么是redission看门狗机制

Redisson 的看门狗机制(Watchdog Mechanism)是其实现可重入分布式锁时的一个核心特性,主要用于解决业务逻辑执行时间超过锁的过期时间(leaseTime)而导致锁提前释放,进而引发数据不一致的问题。它是一个自动的锁续期机制。 🔍 核心问题:为什么需要看门狗? 分布式锁的…

黑马程序员苍穹外卖DAY1

1. 前端页面能正常显示但无法登录&#xff08;一直转圈圈&#xff09; 找到下面路径的dev.yml port一定要跟自己本机的保持一致&#xff0c;&#xff0c;username和password也一定是自己主机的用户名和密码&#xff0c;不然连不上。 登录界面的密码为数据库表的密码&#xff0…

Frida Hook Android App 点击事件实战指南:从进程识别到成功注入

一、背景与目标 在逆向分析和自动化测试中&#xff0c;Hook Android 的点击事件是调试 UI 交互逻辑的重要手段之一。本文将以实际案例讲解如何通过 Frida Hook public void onClick(View view) 方法&#xff0c;并解决常见的 Hook 失败问题&#xff0c;最终实现对登录按钮的监…

Arduino Nano 33 BLE Sense Rev 2开发板使用指南之【环境搭建 / 点灯】

一、硬件介绍 1、产品特点 Arduino Nano 33 BLE Rev2&#xff0c;利用了nRF52840微控制器的先进功能。这款32位Arm Cortex-M4 CPU 64 MHz与MicroPython的兼容性增强了板子的灵活性&#xff0c;使其更容易被更广泛的开发者社区所接受。 该开发板的突出特点是其蓝牙低功耗&…