了解PPO算法(Proximal Policy Optimization)

news2024/9/27 17:34:53

Proximal Policy Optimization (PPO) 是一种强化学习算法,由 OpenAI 提出,旨在解决传统策略梯度方法中策略更新过大的问题。PPO 通过引入限制策略更新范围的机制,在保证收敛性的同时提高了算法的稳定性和效率。

PPO算法原理

PPO 算法的核心思想是通过优化目标函数来更新策略,但在更新过程中限制策略变化的幅度。具体来说,PPO 引入了裁剪(Clipping)和信赖域(Trust Region)的思想,以确保策略不会发生过大的改变。

PPO算法公式

PPO 主要有两种变体:裁剪版(Clipped PPO)和信赖域版(Adaptive KL Penalty PPO)。本文重点介绍裁剪版的 PPO。

  • 旧策略:

    \pi_{\theta_{\text{old}}}(a|s)

    其中,\theta_{\text{old}}​ 是上一次更新后的策略参数。

  • 计算概率比率:

    r_t(\theta) = \frac{\pi_{\theta}(a_t|s_t)}{\pi_{\theta_{\text{old}}}(a_t|s_t)}
  • 裁剪后的目标函数:

    L^{\text{CLIP}}(\theta) = \mathbb{E}_t \left[ \min \left( r_t(\theta) \hat{A}_t, \text{clip}(r_t(\theta), 1 - \epsilon, 1 + \epsilon) \hat{A}_t \right) \right]

    其中,\hat{A}_t​ 是优势函数(Advantage Function),\epsilon 是裁剪范围的超参数,通常取值为0.2。

  • 更新策略参数:

    a_{\text{new}} = \arg\max_{\theta} L^{\text{CLIP}}(\theta)
PPO算法的实现

下面是用Python和TensorFlow实现 PPO 算法的代码示例:

import tensorflow as tf
import numpy as np
import gym

# 定义策略网络
class PolicyNetwork(tf.keras.Model):
    def __init__(self, action_space):
        super(PolicyNetwork, self).__init__()
        self.dense1 = tf.keras.layers.Dense(128, activation='relu')
        self.dense2 = tf.keras.layers.Dense(128, activation='relu')
        self.logits = tf.keras.layers.Dense(action_space, activation=None)
    
    def call(self, inputs):
        x = self.dense1(inputs)
        x = self.dense2(x)
        return self.logits(x)

# 定义值函数网络
class ValueNetwork(tf.keras.Model):
    def __init__(self):
        super(ValueNetwork, self).__init__()
        self.dense1 = tf.keras.layers.Dense(128, activation='relu')
        self.dense2 = tf.keras.layers.Dense(128, activation='relu')
        self.value = tf.keras.layers.Dense(1, activation=None)
    
    def call(self, inputs):
        x = self.dense1(inputs)
        x = self.dense2(x)
        return self.value(x)

# 超参数
learning_rate = 0.0003
clip_ratio = 0.2
epochs = 10
batch_size = 64
gamma = 0.99

# 创建环境
env = gym.make('CartPole-v1')
obs_dim = env.observation_space.shape[0]
n_actions = env.action_space.n

# 创建策略和值函数网络
policy_net = PolicyNetwork(n_actions)
value_net = ValueNetwork()

# 优化器
policy_optimizer = tf.keras.optimizers.Adam(learning_rate)
value_optimizer = tf.keras.optimizers.Adam(learning_rate)

def get_action(observation):
    logits = policy_net(observation)
    action = tf.random.categorical(logits, 1)
    return action[0, 0]

def compute_advantages(rewards, values, next_values, done):
    advantages = []
    gae = 0
    for i in reversed(range(len(rewards))):
        delta = rewards[i] + gamma * next_values[i] * (1 - done[i]) - values[i]
        gae = delta + gamma * gae
        advantages.insert(0, gae)
    return np.array(advantages)

def ppo_update(observations, actions, advantages, returns):
    with tf.GradientTape() as tape:
        old_logits = policy_net(observations)
        old_log_probs = tf.nn.log_softmax(old_logits)
        old_action_log_probs = tf.reduce_sum(old_log_probs * tf.one_hot(actions, n_actions), axis=1)
        
        logits = policy_net(observations)
        log_probs = tf.nn.log_softmax(logits)
        action_log_probs = tf.reduce_sum(log_probs * tf.one_hot(actions, n_actions), axis=1)
        
        ratio = tf.exp(action_log_probs - old_action_log_probs)
        surr1 = ratio * advantages
        surr2 = tf.clip_by_value(ratio, 1.0 - clip_ratio, 1.0 + clip_ratio) * advantages
        policy_loss = -tf.reduce_mean(tf.minimum(surr1, surr2))
    
    policy_grads = tape.gradient(policy_loss, policy_net.trainable_variables)
    policy_optimizer.apply_gradients(zip(policy_grads, policy_net.trainable_variables))

    with tf.GradientTape() as tape:
        value_loss = tf.reduce_mean((returns - value_net(observations))**2)
    
    value_grads = tape.gradient(value_loss, value_net.trainable_variables)
    value_optimizer.apply_gradients(zip(value_grads, value_net.trainable_variables))

