如何理解RL中的近端策略优化算法?
machine-learning
7
0

我知道强化学习的基础知识,但是要阅读arxiv PPO论文需要理解哪些术语?

学习和使用PPO的路线图是什么?

参考资料:
Stack Overflow
收藏
评论
共 4 个回答
高赞 时间 活跃

PPO是一种简单的算法,属于策略优化算法类(与基于值的方法(例如DQN)相对)。如果您“知道” RL基础知识(例如,如果您至少已精打细算地阅读了Sutton的书的第一章),那么逻辑上的第一步就是要熟悉策略梯度算法。您可以阅读本文萨顿新版书籍的第13章。此外,您还可以阅读TRPO上的这篇论文 ,这是PPO的第一作者的先前著作(该论文存在许多符号错误;请注意)。希望能有所帮助。 -梅迪

收藏
评论

我认为,为离散的动作空间(例如Cartpole-v1)实现比在连续的动作空间中实现更容易。但是对于连续动作空间,这是我在Pytorch中找到的最简单的实现,因为您可以清楚地看到它们如何获取mustd ,而在Openai Baselines和Spinning up或Stable Baselines等更著名的实现中,我是无法做到的。

RL冒险PPO

这些行来自上面的链接:

class ActorCritic(nn.Module):
    def __init__(self, num_inputs, num_outputs, hidden_size, std=0.0):
        super(ActorCritic, self).__init__()

        self.critic = nn.Sequential(
            nn.Linear(num_inputs, hidden_size),
            nn.ReLU(),
            nn.Linear(hidden_size, 1)
        )

        self.actor = nn.Sequential(
            nn.Linear(num_inputs, hidden_size),
            nn.ReLU(),
            nn.Linear(hidden_size, num_outputs),
        )
        self.log_std = nn.Parameter(torch.ones(1, num_outputs) * std)

        self.apply(init_weights)

    def forward(self, x):
        value = self.critic(x)
        mu    = self.actor(x)
        std   = self.log_std.exp().expand_as(mu)
        dist  = Normal(mu, std)
        return dist, value

和剪辑:

def ppo_update(ppo_epochs, mini_batch_size, states, actions, log_probs, returns, advantages, clip_param=0.2):
    for _ in range(ppo_epochs):
        for state, action, old_log_probs, return_, advantage in ppo_iter(mini_batch_size, states, actions, log_probs, returns, advantages):
            dist, value = model(state)
            entropy = dist.entropy().mean()
            new_log_probs = dist.log_prob(action)

            ratio = (new_log_probs - old_log_probs).exp()
            surr1 = ratio * advantage
            surr2 = torch.clamp(ratio, 1.0 - clip_param, 1.0 + clip_param) * advantage

我在YouTube上此视频的评论上方找到了链接:

arxiv见解PPO

收藏
评论

PPO(包括TRPO)会尝试保守地更新策略,而不会在每次策略更新之间对性能产生不利影响。

为此,您需要一种方法来评估每次更新后策略已更改了多少。通过查看更新的策略和旧策略之间的KL差异来完成此度量。

这成为一个受约束的优化问题,我们希望按照新策略和旧策略之间的KL差异不超过某个预定(或自适应)阈值的约束,朝着最大性能的方向更改策略。

使用TRPO,我们可以在更新期间计算KL约束,并找到该问题的学习率(通过Fisher矩阵和共轭梯度)。实现起来有些混乱。

使用PPO,我们通过将KL散度从约束变为惩罚项(例如类似于L1,L2权重惩罚(以防止权重增大较大的值))来简化问题。 PPO通过将策略比率(更新的策略与旧策略的比率)硬性限制在1.0左右的较小范围内,从而消除了一起计算KL差异的必要性,从而进行了其他修改,其中1.0表示新策略与旧策略相同。

收藏
评论

为了更好地理解PPO,查看本文的主要贡献是有帮助的,这些贡献是: (1)限制代理目标和(2)使用“随机梯度上升的多个时期来执行每个策略更新”。


首先,将这些要点放在原始PPO文件中

我们介绍了[PPO],这是一系列策略优化方法,它们使用多个随机梯度上升时间来执行每个策略更新 。这些方法具有信任区域[ TRPO ]方法的稳定性和可靠性,但实现起来要简单得多, 只需将几行代码更改为原始策略梯度实现即可 ,适用于更常规的设置(例如,使用联合的政策和价值功能),并具有更好的整体性能。


1.限制的替代物镜

限用替代目标是策略梯度目标的替代品,旨在通过限制您在每一步对策略所做的更改来提高培训稳定性。

对于原始的策略梯度(例如REINFORCE) 在阅读本指南之前,您应该熟悉或熟悉这些梯度。用于优化神经网络的目标类似于:

PG目标

这是您将在Sutton书其他 资源中看到的标准公式,例如,A形帽子可以是折现收益(如REINFORCE)或优势函数(如GAE )。通过针对网络参数的这种损失采取梯度上升步骤,您将激励导致更高报酬的行动。

常规策略梯度方法使用操作的对数概率(logπ(a | s))来跟踪操作的影响,但是您可以想象使用另一个函数来执行此操作。 本文介绍的另一个此类函数使用当前策略下的操作概率(π(a | s))除以您先前策略下的操作概率(π_old(a | s))。如果您熟悉,这看起来与重要性采样有点类似:

当量

当您的现行政策比政策更有可能采取行动时,该r(θ)将大于1;如果您当前的策略执行的操作比旧策略执行的可能性小,则该值将介于0和1之间。

现在,要使用该r(θ)建立目标函数,我们可以简单地将其换成对数π(a | s)项。这是在TRPO中完成的:

TRPO目标

