【深度强化学习 DRL 快速实践】近端策略优化 (PPO)

在这里插入图片描述

PPO(2017,OpenAI)核心改进点

Proximal Policy Optimization (PPO):一种基于信赖域优化的强化学习算法,旨在克服传统策略梯度方法在更新时不稳定的问题,采用简单易实现的目标函数来保证学习过程的稳定性

  • 解决问题:在强化学习中,直接优化策略会导致不稳定的训练,模型可能因为过大的参数更新而崩溃
  • model-free,off-policy,actor-critic
核心改进点说明
剪切目标函数使用剪切函数 clip 限制策略更新的幅度,避免策略大幅更新导致性能崩溃
off-policy每个采样数据可用于多轮更新,提升样本利用率,提高学习效率

PPO 网络更新

策略网络

PPO 使用旧策略和新策略的比值来定义目标函数,在保持改进的同时防止策略变化过大:

L C L I P ( θ ) = E t [ min ⁡ ( r t ( θ ) A t , clip ( r t ( θ ) , 1 − ϵ , 1 + ϵ ) A t ) ] , where  r t = π θ ( a t ∣ s t ) π θ old ( a t ∣ s t ) L^{CLIP}(\theta) = {\mathbb{E}}_t \left[ \min \left( r_t(\theta) {A}_t, \text{clip}(r_t(\theta), 1 - \epsilon, 1 + \epsilon) {A}_t \right) \right], \text{where } r_t = \frac{\pi_\theta(a_t|s_t)}{\pi_{\theta_\text{old}}(a_t|s_t)} LCLIP(θ)=Et[min(rt(θ)At,clip(rt(θ),1ϵ,1+ϵ)At)],where rt=πθold(atst)πθ(atst)

  • Advantage 优势函数 A t {A}_t At:如 Q ( s t , a t ) − V ( s t ) Q(s_t, a_t) - V(s_t) Q(st,at)V(st)
  • 剪切系数 ϵ \epsilon ϵ:如 0.2

价值网络

L V F ( θ μ ) = E t [ ( V θ μ ( s t ) − R t ) 2 ] L^{VF}(\theta^\mu) = \mathbb{E}_t \left[ (V_{\theta^\mu}(s_t) - R_t)^2 \right] LVF(θμ)=Et[(Vθμ(st)Rt)2]

  • 真实或估算的回报 R t R_t Rt:如 ∑ k = 0 n = γ k r t + k \sum^n_{k=0} = \gamma^k r_{t+k} k=0n=γkrt+k

总损失函数

PPO 的总损失是策略损失、值函数损失和熵正则项 (鼓励探索) 的加权和:

L ( θ ) = L C L I P ( θ ) − c 1 L V F ( θ μ ) + c 2 H ( π ( s t ) ) L(\theta) = L^{CLIP}(\theta) - c_1 L^{VF}(\theta^\mu) + c_2 H(\pi(s_t)) L(θ)=LCLIP(θ)c1LVF(θμ)+c2H(π(st))

  • c 1 , c 2 c_1, c_2 c1,c2:权重系数,常用 c 1 = 0.5 c_1=0.5 c1=0.5, c 2 = 0.01 c_2=0.01 c2=0.01

基于 stable_baselines3 的快速代码示例

import gymnasium as gym
from stable_baselines3 import PPO# 创建环境
env = gym.make("CartPole-v1")
env.reset(seed=0)# 初始化模型
model = PPO("MlpPolicy", env, verbose=1)# 训练模型
model.learn(total_timesteps=100_000)
model.save("ppo_cartpole_v1")# 测试模型
obs, _ = env.reset()
total_reward = 0
for _ in range(200):action, _ = model.predict(obs, deterministic=True) obs, reward, terminated, truncated, _ = env.step(action)total_reward += rewardif terminated or truncated:breakprint("Test total reward:", total_reward)

参考资料:PPO 详解

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

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