# 训练循环
for epoch in range(epochs):
    observations = []
    actions = []
    rewards = []
    values = []
    next_values = []
    dones = []
    
    obs = env.reset()
    done = False
    while not done:
        obs = obs.reshape(1, -1)
        observations.append(obs)
        action = get_action(obs)
        actions.append(action)
        
        value = value_net(obs)
        values.append(value)
        
        obs, reward, done, _ = env.step(action.numpy())
        rewards.append(reward)
        dones.append(done)
        
        if done:
            next_values.append(0)
        else:
            next_value = value_net(obs.reshape(1, -1))
            next_values.append(next_value)
    
    returns = compute_advantages(rewards, values, next_values, dones)
    advantages = returns - values

    observations = np.concatenate(observations, axis=0)
    actions = np.array(actions)
    returns = np.array(returns)
    advantages = np.array(advantages)
    
    ppo_update(observations, actions, advantages, returns)

    print(f'Epoch {epoch+1} completed')
总结

PPO 算法通过引入裁剪机制和信赖域约束,限制了策略更新的幅度,提高了训练过程的稳定性和效率。其简单而有效的特性使其成为目前强化学习中最流行的算法之一。通过理解并实现 PPO 算法,可以更好地应用于各种强化学习任务,提升模型的性能。

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

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

相关文章

Python程序封装成Windows服务实践

1. WinSW 工具概述 WinSW(Windows Service Wrapper)是一个轻量级的、开源的工具,用于将任何可执行文件(包括exe、jar、脚本文件等)包装成一个Windows服务。这意味着,原本设计为命令行应用或需要手动启动的…

如何整合生成的人工智能?(GenAI)为你未来的工作增加动力

生成人工智能(GenAI)它发展迅速,以前所未有的速度取得了突破。人工智能将继续改变各行各业,预计2023年至2030年的年增长率将达到37.3%。由于一种新的知识工作者现在面临被取代的风险,生成式人工智能的惊人崛起进一步加剧了这种紧迫性。据《未…

高并发内存池联调问题

断言报错1 在这里插入图片描述 排查原因 实际 actualNum 值并没有大于一 断点报错。 经过排查,此处assert(actualNum > 0) 判断条件应该是大于零,否则或许if判断条件无法执行。 跑通结果: 2

大数据之Hadoop平台的搭建

实验环境 三台虚拟机 master slave1 slave2 服务器集群单节点,机器最低配置:双核 CPU、8GB 内存、100G 硬盘运行环境CentOS 7.4服务和组件服务和组件根据实验需求安装 1实验过程 1.1实验任务一:配置 Linux 系统基础环境 1.1.1步骤一&a…

漂亮的不像话的网站首屏,直接勾起了用户浏览欲望。

漂亮大气的网站首屏页面可以激发用户的浏览欲望,主要通过以下几个方面的设计和呈现来实现: 引人注目的视觉效果:使用高质量的图片、精心设计的图形和动画效果来吸引用户的眼球。这些视觉元素应当与网站的主题和品牌形象相符,并能够…

springboot“小鱼在乎”日程计划系统-计算机毕业设计源码51307

摘要 本文介绍了一种基于微信小程序和Spring Boot后端服务的“小鱼在乎”日程计划系统。该系统结合了前端微信小程序的便捷交互与后端Spring Boot框架的稳健性能,为用户提供了一款功能全面、体验出色的日程管理工具。 “小鱼在乎”日程计划系统涵盖了多种功能&#…

提升困难生学工支持:智慧校园的新功能介绍

智慧校园的学工管理系统内嵌的困难生信息管理功能,是一个综合性的服务平台,专注于精准识别校园内的经济困难学生,并给予他们必要的帮助与关怀,确保每位学生都能在公平的环境中追求学业和个人成长。这一功能通过一系列信息化手段&a…

Linux Web服务器

