【ChatGPT 默认强化学习策略】PPO 近端策略优化算法

PPO 近端策略优化算法

    • PPO = 概率比率裁剪 + 演员-评论家算法
      • 演员-评论家算法:多智能体强化学习核心框架
      • 概率比率裁剪:逐步进行变化的方法
        • PPO 目标函数的设计
          • 重要性采样
          • KL散度

 


PPO = 概率比率裁剪 + 演员-评论家算法

论文链接:https://arxiv.org/abs/1707.06347

OpenAI 提出 PPO 旨在解决一些在策略梯度方法中常见的问题,特别是与训练稳定性和样本效率有关的问题。

能在提高学习效率和保持训练稳定性之间找到平衡。

策略梯度方法的问题:

  1. 策略更新过快
    在传统的策略梯度方法中,如果每次更新都大幅度改变策略,可能会导致学习过程变得非常不稳定。
    这种大幅更新可能会使得智能体忘记之前有效的策略,或者探索到低效的行为区域。

  2. 数据利用率低
    许多强化学习算法,特别是那些基于样本的算法,需要大量的数据才能学到有效的策略。
    PPO试图通过更有效地使用数据来缓解这个问题,使得从每个数据样本中学到更多信息。

  3. 训练周期长
    由于数据利用率低,传统的强化学习算法通常需要很长的训练周期才能收敛到一个好的策略。
    PPO通过改进学习算法来减少所需的训练时间。

PPO算法在演员-评论家的框架基础上,使用了 概率比率裁剪 技巧来控制策略更新的幅度,以确保训练的稳定性和性能。

演员-评论家算法:多智能体强化学习核心框架

请猛击:演员-评论家算法:多智能体强化学习核心框架

 


概率比率裁剪:逐步进行变化的方法

想象你有两个不同的蛋糕配方,这个比率就像是告诉你,使用新配方做蛋糕的可能性与旧配方相比有多大的变化。

如果我们的新策略和旧策略差别太大,那就像是突然完全改变蛋糕的配方,可能会做出一个很不一样的蛋糕,我们不确定它会好吃,还是不好吃。

所以,PPO通过计算概率比率来确保新策略不会偏离旧策略太远。

在每次策略更新时,它计算新策略和旧策略之间的比率,并通过限制这个比率的大小来裁剪更新幅度,以防止过大的改变。

解决如何安全地逐步进行变化,控制变化的方法。

具体请见目标函数的设计。

PPO 目标函数的设计


在测试中,PPO 基本在每个任务都是第一梯队。

那我们说一下 PPO 到底做了什么,居然比 A2C (另一种演员-评论家的改进算法)还要好。

近端,主要体现在其目标函数的设计上。

在PPO(近端策略优化)算法中,结合使用重要性采样和KL散度实现了主要的目标。

重要性采样:

  • 探索与利用的平衡:重要性采样帮助算法判断新策略(新动作)与旧策略(旧动作)相比的效果。如果新策略比旧的好,算法会更倾向于采用新策略(这是“利用”)。但同时,算法也会尝试一些不同的策略(这是“探索”),以找到可能更好的解决方案。
  • 渐进式更新:通过重要性采样,PPO能够逐渐、小心地改进策略,而不是一次性做出巨大的改变。这样的逐步改进有助于算法稳定地学习和适应新策略。

KL散度:

  • 防止过度探索:KL散度用于确保新策略不会偏离旧策略太远。这个约束防止了算法在探索新策略时过度激进,从而避免了可能导致性能下降的大幅度策略变动。
  • 维持学习的稳定性:通过限制新旧策略之间的差异,KL散度有助于保持学习过程的稳定性。这种稳定性对于复杂的学习任务特别重要,因为它减少了学习过程中的不确定性和波动。
重要性采样

你正在玩一个跳舞游戏。

在这个游戏里,你有一系列的舞蹈动作可以选择。

刚开始时,你只会一些基础的动作(这是你的“旧策略”)。

现在,你学会了一些新的、酷炫的舞蹈动作(这是你的“新策略”)。

在这个游戏里,你想要知道这些新动作是否真的比旧的好。

但是,你不能一次就完全改变你的舞蹈风格,因为这样你可能会跳得很差。

所以,你需要一种方法来慢慢地、安全地加入新动作。

使用重要性采样,你可以基于旧动作的经验来估计新动作的效果。

比如,如果新动作只是在旧动作的基础上做了一些小改动(比如多举了一下手),你可以推测这个新动作会有类似的效果。

通过比较,你可以决定哪些新动作真的相似,值得加入到你的舞蹈里,同时确保你的整体舞蹈还是很流畅。

不仅链接了新旧动作,还是渐进式更新。

在这个过程中,你不需要每次都完全重新学习动作。

相反,你只是在旧动作的基础上做一些小的调整。