相关文章

笔试强训:Day2

一、字符串中找出连续最长的数字串(双指针) 字符串中找出连续最长的数字串_牛客题霸_牛客网 #include <iostream> #include <string> #include <cctype> using namespace std;int main() {//双指针string str;cin>>str;int nstr.size();int begin-1,l…

MySQL 详解之 InnoDB:核心特性深度剖析 (ACID, 事务, 锁, 外键, 崩溃恢复)

在 MySQL 的世界里,存储引擎是数据库管理系统的核心组成部分,它负责数据的存储和提取。MySQL 支持多种存储引擎,如 MyISAM, Memory, CSV 等,但自 MySQL 5.5 版本以来,InnoDB 成为了默认的存储引擎,也是绝大多数应用场景的首选。 为什么 InnoDB 如此重要并被广泛采用?因…

Java中正则表达式使用方法

1. 正则表达式概述 正则表达式&#xff08;Regular Expression&#xff0c;简称 Regex&#xff09;是一种用于匹配字符串的模式工具。在 Java 中&#xff0c;正则表达式通过 java.util.regex 包实现&#xff0c;主要涉及以下两个类&#xff1a; Pattern&#xff1a;表示一个编…

使用浏览器的Clipboard API实现前端复制copy功能

在前端开发中&#xff0c;复制文本到剪贴板的功能通常使用浏览器的 Clipboard API 实现。比如 navigator.clipboard.writeText 方法。以下是一个简单的案例&#xff0c;展示如何使用 Clipboard API 实现复制文本的功能。 基本用法 首先&#xff0c;你需要创建一个按钮&#x…

【因果推断】(二)CV中的应用

文章目录 因果表征学习因果图 (Causal Diagram)“后门准则”&#xff08;backdoor criterion&#xff09;和“前门准则”&#xff08;frontdoor criterion&#xff09;后门调整Visual Commonsense R-CNNCausal Intervention for Weakly-Supervised Semantic SegmentationCausal…

【iOS】alloc init new底层原理

目录 前言 alloc alloc核心操作 cls->instanceSize(extraBytes) calloc obj->initInstanceIsa init 类方法&#xff1a; 实例方法&#xff1a; new 前言 笔者最近在进行对OC语言源码的学习&#xff0c;学习源码的过程中经常会出现一些从来没有遇见过的函数&…

QT窗口相关控件及其属性

widget&#xff0c;PushButton&#xff0c;lineEdit等都是基于QWidget延展出来的 并不是完整的窗口&#xff0c;而是作为窗口的一部分 真正的窗口是QMainWindow 菜单栏 Qt中的菜单栏是通过QMenuBar这个类来实现的&#xff0c;一个主窗口最多只有一个菜单栏&#xff0c;位于主…

day47—双指针-平方数之和(LeetCode-633)

题目描述 给定一个非负整数 c &#xff0c;你要判断是否存在两个整数 a 和 b&#xff0c;使得 a^2 b^2 c 。 示例 1&#xff1a; 输入&#xff1a;c 5 输出&#xff1a;true 解释&#xff1a;1 * 1 2 * 2 5示例 2&#xff1a; 输入&#xff1a;c 3 输出&#xff1a;f…

蓝桥杯 20. 压缩变换

压缩变换 原题目链接 题目描述 小明最近在研究压缩算法。他知道&#xff0c;压缩时如果能够使数值很小&#xff0c;就能通过熵编码得到较高的压缩比。然而&#xff0c;要使数值变小是一个挑战。 最近&#xff0c;小明需要压缩一些正整数序列&#xff0c;这些序列的特点是&a…

element-ui多个form同时验证,以及动态循环表单注意事项

多个form同时验证&#xff1a; validateForm(refs) {if (!refs) {return false}return new Promise((resolve, reject) > {refs.validate().then((valid) > {resolve(valid)}).catch((val) > {resolve(false)})}) }, async handleConfirm() {Promise.all([this.valid…

