PPO算法

博客介绍了在线学习和离线学习的概念,在线学习是同一Agent边互动边学习,离线学习是学习的Agent通过看别人玩来学习。还阐述了重要性采样方法,以及如何利用该技巧将在线学习转换为离线学习。最后重点讲解了PPO算法,其目的是控制与环境交互和更新参数的Model之间的差距。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在线学习和离线学习

  • 在线学习:和环境互动的Agent以及和要学习的Agent是同一个, 同一个Agent,一边和环境做互动,一边在学习。
  • 离线学习: 和环境互动及的Agent以和要学习的Agent不是同一个,学习的Agent通过看别人完来学习。

利用新的参数\theta\prime去采样一次,然后更新\theta多次。那么怎么做呢?利用重要性采样的方法。

重要性采样

E_{x\sim p}[f(x)] \approx \frac{1}{N}\sum_{i=1}^{N}f(x^i)

x^i表示从分布p(x)中采样数据,但如果我们无法从p(x)分布中采样数据,只能从另一个分布中采样q(x)x^i。对期望值进行修正

E_{x\sim p}[f(x)] = \int f(x)p(x)dx = \int f(x)\frac{p(x)}{q(x)}q(x)dx

然后可以改成对分布q(x)中的取期望值。

\int f(x)\frac{p(x)}{q(x)}q(x)dx=E_{x\sim q}[f(x)\frac{p(x)}{q(x)}]

q(x)分布中采样数据, 需要再乘以一个weight\frac{p(x)}{q(x)}以修正两个分布之间的差异。

E_{x\sim p}[f(x)] \approx E_{x\sim q}[f(x)\frac{p(x)}{q(x)}]

通过重要性采样技巧将在线学习转换为离线学习

利用\theta\prime去和环境做互动,利用搜集到的数据对\theta进行更新。当\theta更新到一定次数之后,再利用\theta\prime重新去和环境做互动。

 推导出新的目标函数J^{\theta^{\prime}}({\theta}), 表示利用\theta \prime去采样进而更新参数\theta。引用重要性采用的前提是这两个分布不能相差太多,否则结果就会不好,那如何去避免相差太多呢?这就是PPO在做的事情,在训练的时候多加一个限制, 希望\theta\theta^{\prime}越像越好。PPO的前身是TRPO

就是两个限制的位置是不同的,PPO在实做上比TRPO要更加容易。KL距离不是指的参数上的距离,而是表现上的距离, 而是action上的距离。

PPO算法

 对应的函数图像如下所示:(横轴为第一项的值,纵轴为clip函数的输出,当第一项小于(1- \varepsilon),输出1- \varepsilon,当第一项大于1+ \varepsilon,输出1+ \varepsilon, 否则介于两者之间的话直接输出第一项的值。

 示意图:在绿色的线和蓝色的线之间取最小的那个值。如果A>0,取左图中的红线,如果A<0,取右图中的红线为目标函数。

这个复杂公式的目的在于控制与环境交互的Model和跟新参数的Model之间的差距不要过大。具体为:

如果A>0, 意味着应该增加状态动作对的几率,也即希p_\theta望越大越好,但又限制其和p_{\theta \prime}的比值不能超过1+ \varepsilon。A<0的时候也是类似的。

 

### PPO算法的原理与实现 #### PPO算法的核心思想 PPO(Proximal Policy Optimization)是一种强化学习中的策略优化算法,其核心在于通过限制每次策略更新的变化幅度来提高训练的稳定性。具体来说,PPO引入了一个“剪切”机制,在损失函数中加入了一项用于控制新旧策略之间的差异[^1]。 为了进一步提升性能并简化优化过程,PPO还采用了两种主要形式:一种是基于惩罚的方法(即PPO-Penalty),另一种则是更常见的Clipped版本(即PPO-Clip)。这两种方式均旨在解决TRPO中存在的计算复杂度过高的问题,同时保持相近甚至更好的性能表现[^2]。 #### 数学表达式及其意义 在PPO中,目标是最小化以下损失函数: \[ L^{CLIP}(\theta) = \mathbb{E}_t [\min(r_t(\theta)\hat{A}_t, \text{clip}(r_t(\theta), 1-\epsilon, 1+\epsilon)\hat{A}_t)] \] 其中 \( r_t(\theta) = \frac{\pi_\theta(a_t|s_t)}{\pi_{\theta_{old}}(a_t|s_t)} \),表示当前策略相对于旧策略的概率比率;而 \(\hat{A}_t\) 则代表优势估计值。参数 \(\epsilon\) 控制着允许的最大变化范围,从而防止过大的梯度更新破坏收敛性[^1]。 对于PPO-Penalty而言,则是在原始目标函数的基础上增加了一个KL散度约束作为正则项,以此间接达到类似效果但无需显式的裁剪操作[^2]。 #### Python代码示例 下面展示的是一个简单的PPO实现框架,适用于经典的OpenAI Gym环境`CartPole-v0`: ```python import gym import torch import torch.nn as nn import torch.optim as optim class ActorCritic(nn.Module): def __init__(self, input_dim, output_dim): super(ActorCritic, self).__init__() self.actor = nn.Sequential( nn.Linear(input_dim, 64), nn.Tanh(), nn.Linear(64, output_dim), nn.Softmax(dim=-1) ) self.critic = nn.Sequential( nn.Linear(input_dim, 64), nn.Tanh(), nn.Linear(64, 1) ) def ppo(env_name='CartPole-v0', epochs=10, batch_size=512, clip_param=0.2): env = gym.make(env_name) state_dim = env.observation_space.shape[0] action_dim = env.action_space.n model = ActorCritic(state_dim, action_dim) optimizer = optim.Adam(model.parameters(), lr=3e-4) # Training loop omitted for brevity... env.close() ``` 此段代码仅展示了模型架构部分以及初始化逻辑,完整的训练流程需包含数据收集、优势计算等多个环节[^3]。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值