【深度强化学习 DRL 快速实践】策略梯度算法 (PG)

在这里插入图片描述

PG(1984,Sutton) 核心改进点

策略梯度算法 (PG): 直接对策略函数进行建模,可以适用于连续的动作空间

  • model-free, on-policy, PG, stochastic 策略
核心改进点说明
策略梯度优化通过Actor网络直接优化策略,适应连续动作问题: θ n e w = θ o l d + α ∇ θ J ( θ ) \theta_{new} = \theta_{old} + \alpha \nabla_\theta J(\theta) θnew=θold+αθJ(θ)

PG 网络更新 – 基于蒙特卡洛估计REINFORCE

∇ θ J ( θ ) ≈ ∑ t = 0 T − 1 ∇ θ log ⁡ π θ ( a t ∣ s t ) G t ,where  G t = ∑ t ′ = t T γ t ′ − t r t ′ \nabla_\theta J(\theta) \approx \sum_{t=0}^{T-1} \nabla_\theta \log \pi_\theta(a_t | s_t) G_t,\text{where } G_t = \sum_{t'=t}^{T} \gamma^{t' - t} r_{t'} θJ(θ)t=0T1θlogπθ(atst)Gtwhere Gt=t=tTγttrt


详细网络更新公式推导

策略更新目标:使得 θ \theta θ 策略下得到的所有轨迹 τ \tau τ 的回报期望 R ˉ θ \bar{R}_\theta Rˉθ 最大化: 可以用 N 条轨迹的均值近似

  • τ = { s 1 , a 1 , r 1 , s 2 , a 2 , r 2 , … , s τ , a τ , r τ } \tau = \{s_1, a_1, r_1, s_2, a_2, r_2, \dots, s_\tau, a_\tau, r_\tau\} τ={s1,a1,r1,s2,a2,r2,,sτ,aτ,rτ}
    R ˉ θ = ∑ τ R ( τ ) P ( τ ∣ θ ) ≈ 1 N ∑ n N R ( τ n ) \bar{R}_\theta =\textcolor{red}{\sum_\tau} R(\tau) \textcolor{red}{P(\tau | \theta)} \approx \textcolor{blue}{\frac{1}{N} \sum_n^N}R(\tau^n) Rˉθ=τR(τ)P(τθ)N1nNR(τn)

计算梯度 (近似)

∇ R ˉ θ = ∑ τ R ( τ ) ∇ P ( τ ∣ θ ) = ∑ τ R ( τ ) P ( τ ∣ θ ) ∇ P ( τ ∣ θ ) P ( τ ∣ θ ) = ∑ τ R ( τ ) P ( τ ∣ θ ) ∇ θ log ⁡ P ( τ ∣ θ ) ≈ 1 N ∑ n = 1 N R ( τ n ) ∇ θ log ⁡ P ( τ n ∣ θ ) \nabla \bar{R}_\theta = \sum_{\tau} R(\tau) \nabla P(\tau | \theta) = \sum_\tau R(\tau) P(\tau | \theta) \frac{\nabla P(\tau | \theta)}{P(\tau | \theta)}=\textcolor{red}{\sum_\tau} R(\tau) \textcolor{red}{P(\tau | \theta)} \nabla_\theta \log P(\tau | \theta)\\ \approx \textcolor{blue}{\frac{1}{N} \sum_{n=1}^N} R(\tau^n) \nabla_\theta \log P(\tau^n | \theta) Rˉθ=τR(τ)P(τθ)=τR(τ)P(τθ)P(τθ)P(τθ)=τR(τ)P(τθ)θlogP(τθ)N1n=1NR(τn)θlogP(τnθ)

  • 注:转为 log 时利用了公式 d log ⁡ ( f ( x ) ) d x = 1 f ( x ) ⋅ d f ( x ) d x \frac{d \log(f(x))}{dx} = \frac{1}{f(x)} \cdot \frac{d f(x)}{dx} dxdlog(f(x))=f(x)1dxdf(x)

其中, ∇ θ log ⁡ P ( τ n ∣ θ ) \nabla_\theta\log P(\tau^n | \theta) θlogP(τnθ) 可以做进一步表示

P ( τ ∣ θ ) = p ( s 1 ) ∏ t = 1 T p ( a t ∣ s t , θ ) p ( r t , s t + 1 ∣ s t , a t ) log ⁡ P ( τ ∣ θ ) = log ⁡ p ( s 1 ) + ∑ t = 1 T log ⁡ p ( a t ∣ s t , θ ) + log ⁡ p ( r t , s t + 1 ∣ s t , a t ) ∇ θ log ⁡ P ( τ ∣ θ ) = ∑ t = 1 T ∇ θ log ⁡ p ( a t ∣ s t , θ ) P(\tau|\theta) = p(s_1) \prod_{t=1}^{T} p(a_t|s_t, \theta) p(r_t, s_{t+1}|s_t, a_t) \\ \log P(\tau|\theta) = \log p(s_1) + \sum_{t=1}^{T} \log p(a_t|s_t, \theta) + \log p(r_t, s_{t+1}|s_t, a_t)\\ \nabla_\theta\log P(\tau | \theta) = \sum_{t=1}^{T} \nabla_\theta \log p(a_t | s_t, \theta) P(τθ)=p(s1)t=1Tp(atst,θ)p(rt,st+1st,at)logP(τθ)=logp(s1)+t=1Tlogp(atst,θ)+logp(rt,st+1st,at)θlogP(τθ)=t=1Tθlogp(atst,θ)

所以梯度 (近似)的表示更新为

∇ R ˉ θ ≈ 1 N ∑ n = 1 N ∑ t = 1 T n R ( τ n ) ∇ θ log ⁡ p ( a t n ∣ s t n , θ ) \nabla \bar{R}_\theta \approx {\frac{1}{N} \sum_{n=1}^N} \sum_{t=1}^{T^n} R(\tau^n) \nabla_\theta \log p(a_t^n | s_t^n, \theta) RˉθN1n=1Nt=1TnR(τn)θlogp(atnstn,θ)

  • 注:梯度用的是总的回报 R ( τ n ) R(\tau^n) R(τn) 而不是 a t n a_t^n atn 对应的即时奖励,也就是说,总的回报会增强/减弱轨迹上所有有利/有害的动作输出;进一步,由于对于第 t 个step,所选择的动作只会影响未来的 U t n = ∑ t T n r t n U^n_t = \sum_t^{T^n} r^n_t Utn=tTnrtn 所以 R ( τ n ) R(\tau^n) R(τn) 可以被优化为 U t n U^n_t Utn,对应本文一开始所给出的梯度公式

关于如何理解这个梯度,李宏毅老师类比分类学习的讲法也很有启发,强烈推荐学习下 【PG 李宏毅 B 站】

进一步的 还可以通过添加 baseline 等方法进一步优化表现

  • 解决全正数值的奖励导致的 – 没有被 sample 到的 action 输出概率会下降 (因为其他被 sample 到了的 actions,获得了正数值的奖励导致其被视为 有利的动作,进而被增强了其的输出) 的问题

基于 stable_baselines3 的快速代码示例

  • 见后续 PPO 算法章节

参考资料:策略梯度算法(PG)详解

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

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

相关文章

G1垃圾回收器中YoungGC和MixedGC的区别

在 G1 垃圾回收器中,Mixed GC 和 Young GC 的区别主要体现在以下几个方面: 作用范围 Young GC:仅针对年轻代中的Region进行回收,包括 Eden 区和 Survivor 区的 Region。Mixed GC:会回收所有年轻代的 Region 以及部分…

从LLM到AI Agent的技术演进路径:架构解析与实现逻辑

人工智能技术正经历从基础语言模型到智能执行体的关键跃迁。解析LLM→RAG→Agent的技术演进三层架构,拆解大模型与知识库、工具链的融合机理,揭示感知-决策-执行闭环系统的构建逻辑。通过架构范式解析、代码实现示例及多模态实践案例,为开发者…

commix

Commix 基础用法和高级用法 基础用法 Commix 是一个自动化的命令行注入工具,用于检测和利用 Web 应用程序中的命令注入漏洞。以下是基本使用方法: 基本扫描 python commix.py -u "http://example.com/vuln.php?id1"指定注入点 python commi…

Git删除指定历史版本

问题: 在Git提交版本,有时有些小版本相比较于后续的大版本,都会包含,且后续存在的意义不太大,一般认为是可以删除的。或者,中间一些版本有问题但是也提交了,拉取这些版本根本没用,这…

使用 Pandas 进行多格式数据整合:从 Excel、JSON 到 HTML 的处理实战

前言 在数据处理与分析的实际场景中,我们经常需要整合不同格式的数据,例如 Excel 表格、JSON 配置文件、HTML 报表等。本文以一个具体任务(蓝桥杯模拟练习题)为例,详细讲解如何使用 Python 的 Pandas 库结合其他工具&…

今日行情明日机会——20250425

指数依然在震荡,等待方向选择,整体量能不搞但个股红多绿少。 2025年4月25日涨停板行业方向分析如下: 一、核心行业方向及驱动逻辑 一季报增长(17家涨停) 核心个股:惠而浦、鸿博股份、卫星化学驱动逻辑&am…

Python 快速获取Excel工作表名称

文章目录 前言准备工作Python 获取Excel中所有工作表的名称Python 获取Excel中隐藏工作表的名称 前言 在数据分析与办公自动化领域,通过Python处理Excel文件已成为必备技能。通过获取工作表名称,我们可以: 快速了解文件结构自动化处理多工作…

宁德时代25年时代长安动力电池社招入职测评SHL题库Verify测评语言理解数字推理真题

测试分为语言和数字两部分,测试时间各为17分钟,测试正式开始后不能中断或暂停

ECMAScript 1(ES1):JavaScript 的开端

1. 版本背景与发布 ●发布时间:1997 年 6 月,由 ECMA International 正式发布,标准编号为 ECMA-262。 ●历史意义:ES1 是 JavaScript 的首个标准化版本,结束了 Netscape Navigator 与 Internet Explorer 浏览器间脚本语…

C语言面试高频题——define 和typedef 的区别?

1. 基本概念 (1) #define 定义:#define 是预处理指令,用于定义宏。作用:在编译之前进行文本替换。语法:#define 宏名 替换内容示例:#define PI 3.14159 #define SQUARE(x) ((x) * (x))(2) typedef 定义:…

【自然语言处理与大模型】模型压缩技术之蒸馏

知识蒸馏是一种模型压缩技术,主要用于将大型模型(教师模型)的知识转移到更小的模型(学生模型)中。在大语言模型领域,这一技术特别重要。 知识蒸馏的核心思想是利用教师模型的输出作为软标签(sof…

PHP CURL发送POST请求(支持HEADER参数配置)

/** POST请求(raw数据请求,支持HEADER参数配置) * @param $url * @param $datas 支持数组或字符串 * # $CURLOPT_HTTPHEADER = [ X-AjaxPro-Method:ShowList, Content-Type: application/json; charset=utf-8, Content-Length: . strlen($data_string)]; …

利用JMeter代理服务器方式实现高效压测

前言 在当今快节奏的互联网时代,确保Web应用和服务能够在高负载下稳定运行变得至关重要。无论是电子商务平台、社交媒体网络还是在线教育服务,用户对网站响应速度和稳定性的期望从未如此之高。因此,性能测试不再是一个可选项,而是…

【JavaWeb后端开发04】java操作数据库(JDBC + Mybatis+ yml格式)详解

文章目录 1. 前言2. JDBC2.1 介绍2.2 入门程序2.2.1 DataGrip2.2.2 在IDEA执行sql语句 2.3 查询数据案例2.3.1 需求2.3.2 准备工作2.3.3 AI代码实现2.3.4 代码剖析2.3.4.1 ResultSet2.3.4.2 预编译SQL2.3.4.2.1 SQL注入2.3.4.2.2 SQL注入解决2.3.4.2.3 性能更高 2.4 增删改数据…

力扣-240.搜索二维矩阵 II

题目描述 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。每列的元素从上到下升序排列。 class Solution { public:bool searchMatrix(vector<vector<int>>& matrix, in…

Spark-Streaming(三)

一. kafka和flume的整合 任务需求一:利用flume监控某目录中新生成的文件&#xff0c;将监控到的变更数据发送给kafka&#xff0c;kafka将收到的数据打印到控制台 1. 在flume/conf/目录下添加flume-kafka.conf文件 配置文件如下 2. 启动flume和kafka消费者 3. 传入数据 查看fl…

Spring Boot 启动生命周期详解

Spring Boot 启动生命周期详解 1. 启动阶段划分 Spring Boot 启动过程分为 4个核心阶段&#xff0c;每个阶段涉及不同的核心类和执行逻辑&#xff1a; 阶段 1&#xff1a;预初始化&#xff08;Pre-initialization&#xff09; 目标&#xff1a;准备启动器和环境配置关键类&am…

《深入理解 AOP》

一、AOP 是什么 AOP&#xff08;Aspect Oriented Programming&#xff09;&#xff0c;即面向切面编程&#xff0c;是软件开发中一种重要的编程范式。它通过横向抽取机制&#xff0c;将那些与业务逻辑本身无关、却为业务模块所共同调用的逻辑或责任&#xff08;如事务处理、日…

Python【协程(Coroutine)和线程的关系】

协程(Coroutine)和线程都是实现并发编程的技术&#xff0c;但它们在实现方式、使用场景和性能上有显著区别。理解它们的关系与差异有助于在实际应用中选择合适的并发模型&#xff0c;以下是它们的核心关系与对比分析&#xff1a; 一、核心关系 互补关系 协程和线程可以结合使用…

Springboot——Redis的使用

在当今的软件开发领域&#xff0c;缓存技术是提升应用性能的关键手段之一。Redis 作为一款高性能的键值对存储数据库&#xff0c;凭借其出色的读写速度和丰富的数据结构&#xff0c;在缓存场景中得到了广泛应用。Spring Boot 作为一款简化 Spring 应用开发的框架&#xff0c;与…