深度强化学习笔记:策略梯度

本文是对datawhalechina.github.io的深度强化学习教程的笔记和适当精简
原文地址:https://datawhalechina.github.io/easy-rl/

0x01 引子

强化学习中,agent(玩家)面对的是一个马尔可夫决策模型(MDP)。状态集合 S S S、策略集合 A A A和回报集合 R R R是给定的,我们无法施加改动。

为了获得更高的的收益,agent只能通过选择集合 A A A中“合适”的元素作为在给定状态之下的动作, 从动作中获取回报。Agent在各种状态 s ∈ S s \in S sS下选择动作的原则称为策略,记为 π \pi π

这里,策略 π \pi π在每个状态下选择的动作可能是确定的,也可能是不确定的(用概率描述),即纯策略或者混合策略。

Agent如何选择 a ∈ A a \in A aA呢?

  • 一种办法是基于Q值 Q ( s , a ) Q(s, a) Q(s,a) Q ( s , a ) Q(s, a) Q(s,a)反应的是:在状态s下选择动作a,接下来所有步骤都用策略 π \pi π决定时候的总期望奖励(return)值。假设策略 π \pi π是想得到最大的reward, Q π ( s , a ) Q^\pi(s, a) Qπ(s,a)根据上述策略 π \pi π确定,则策略 π \pi π便是无脑选择使得Q值最大的那个a。
    注1.reward是给定 s , a s, a s,a时候环境给agent的单步奖励,return指的是总的奖励,就是一局游戏里的reward加权求和;
    注2.因此,Q值也常常被记为 Q π ( s , a ) Q^\pi(s, a) Qπ(s,a)
  • 另一种办法是基于策略,就是本文要讲的策略梯度(Policy Gradient)。我们会根据输入的状态s来给每一个动作打分(或者说是给一个概率),这个打分的机制希望使得agent的reward最大。

0x02 策略梯度

在这里插入图片描述策略映射 π : S → A \pi:S \rightarrow A π:SA,告诉我们在给定状态时,怎么采取动作。假设我们要使用深度学习的技术来做强化学习的话,策略就是一个网络。如上图,以atari游戏为例,输入的是一张当前游戏画面,输出的是状态(向左,向右,开火)的打分。Agent会根据这个打分来选择动作。

在一次游戏里面,我们把环境输出的 s s s跟演员输出的行为 a a a全部串起来, 叫做一个 trajectory(轨迹),如下式所示:
τ = { s 1 ​ , a 1 ​ , s 2 ​ , a 2 ​ , ⋯ , s t ​ , a t ​ } \tau=\{s_1​,a_1​,s_2​,a_2​,⋯,s_t​,a_t​\} τ={ s1,a1,s2,a2,,st,at}

然后,由于 π \pi π输出的是概率分布 P ( a ∣ s ) P(a|s) P(as),又已知马尔可夫决策过程的各个参数,所以我们可以求出一条轨迹 τ \tau τ出现的概率:
P θ ( τ ) = P ( s 1 ) ∏ P θ ( a t ∣ s t ) P ( s t + 1 ∣ s t , a t ) P_\theta(\tau) = P(s_1)\prod P_\theta(a_t|s_t)P(s_{t+1}|s_t, a_t) Pθ(τ)=P(s1)Pθ(atst)P(st+1st,at)
这个概率取决于下面几个部分: P ( s 1 ) P(s_1) P(s1) P θ ( a t ∣ s t ) P_\theta(a_t|s_t) Pθ(atst) P ( s t + 1 ∣ s t , a t ) P(s_{t+1}|s_t, a_t) P(st+1st,at)

其中除了 P θ ( a t ∣ s t ) P_\theta(a_t|s_t) Pθ(atst)是我们可以优化的之外,其他的东西都是模型固有的。

对每一条轨迹 τ \tau τ,我们还可以考察其return R ( τ ) R(\tau) R(τ)。这个return就是当前轨迹中每一步reward的折扣和。

于是我们考虑下面的数学期望:

∑ τ R ( τ ) p θ ( τ ) \sum_\tau R(\tau)p_\theta(\tau) τR(τ)pθ(τ)

此即agent在当前策略下,可能得到的期望。我们要最大化这个期望,一个自然的想法是对这个期望做梯度上升。

在这里插入图片描述上面的推导过程不做赘述,可以参考原文。

在推完上述期望值的梯度之后,我们使用样本均值代替总体均值时,可以对 τ \tau τ进行采样,对这一批 τ \tau τ进行优化。上式的最后一行,因为它是对 θ \theta θ的梯度,所以可以使用反向传播对agent的参数进行更新。

0x03 一些tip

return的平移

假如 R ( τ ) R(\tau) R(τ)总是正的,但是 R ( τ ) R(\tau) R(τ)有大有小,我们就需要减少 R ( τ ) R(\tau) R(τ)小的那个trajectory出现的概率。因此,我们只需要将上图中的所有 R ( τ ) R(\tau) R(τ)减去一个偏置项,得到 R ( τ ) − b R(\tau) - b R(τ)b即可。

给每一个动作合适的分数

在同一场游戏里面 也许有些动作是好的,有些动作是不好的。假设整场游戏的结果是好的,并不代表这个游戏里面每一个行为都是对的。若是整场游戏结果不好,但不代表游戏里面的所有行为都是错的。所以我们希望可以给每一个不同的动作前面都乘上不同的权重。每一个动作的不同权重,它反映了每一个动作到底是好还是不好。

一个做法是计算这个对的奖励的时候,不把整场游戏得到的奖励全部加起来,只计算从这一个动作执行以后所得到的奖励,如下图所示:

在这里插入图片描述
REINFORCE: Monte Carlo Policy Gradient

Monte Carlo (MC) 可以理解为算法生成一个trajectory之后,再拿这个trajectory的数据去学习一手,做一次更新,也叫回合更新。我们已经拿到了一整个回合的数据的话,也能够拿到每一个步骤的奖励,就可以很方便地去计算每个步骤的未来总收益,就是我们的return。

我们介绍下策略梯度最简单的也是最经典的一个算法 REINFORCE。REINFORCE 用的是回合更新的方式。

在这里插入图片描述
REINFORCE的算法如上图。

其实REINFORCE的想法很简单:把下图的梯度一步步做更新。
在这里插入图片描述
概括一下它的想法就是:把 ∑ t = 1 T n R ( τ n ) g r a d log ⁡ p θ ( a t n ∣ s t n ) \sum_{t=1}^{T_n}R(\tau^n) grad \log p_\theta(a_t^n|s_t^n) t=1TnR(τn)gradlogpθ(atnstn) 里的求和号拆开来一步一步做更新。为了方便编程,也可以从后往前地做更新,即算法图示中使用for t=T-1,…,1,0的顺序。

猜你喜欢

转载自blog.csdn.net/weixin_43466027/article/details/116982617