Skip to main content

RL4 Policy Gradient

· 6 min read
zqqqj
super bug engineer 4 nlp,robot,cv,ml and ds

在之前的Q-table中,由于Q值与感知态的强绑定问题,无法学习随机策略(也无法区分感知相同但需求不同的状态,比如说非对称),因此需要使用PG求解,

在一些情节,比如说机器臂(连续动作空间),石头剪刀布(概率性策略)中,我们可以使用PG,同时,收敛性也更加强

PG的主要目的就是计算梯度并更新参数来改变策略,直接输出动作概率

1. 理论

首先给出轨迹的概念,把环境输出的ss与演员输出的动作aa全部组合起来,就是一个轨迹(trajectory)

τ=s1,a1,s2,a2,...,st,at\tau = {s_1, a_1, s_2, a_2,...,s_t,a_t}

就像是神经网络一样,前输出就是后输入

在给定参数θ\theta,计算某个轨迹τ\tau发生的概率为

pθ(τ)=p(s1)pθ(a1s1)p(s2s1,a1)pθ(a2s2)p(s2s1,a1)=p(s1)t=1Tpθ(atst)p(st+1st,at)p_{\theta}(\tau) = p(s_1)p_{\theta}(a_1 \mid s_1)p(s_2 \mid s_1, a_1)p_{\theta}(a_2 \mid s_2)p(s_2 \mid s_1, a_1) \cdots \\ =p(s_1)\prod_{t=1}^Tp_{\theta}(a_t \mid s_t)p(s_{t+1} \mid s_t, a_t)

其中,p(s1)p(s_1)为厨师状态分布(也就是起点),pθ(atst)p_{\theta}(a_t \mid s_t)为策略在状态sts_t下选择动作ata_t的概率,p(st+1st,at)p(s_{t+1} \mid s_t, a_t)为状态转移概率

一句话概括一下的话,就是在给定策略πθ\pi_{\theta}(或pθp_{\theta})下,一整条轨迹τ\tau出现的概率是多少。这公式蛮重要的,是后续梯度下降的基础。就是上图的数学表达而已,不复杂

改图是计算奖励的过程,R(τ)R(\tau)就是每个步骤获取的奖励累加,

在某一场游戏的某一个回合里面,我们会得到R(τ)R(\tau)。我们要做的就是调整演员内部的参数θ\theta, 使得R(τ)R(\tau)的值越大越好。 但实际上R(τ)R(\tau)并不只是一个标量(scalar),它是一个随机变量,因为演员在给定同样的状态下会采取什么样的动作,这是有随机性的。环境在给定同样的观测时要采取什么样的动作,要产生什么样的观测,本身也是有随机性的,所以R(τ)R(\tau)是一个随机变量。我们能够计算的是R(τ)R(\tau)的期望值。给定某一组参数,我们可计算rθr_\theta的期望值为

Rˉθ=τR(τ)pθ(τ)\bar{R}_\theta = \sum_{\tau}R(\tau)p_\theta(\tau)

比如θ\theta对应的模型很强,如果有一个回合θ\theta很快就死掉了,因为这种情况很少会发生,所以该回合对应的轨迹τ\tau的概率就很小;如果有一个回合一θ\theta直没死,因为这种情况很可能发生,所以该回合对应的轨迹τ\tau的概率就很大。我们可以根据θ\theta算出某一个轨迹τ\tau出现的概率,接下来计算τ\tau的总奖励。总奖励使用τ\tau出现的概率进行加权,对所有的τ\tau进行求和,就是期望值。给定一个参数,我们可以计算期望值为

Rˉθ=Eτpθ(τ)[R(τ)]\bar{R}_\theta = \mathbb{E}_{\tau \sim p_\theta(\tau)}\big[ R(\tau) \big]

这就引入正文主题了,想让奖励越大越好,就需要梯度,而且是上升来最大化期望奖励,即

Rˉθ=τR(τ)pθ(τ)\nabla \bar{R}_\theta = \sum_{\tau}R(\tau)\nabla p_\theta(\tau)

不过,由于期望无法直接求导,会用一大堆公式进行推导,得到可以通过采样计算的梯度。数学技巧使用的是f(x)=f(x)logf(x)\nabla f(x)=f(x)\nabla logf(x).推导公式不放了,感兴趣自己去搜,网上都有,最终公式是这样的,这是梯度的近似计算方法

1Nn1Nt=1TnR(τn)logpθ(atnstn)\frac{1}{N} \sum_{n-1}^N \sum_{t=1}^{T_n}R(\tau^n) \nabla logp_\theta(a_t^n \mid s_t^n)

也很复杂,不看,给出最简单的形式,用于更新θ\theta

θθ+ηRˉθ\theta \leftarrow \theta + \eta \nabla \bar{R}_\theta

其中,η\eta是学习率,可用Adam等深度学习里的方法来进行调整

注意,一般**策略梯度(policy gradient,PG)**采样的数据只会用一次。我们采样这些数据,然后用这些数据更新参数,再丢掉这些数据。接着重新采样数据,才能去更新参数。

2. 策略梯度实现技巧

2.1 添加基线(baseline)

在很多环境中,奖励R(τ)R(\tau)永远是正数(例如迷宫中只要活着就给分)。根据基础公式,只要我们采样到了某个动作,它的概率就会增加。如果某些好的动作没被采样到,它们的相对概率反而会下降,这显然不合理。

解决方法:给奖励减去一个基线 b(通常是所有奖励的平均值)

只有比“平均水平”更好的动作,奖励才会是正的(增加概率);比平均水平差的动作,奖励会变成负的(降低概率)。

2.2 指派合适的分数 (Assign Suitable Credit)

在基础算法中,每一局游戏(轨迹τ\tau)得到的总奖励R(τ)R(\tau)会被乘到该局的每一个动作上。但这不公平——也许你开局走得非常好,但最后一步失误导致输了。在基础公式里,开局的那个“好动作”也会被惩罚。

解决方法:不再使用整场游戏的总分,而是使用该动作之后产生的累积奖励,即用GtG_t代替R(τ)R(\tau)

目的是一个动作的评价,只取决于它做完之后发生的奖励。这大大减少了评价中的“噪音”,让梯度更新更准确。

2.3 总结

看一下了解一下就行,2.2是一个经典的评论员(critic)。后续会专门再写一个评价员算法

3. REINFORCE:蒙特卡洛策略梯度(Monte Carlo Policy Gradient)

REINFORCE 用的是回合更新的方式,它在代码上的处理上是先获取每个步骤的奖励,然后计算每个步骤的未来总奖励GtG_t,将每个GtG_t代入

Rˉθ1Nn=1Nt=1TnGtnlogπθ(atnstn)\nabla \bar{R}_\theta \approx \frac{1}{N} \sum_{n=1}^{N} \sum_{t=1}^{T_n} G_t^{\,n}\, \nabla \log \pi_\theta \big( a_t^{\,n} \mid s_t^{\,n} \big)

GtG_t需要从后往前算,逐步推导到G1G_1,具体表现为

Gt=k=t+1Tγkt1rk=rt+1+γGt+1\begin{aligned} G_t &= \sum_{k=t+1}^{T} \gamma^{\,k-t-1} r_k \\ &= r_{t+1} + \gamma G_{t+1} \end{aligned}

即上一个步骤和下一个步骤的未来总奖励的关系,其实就是原本是(s,a)现在变成了(s,a,G),即

(s1,a1,G1)(s2,a2,G2),...,(sT,aT,GT)(s_1,a_1,G_1)(s_2,a_2,G_2),...,(s_T,a_T,G_T)