这样,你可以逐渐地、稳步地改进你的动作,而不是一下子完全改变。

KL散度

你的舞蹈老师给了你一个规则:虽然可以尝试新动作,但是不能让你的舞蹈风格变化太大,否则会失去控制,可能跳得一团糟。

KL散度就像是舞蹈老师的一条规则,它告诉你新舞蹈和旧舞蹈之间的差别。

如果差别太大,就意味着你可能偏离了舞蹈的基本风格太远,需要调整一下。

这样,你就可以在尝试新动作的同时,保持你的舞蹈整体风格和质量。

仅仅使用重要性采样可能会导致策略变化过大,特别是在新策略与旧策略差异显著时。

KL散度提供了一种衡量策略之间差异的方法。

通过限制新旧策略之间的KL散度,PPO能够保证学习过程的连续性和平滑性,减少策略更新的剧烈波动。

数学公式:

  • J P P O θ ′ ( θ ) = J θ ′ ( θ ) − β K L ( θ , θ ′ ) ⏟ Regularization = E ( s t , a t ) ∼ π θ ′ [ p θ ( a t ∣ s t ) p θ ′ ( a t ∣ s t ) A θ ′ ( s t , a t ) ] − β K L ( θ , θ ′ ) \begin{aligned} J_{\mathrm{PPO}}^{\theta^{\prime}}(\theta)& =J^{\theta^{\prime}}(\theta)-\underbrace{\beta\mathrm{KL}(\theta,\theta^{\prime})}_{\text{Regularization}} \\ &=\mathbb{E}_{(s_t,a_t)\sim\pi_{\theta^{\prime}}}\left[\frac{p_\theta\left(a_t\mid s_t\right)}{p_{\theta^{\prime}}\left(a_t\mid s_t\right)}A^{\theta^{\prime}}\left(s_t,a_t\right)\right]-\beta\mathrm{KL}(\theta,\theta^{\prime}) \end{aligned} JPPOθ(θ)=Jθ(θ)Regularization βKL(θ,θ)=E(st,at)πθ[pθ(atst)pθ(atst)Aθ(st,at)]βKL(θ,θ)

