策略梯度算法

在强化学习中,我们唯一需要做的就是调整演员里面的策略,使得演员可以得到最大的奖励。演员里面的策略决定了演员的动作,即给定一个输入,它会输出演员现在应该要执行的动作。策略一般记作π。假设我们使用深度学习来做强化学习,策略就是一个网络。网络里面有一些参数,我们用 θ来代表π的参数。网络的输入是智能体看到的东西,如果让智能体玩视频游戏,智能体看到的东西就是游戏的画面。智能体看到的东西会影响我们训练的效果。例如,在玩游戏的时候, 也许我们觉得游戏的画面是前后相关的,所以应该让策略去看从游戏开始到当前这个时间点之间所有画面的总和。因此我们可能会觉得要用到循环神经网络(recurrent neural network,RNN)来处理它,不过这样会比较难处理。我们可以用向量或矩阵来表示智能体的观测,并将观测输入策略网络,策略网络就会输出智能体要采取的动作。因为我们要让奖励越大越好,所以可以使用++梯度上升(gradient ascent)来最大化期望奖励。一般策略梯度(policy gradient,PG)++采样的数据只会用一次。我们采样这些数据,然后用这些数据更新参数,再丢掉这些数据。接着重新采样数据,才能去更新参数。

策略梯度实现技巧

技巧 1:添加基线

第一个技巧:添加基线(baseline)。如果给定状态 s采取动作 a,整场游戏得到正的奖励,就要增加 (s,a)的概率。如果给定状态 s执行动作 a,整场游戏得到负的奖励,就要减小 (s,a)的概率。但在很多游戏里面,奖励总是正的,最低都是 0。比如打乒乓球游戏, 分数为 0 ~ 21 分,所以R(τ)总是正的。

为了解决奖励总是正的的问题,我们可以把奖励减 b,其中,b称为基线。通过这种方法,我们就可以让 R(τ)−b 这一项有正有负。如果我们得到的总奖励R(τ)>b,就让(s,a) 的概率上升。如果R(τ)<b,就算R(τ)是正的,值很小也是不好的,我们就让(s,a)的概率下降,让这个状态采取这个动作的分数下降。b怎么设置呢?我们可以对 τ的值取期望, 计算τ的平均值,令b≈E[R(τ)]。 所以在训练的时候,我们会不断地把 R(τ) 的值记录下来,会不断地计算R(τ) 的平均值,把这个平均值当作 b来使用。 这样就可以让我们在训练的时候,R(τ)−b 是有正有负的,这是第一个技巧。

技巧 2:分配合适的分数

给每一个动作分配合适的分数(credit)。如果在同一个回合里面,在同一场游戏里面,所有的状态-动作对使用同样的奖励项进行加权,那这样显然是不公平的,因为在同一场游戏里面,也许有些动作是好的,有些动作是不好的。

一个做法是计算某个状态-动作对的奖励的时候,不把整场游戏得到的奖励全部加起来,只计算从这个动作执行以后得到的奖励。因为这场游戏在执行这个动作之前发生的事情是与执行这个动作是没有关系的,所以在执行这个动作之前得到的奖励都不能算是这个动作的贡献。我们把执行这个动作以后发生的所有奖励加起来,才是这个动作真正的贡献。

接下来更进一步,我们把未来的奖励做一个折扣,为什么要把未来的奖励做一个折扣呢?因为虽然在某一时刻,执行某一个动作,会影响接下来所有的结果(有可能在某一时刻执行的动作,接下来得到的奖励都是这个动作的功劳),但在一般的情况下,时间拖得越长,该动作的影响力就越小。 比如在第2个时刻执行某一个动作, 那在第3个时刻得到的奖励可能是在第2个时刻执行某个动作的功劳,但是在第 100 个时刻之后又得到奖励,那可能就不是在第2个时刻执行某一个动作的功劳。

综合以上技巧

实际上就是这么实现的。b可以是依赖状态(state-dependent)的,事实上 b通常是一个网络估计出来的,它是一个网络的输出。我们把 R-b这一项称为优势函数(advantage function)。优势函数取决于 s和 a,我们就是要计算在某个状态 s 采取某个动作 a 的时候,优势函数的值。优势函数的意义是,假设我们在某一个状态s_t 执行某一个动作 a_t,相较于其他可能的动作,a_t有多好。优势函数在意的不是绝对的好,而是相对的好,即相对优势(relative advantage)。因为在优势函数中,我们会减去一个基线 b,所以这个动作是相对的好,不是绝对的好。 优势函数通常可以由一个网络估计出来,这个网络称为评论员(critic)。

on-policy 和 off-policy 的区别

  • 如果要学习的 agent 跟和环境互动的 agent 是同一个的话, 这个叫做on-policy(同策略)

  • 如果要学习的 agent 跟和环境互动的 agent 不是同一个的话, 那这个叫做off-policy(异策略)

重要性采样(Importance Sampling,IS)

对于ー个随机变量,通常用概率密度函数来刻画该变量的概率分布特性。具体来说,给定随机变量的一个取值,可以根据概率密度函数来计算该值对应的概率(密度)。反过来,也可以根据概率密度函数提供的概率分布信息来生成随机变量的一个取值,这就是采样。因此,从某种意义上来说,采样是概率密度函数的逆向应用。与根据概率密度函数计算样本点对应的概率值不同,采样过程往往没有那么直接,通常需要根据待采样分布的具体特点来选择合适的采样策略。

重要性采样有一些问题。虽然理论上你可以把 p 换成任何的 q。但是在实现上,p 和 q 不能差太多。差太多的话,会有一些问题。所以需要使用Proximal Policy Optimization (PPO)来约束p和q所输出的动作的KL 散度(KL divergence)

第四章习题链接:https://datawhalechina.github.io/easy-rl/#/chapter4/chapter4_questions&keywords

第五章习题链接:https://datawhalechina.github.io/easy-rl/#/chapter5/chapter5_questions&keywords