Spring Boot中自定义404异常处理问题学习笔记

1. 问题背景 在Spring Boot项目中&#xff0c;需要手动返回404异常给前端。为此&#xff0c;我创建了一个自定义的404异常类UnauthorizedAccessException&#xff0c;并在全局异常处理器GlobalExceptionHandler中处理该异常。然而&#xff0c;在使用Postman测试时&#xff0c;…

你学会了些什么220622?--搭建UI自动化

jenkins访问地址&#xff1a;http://192.168.82.129:8080/ 账号密码&#xff1a;admin/a123456a ***** 什么是UI自动化** 使用工具或者脚本对需要测试的软件的前端界面在预设的条件下&#xff0c;在已有的测试数据下运行系统或者应用程序&#xff0c;并获取其前端页面UI显示的…

【2025计算机网络-面试常问】http和https区别是什么,http的内容有哪些,https用的是对称加密还是非对称加密,流程是怎么样的

HTTP与HTTPS全面对比及HTTPS加密流程详解 一、HTTP与HTTPS核心区别 特性HTTPHTTPS协议基础明文传输HTTP SSL/TLS加密层默认端口80443加密方式无加密混合加密&#xff08;非对称对称&#xff09;证书要求不需要需要CA颁发的数字证书安全性易被窃听、篡改、冒充防窃听、防篡改…

JavaFX 第一篇 Hello World

1、简介 JavaFX 是一个用于构建客户端应用程序的 Java 库&#xff0c;作为 Java 标准库的一部分&#xff08;JDK 8 到 10&#xff09;&#xff0c;从 JDK 11 开始&#xff0c;JavaFX 将以独立模块发布&#xff0c;将不再包含在 JDK标准库中&#xff0c;他是 Java 应用程序开发的…

SQL实战:02之连续数问题求解

文章目录 概述题目:体育馆的人流量题解步骤一&#xff1a;构造出一个连续序列步骤二&#xff1a;找出符合条件的组的序号步骤三&#xff1a;fetch结果&#xff0c;使用内连接过滤出符合条件的记录。完整SQL 题目二&#xff1a;连续出现的数字题解步骤一&#xff1a;分区并构建连…

STM32 的 GPIO和中断

GPIO的简单介绍 内部结构 施密特触发器&#xff08;TTL肖特基触发器&#xff09; 的工作原理&#xff1a; 施密特触发电路&#xff08;简称&#xff09;是一种波形整形电路&#xff0c;当任何波形的信号进入电路时&#xff0c;输出在正、负饱和之间跳动&#xff0c;产生方波或…

Server - 优雅的配置服务器 Bash 环境(.bashrc)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/147335592 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 登录服…

使用PyTorch实现图像增广与模型训练实战

本文通过完整代码示例演示如何利用PyTorch和torchvision实现常用图像增广方法&#xff0c;并在CIFAR-10数据集上训练ResNet-18模型。我们将从基础图像变换到复杂数据增强策略逐步讲解&#xff0c;最终实现一个完整的训练流程。 一、图像增广基础操作 1.1 准备工作 #matplotli…

解决Mac 安装 PyICU 依赖失败

失败日志&#xff1a; 解决办法 1、使用 homebrew 安装相关依赖 brew install icu4c 安装完成后&#xff0c;设置环境变量 echo export PATH"/opt/homebrew/opt/icu4c77/bin:$PATH" >> ~/.zshrcecho export PATH"/opt/homebrew/opt/icu4c77/sbin:$PATH…

Springboot后端查询参数接收

1.实现方式 假设前端发送的接口&#xff1a; /users?nameJohn&age30 后端怎么接收里面的name和age呢&#xff1f;以及再发别的参数后端怎么接收呢&#xff1f; 1.比较简单的方式 当控制器方法的参数类型是简单类型&#xff08;如 String、Integer、Long 等&#xff09…