这个公式是近端策略优化(PPO)算法中的一个重要部分,它包含了重要性采样和KL散度。

  1. 重要性采样

    • 公式的这部分: p θ ( a t ∣ s t ) p θ ′ ( a t ∣ s t ) \frac{p_\theta(a_t | s_t)}{p_{\theta'}(a_t | s_t)} pθ(atst)pθ(atst),表示的是重要性采样比率。
    • 这里, p θ ′ ( a t ∣ s t ) p_{\theta'}(a_t | s_t) pθ(atst) 是旧策略(即上一次更新前的策略)在状态(s_t)下选择动作(a_t)的概率。
    • p θ ( a t ∣ s t ) p_\theta(a_t | s_t) pθ(atst) 是新策略(即当前更新的策略)在相同状态下选择同一动作的概率。
    • 通过这个比率,我们可以量化新旧策略之间在选择特定动作上的差异。
  2. 优势函数 A θ ′ ( s t , a t ) A^{\theta'}(s_t, a_t) Aθ(st,at)

    • 公式中的 A θ ′ ( s t , a t ) A^{\theta'}(s_t, a_t) Aθ(st,at) 是优势函数,它评估在特定状态下采取某个动作相对于平均情况的好坏。
    • 优势函数用于量化一个特定动作比平均情况要好或坏多少。
  3. 期望值 E \mathbb{E} E

    • E ( s t , a t ) ∼ π θ ′ [ … ] \mathbb{E}_{(s_t,a_t)\sim\pi_{\theta'}}[…] E(st,at)πθ[] 表示对于由旧策略 π θ ′ \pi_{\theta'} πθ 生成的状态和动作的期望值。
    • 这意味着我们在计算这个公式时,考虑的是在旧策略下可能发生的所有状态和动作组合。
  4. KL散度

    • 公式中的 K L ( θ , θ ′ ) \mathrm{KL}(\theta, \theta') KL(θ,θ) 代表KL散度,它是一种衡量两个概率分布差异的方法。
    • 在这里,它用来衡量新策略和旧策略之间的差异。
    • β \beta β是一个调节参数,它控制了我们对策略变化的惩罚强度。KL散度越大,意味着新旧策略差异越大。
  5. 整体公式

    • 整个公式的第一部分, E ( s t , a t ) ∼ π θ ′ [ … ] \mathbb{E}_{(s_t,a_t)\sim\pi_{\theta'}}[…] E(st,at)πθ[],计算的是在旧策略下,采用新策略能带来多少优势。
    • 第二部分, − β K L ( θ , θ ′ ) -\beta\mathrm{KL}(\theta, \theta') βKL(θ,θ),则是在控制新策略不要偏离旧策略太远的约束。

所以,这个公式基本上是在做两件事:

  • 一方面,它试图找到一个新策略,使得在旧策略下的表现更好;
  • 另一方面,它确保新策略不会与旧策略差异太大,从而保持学习的稳定性。

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

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

相关文章

Redis缓存穿透,缓存击穿,缓存雪崩

文章目录 Redis缓存穿透,缓存击穿,缓存雪崩1. 缓存穿透1.1 解决方案1:缓存空数据1.2 解决方案2:使用布隆过滤器1.2.1 布隆过滤器介绍 2. 缓存击穿2.1 解决方案1:互斥锁2.2 解决方案2:逻辑过期 3. 缓存雪崩3…

摄影-基础知识

光圈,快门,感光度决定了一张相片的受光程度 光圈 瞳孔 快门 约等于 眼皮(但是实际上并不是,更像镜头盖) 感光度 视网膜上的感光能力 光圈越大 景深越大,也就是画面越模糊 快门时间越短,越能抓住某个瞬间 快门时间…

Single-Image Crowd Counting via Multi-Column Convolutional Neural Network

Single-Image Crowd Counting via Multi-Column Convolutional Neural Network 论文背景人群密度方法过去的发展历史早期方法基于轨迹聚类的方法基于特征回归的方法基于图像的方法 Multi-column CNN用于人群计数基于密度图的人群计数通过几何自适应核生成密度图密度图估计的多列…

RedisTemplate序列化

SpringBoot整合Redis,配置RedisTemplate序列化。如果使用StringRedisTemplate,那么不需要配置序列化,但是StringRedisTemplate只能存储简单的String类型数据,如图: 如果使用StringRedisTemplate存储一个常规对象&#…

详解 MySql InnoDB 的 MVCC 实现机制

目录 一. 前言 二. 认识 MVCC 2.1. 什么是 MVCC? 2.2. 什么是当前读和快照读? 2.3. 当前读、快照读和 MVCC 的关系 2.4. MVCC 能解决什么问题,好处是什么? 2.5. 小结 三. MVCC 的实现原理 3.1. 隐式字段 3.2. undo 日志…

QT的信号与槽

QT的信号与槽 文章目录 QT的信号与槽前言一、QT 打印"hello QT"的dome二、信号和槽机制?二、信号与槽的用法1、QT5的方式1. 无参的信号与槽的dome2.带参的信号与槽dome 2、QT4的方式3、C11的语法 Lambda表达式1、函数对象参数2、操作符重载函数参数3、可修…

STM32存储左右互搏 SPI总线读写FRAM MB85RS2M

STM32存储左右互搏 SPI总线读写FRAM MB85RS2M 在中低容量存储领域,除了FLASH的使用,,还有铁电存储器FRAM的使用,相对于FLASH,FRAM写操作时不需要预擦除,所以执行写操作时可以达到更高的速度,其…

SAP 资产管理后台配置之设定主数据字段

前阵子给财务创建了一个固定资产类型,但同事使用时发现字段跟平时不一样。 正常是有下面这些标签页的 然后我找到主数据屏幕格式的配置里发现 发现格式默认错了 应该是默认我司的自定义格式ZSAP 但是改成ZSAP还是不会生效 需要给这个资产分类重新分配一下字段标签页…

redis安装与配置(Ubuntu)

目录 1. 切换到 root 用户 2. 搜索安装包 3. 安装 redis 4. 查看 redis 是否正常存在 5. 修改ip 6. 重新启动服务器 7. 连接服务器 1. 切换到 root 用户 通过 su 命令切换到 root 用户。 2. 搜索安装包 apt search redis 这里安装的是下面的版本: 3. 安装 …

经典卷积神经网络-ResNet

经典卷积神经网络-ResNet 一、背景介绍 残差神经网络(ResNet)是由微软研究院的何恺明、张祥雨、任少卿、孙剑等人提出的。ResNet 在2015 年的ILSVRC(ImageNet Large Scale Visual Recognition Challenge)中取得了冠军。残差神经网络的主要贡献是发现了…

Vue中全局事件总线的配置和原理

实现任意组件之间的通信 任意组件通信的原理: 1、实现任意组件之间的通信,需要一个傀儡。这个傀儡既能被vm访问到,也能被VueComponent访问。 2、VueComponent.prototype.proto Vue.prototype为图上1.0黄色的线路。是Vue让组件实例对象VueComponent可以访问到Vue原…

跟着cherno手搓游戏引擎【3】事件系统和预编译头文件

不多说了直接上代码,课程中的架构讲的比较宽泛,而且有些方法写完之后并未测试。所以先把代码写完。理解其原理,未来使用时候会再此完善此博客。 文件架构: Event.h:核心基类 #pragma once #include"../Core.h" #inclu…