但是,如果您的现行政策更有可能(例如多出100倍),那么在这里会发生什么? r(θ)往往会非常大,并导致采取可能会破坏您的政策的大梯度步骤。为了解决此问题和其他问题,TRPO增加了一些额外的限制(例如,KL Divergence约束)以限制该政策可以更改的数量并有助于确保其单调改进。

如果不将所有这些额外的花哨功能添加到目标函数中,该怎么办?事实证明,这就是PPO所做的。通过优化这种简单(但看起来很有趣)的替代代理目标,它可以获得相同的性能优势并避免了复杂性:

带注释的剪辑替代

最小化中的第一项(蓝色)与我们在TRPO目标中看到的(r(θ)A)项相同。第二项(红色)是将(r(θ))限制在(1-e,1 + e)之间的形式。 (在论文中,他们指出e的一个好值约为0.2,因此r可以在〜(0.8,1.2)之间变化)。然后,最后,将这两个术语的最小化(绿色)。

花点时间仔细研究方程式,确保您知道所有符号的含义以及数学上的含义。查看代码也可能有所帮助;这是OpenAI 基准anyrl-py实现中的相关部分。

大。

接下来,让我们看看L剪辑功能会产生什么效果。这是一张纸上的图表,绘制了当Advantage为正和负时裁剪目标的值:

剪辑简介

在图的左半部分,其中(A> 0),这是该动作对结果产生积极影响的地方。在图的右半部分,其中(A <0),这是该操作对结果产生负面影响的位置。

请注意,如果r值过高,则在左半部分会对其进行裁剪。如果在现行政策下采取的行动比在旧政策下更有可能采取的行动,就会发生这种情况。发生这种情况时,我们不想贪婪地走得太远(因为这只是我们政策的局部近似值和示例,因此如果走得太远就不会准确),因此我们限制了目标以防止从成长。 (这将在向后传递中阻止渐变-导致渐变为0的扁平线)。

在该图的右侧,该操作对结果产生了负面影响,我们看到该片段在0附近激活,这在当前策略下不太可能执行该操作。类似地,在我们已经采取了很大的步骤来降低可能性之后,该裁剪区域将阻止我们进行过多的更新以使该可能性大大降低。

因此,我们看到这两个裁剪区域都阻止我们变得过于贪婪,并试图立即进行过多更新,从而使该样本可以提供良好的估计。

但是为什么我们让r(θ)在图的最右边无限期地增长呢?首先,这似乎很奇怪,但是在这种情况下,是什么导致r(θ)变得很大呢?该区域的r(θ)增长将由梯度阶跃引起,这使我们的行动更有可能发生 ,结果使我们的政策更糟 。如果是这样,我们希望能够撤消该渐变步骤。正是L剪辑功能允许这样做。该函数在此处为负,因此坡度将告诉我们沿另一个方向行走,并且使动作发生的可能性与我们拧紧它的程度成正比。 (请注意,该图的最左侧有一个相似的区域,该区域动作良好,我们无意间使该动作不太可能发生。)

这些“撤消”区域解释了为什么我们必须在目标函数中包括奇怪的最小化项。它们对应于未修剪的r(θ)A,其值比修剪的版本低,并通过最小化返回。这是因为它们朝着错误的方向迈出了一步(例如,行动很好,但我们意外地降低了可能性)。如果我们没有在目标函数中包含最小值,则这些区域将是平坦的(梯度= 0),并且将防止我们纠正错误。

这是总结此图:

L剪辑图

这就是要点。限用替代目标只是您可以在常规政策梯度中使用的替代产品。裁剪限制了您可以在每个步骤中进行的有效更改,以提高稳定性,而最小化则使我们可以纠正错误,以防万一。我没有讨论的一件事是PPO目标形成本文中讨论的“下限”是什么意思。有关更多信息,我建议作者进行这一部分演讲。

2.政策更新的多个时期

与常规策略梯度方法不同,并且由于具有“受限制的替代目标”功能 ,PPO允许您在样本上运行多个梯度上升纪元,而不会造成破坏性的较大策略更新。这使您可以从数据中提取更多信息,并减少样品效率低下的情况。

PPO使用每个收集数据的N个并行参与者来运行该策略,然后对这些数据的微型批次进行采样,以使用Clipped Surrogate Objective函数训练K个时期。请参阅下面的完整算法(近似参数值是: K = 3-15, M = 64-4096, T (水平)= 128-2048):

PPO算法

并行参与者部分已由A3C论文普及,并已成为收集数据的相当标准的方式。

最新的部分是它们能够在轨迹样本上运行K个梯度上升纪元。正如他们在论文中指出的那样,最好对数据进行多次传递来运行香草策略梯度优化,以便您可以从每个样本中学到更多信息。但是,这对于香草方法在实践中通常是失败的,因为它们对本地样本采取了太多的步骤,这破坏了政策。另一方面,PPO具有内置机制来防止过多的更新。

对于每次迭代,在使用π_old(第3行)对环境进行采样之后,当我们开始运行优化(第6行)时,我们的策略π将完全等于π_old。因此,起初,我们的更新都不会被裁剪,因此我们保证可以从这些示例中学到一些东西。但是,当我们使用多个时期更新π时,目标将开始达到剪切极限,这些样本的梯度将变为0,并且训练将逐渐停止...直到我们进行下一次迭代并收集新样本。

....

到此为止。如果您有兴趣获得更好的理解,建议您深入研究原始文件 ,尝试自己实施,或者深入研究基线实施并使用代码。

[edit:2019/01/27]:为了获得更好的背景以及PPO与其他RL算法的关系,我也强烈建议您查看OpenAI的Spinning Up资源和实现

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号