文章目录 一、web服务1.1 http1.2 Web1.3 web中间件 二、 Apache服务的搭建与配置2.1 服务安装基本思路三、 Nginx 配置Web服务 一、web服务 以赛促学的内容:因不清楚出题使用何种服务,特将两种服务归纳总结. HTTP是数据传输的规则,Web是基于HTTP协议的服务。当今…

基于ry-vue-plus的代码生成工具整合自定义模版

前言 鉴于自己最近参加一个比赛,整区块链应用,因此部分核心数据需要往区块链网络的数据库中存储。用的区块链框架为FISCO-BCOS。FISCO-BCOS官方提供一一个预编译合约,名叫Table.sol (CRUD合约),能让我们通过CRUD合约像使用一般关系型数据库中…

【漏洞复现】WordPress插件Recall CVE-2024-32709 SQL注入漏洞

0x01 产品简介 WordPress是一款免费开源的内容管理系统(CMS),最初是一个博客平台,但后来发展成为一个功能强大的网站建设工具,适用于各种类型的网站,包括个人博客、企业网站、电子商务网站等,并逐步演化成一款内容管理…

bug - while parsing file included at

bug 如下 找到这个对应文件tb_top.sv的对应行,发现是一个 include "inc_tb_tests_xxx.sv" 问题点:头文件,重复定义,那么 解决方法- 在被include的文件首尾加入 ifndef MY_TRANSACTION__SV define MY_TRANSACTION__SV …

【经典链表OJ】环形链表

一、题目要求 给你一个链表的头节点 head ,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置&…

昇思25天学习打卡营第16天|应用实践之Vision Transformer图像分类

基本介绍 今天同样是图像分类任务,也更换了模型,使用的时候计算机视觉版的Transformer,即Vision Transformer,简称ViT。Transformer本是应用于自然语言处理领域的模型,用于处理语言序列,而要将其应用于图像…

百度网盘青春版网页版上线

不知道还有多少小伙伴记得百度网盘曾经出过一个青春版,原因是21年相关部门发布通知《工业和信息化部关于开展信息通信服务感知提升行动的通知》其中就有一条: 明确指出网盘向免费用户提供的上传和下载最低速率应满足基本的下载需求 正所谓上有政策下有对…

常用的设计模式和使用案例汇总

常用的设计模式和使用案例汇总 【一】常用的设计模式介绍【1】设计模式分类【2】软件设计七大原则(OOP原则) 【二】单例模式【1】介绍【2】饿汉式单例【3】懒汉式单例【4】静态内部类单例【5】枚举(懒汉式) 【三】工厂方法模式【1】简单工厂模式&#xf…

AI绘画小白必备!Stable Diffusion常用插件合集,好用推荐!(附插件下载)

前言 宝子们,早上好啊~Stable Diffusion 常用插件,月月已经给大家整理好了,自取就好。 拥有这些SD常用插件,让您的图像生成和编辑过程更加强大、直观、多样化。以下插件集成了一系列增强功能,覆盖从自动补全提示词到…

设置DepthBufferBits和设置DepthStencilFormat的区别

1)设置DepthBufferBits和设置DepthStencilFormat的区别 2)Unity打包exe后,游戏内拉不起Steam的内购 3)Unity 2022以上Profiler.FlushMemoryCounters耗时要怎么关掉 4)用GoodSky资产包如何实现昼夜播发不同音乐功能 这是…

东旭蓝天被控股股东占用78亿:近七年业绩奇差,或面临退市

《港湾商业观察》施子夫 张楠 在7月5日一口气发了超过30份公告后,终于让投资者对于东旭蓝天2023年和今年一季度经营业绩有了更清晰的观察。 与此同时,东旭蓝天(下称)也收到了深交所的关注函。种种不利因素之下,上市…

【竞技宝 】欧洲杯:赛事水货盘点

本届欧洲杯接近尾声,有些球员抓住机会趁势崛起,踢出了身价。可惜还有一些球员的表现无法让球迷和媒体满意,下面我们就来盘点下本届欧洲杯的水货球员,看看哪些人因为糟糕的表现上榜? 格瓦迪奥尔(克罗地亚) 本届欧洲杯是克罗地亚黄金一代球员的谢幕之战,原本格瓦迪奥尔作为球队…

凌凯科技前五大客户依赖症加剧:研发费用率骤降,应收账款大增

《港湾商业观察》黄懿 6月13日,上海凌凯科技股份有限公司(下称“凌凯科技”)在港交所提交上市申请,拟于主板上市,华泰国际为其独家保荐人。 凌凯科技致力于提供小分子化合物技术和产品解决方案,专注于制药…