了解RL中的近端策略优化算法的方法是什么?

时间:2017-09-26 09:36:43

标签: machine-learning reinforcement-learning

我知道强化学习的基础知识,但是为了能够阅读arxiv PPO paper需要了解哪些术语?

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

3 个答案:

答案 0 :(得分:9)

PPO,包括TRPO试图保守地更新政策,而不会在每次政策更新之间产生不利影响。

要执行此操作,您需要一种方法来衡量每次更新后策略的更改量。通过查看更新的策略与旧策略之间的KL差异来完成此度量。

这成为一个受约束的优化问题,我们希望在最大性能方向上改变策略,遵循新策略与旧策略之间的KL差异不超过某些预定义(或自适应)阈值的约束。

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

使用PPO,我们通过将KL偏差从约束转换为惩罚项来简化问题,类似于例如L1,L2权重惩罚(以防止权重增大的值)。 PPO通过将政策比率(更新的政策与旧政策的比率)硬限制在1.0左右的小范围内,消除了共同计算KL分歧的需要,进行了额外的修改,其中1.0表示新政策与旧政策相同。 / p>

答案 1 :(得分:8)

PPO是一种简单的算法,属于策略优化算法类(与基于值的方法(如DQN)相反)。如果你"知道" RL基础知识(我的意思是,如果你至少仔细阅读过Sutton's book的第一章),那么第一个逻辑步骤是熟悉策略梯度算法。您可以阅读this paperSutton's book新版本的第13章。此外,您还可以阅读TRPO上的this paper,这是PPO第一作者以前的作品(本文有很多符号错误;请注意)。希望有所帮助。 --Mehdi

答案 2 :(得分:1)

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

RL-Adventure 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 insights PPO