浅谈策略梯度(PG)算法

2020-12-25  本文已影响0人  行者AI

本文首发于:行者AI

Policy Optimization(策略优化)是强化学习中的一大类算法,其基本思路区别于Value-based的算法。因此,很多教科书都将model-free RL分成两大类,Policy Optimization和Value-based。本系列博客将会参考OpenAI发布的入门教程Spinning Up [1],Spinning Up系列是入门Policy Optimization的非常好的教材,特别适合初学者。Policy Gradient(策略梯度,简称PG)算法是策略优化中的核心概念,本章我们就将从最简单的PG推导开始,一步步揭开策略优化算法的神秘面纱。

1. 直观理解

如果用一句话来表达策略梯度的直观解释,那就是“如果动作使得最终回报变大,那么增加这个动作出现的概率,反之,减少这个动作出现的概率”。这句话表达了两个含义:

2. 策略梯度推导

本节我们将一步步推导出策略梯度的基础公式,这一小节非常重要,理解了推导过程,就基本上理解了策略梯度的核心思想。所以,一定要耐心的把这一小节的内容全部看懂,最好能够达到自行推导的地步。

我们用参数化的神经网络表示我们的策略\pi_\theta,那我们的目标,就可以表示为调整\theta,使得期望回报最大,用公式表示:
J(\pi_\theta)=E\underset{\pi \sim \tau}[R(\tau)] ---(1)
在公式(1)中,\tau表示从开始到结束的一条完整路径。通常,对于最大化问题,我们可以使用梯度上升算法来找到最大值。
\theta^*=\theta + \alpha\nabla J(\pi_\theta) ---(2)
为了能够一步步得到最优参数,我们需要得到\nabla_{\theta} J\left(\pi_{\theta}\right),然后利用梯度上升算法即可,核心思想就是这么简单。

关键是求取最终的回报函数J(\pi_\theta)关于\theta的梯度,这个就是策略梯度(policy gradient),通过优化策略梯度来求解RL问题的算法就叫做策略梯度算法,我们常见的PPO,TRPO都是属于策略梯度算法。下面我们的目标就是把公式(2)逐步展开,公式(2)中最核心的部分就是\nabla_{\theta} J\left(\pi_{\theta}\right),这也是这篇博客最核心的地方。
\nabla_{\theta} J\left(\pi_{\theta}\right) = \nabla_{\theta} \underset{\tau \sim \pi_{\theta}}{\mathrm{E}} [R(\tau)] ---(3)
=\nabla_{\theta} \int_{\tau} P(\tau \mid \theta) R(\tau) \quad ---(4)
=\int_{\tau} \nabla_{\theta} P(\tau \mid \theta) R(\tau) \quad ---(5)
=\int_{\tau} P(\tau \mid \theta) \nabla_{\theta} \log P(\tau \mid \theta) R(\tau) ---(6)
=\underset{\tau \sim \pi_{\theta}}{\mathrm{E}}\left[\nabla_{\theta} \log P(\tau \mid \theta) R(\tau)\right] ---(7)
在以上的推导中,用到了log求导技巧:\log x关于x的导数是\frac{1}{x}。因此,我们可以得到以下的公式:
\nabla_{\theta} P(\tau \mid \theta)=P(\tau \mid \theta) \nabla_{\theta} \log P(\tau \mid \theta) ---(8)
所以,才有公式(5)到公式(6),接下来我们把公式(7)进一步展开,主要是把\nabla_{\theta} \log P(\tau \mid \theta)展开。先来看看P(\tau \mid \theta)
P(\tau \mid \theta)=\rho_{0}\left(s_{0}\right) \prod_{t=0}^{T} P\left(s_{t+1} \mid s_{t}, a_{t}\right) \pi_{\theta}\left(a_{t} \mid s_{t}\right) ---(8-1)
加入log,化乘法为加法:
\log P(\tau \mid \theta)=\log \rho_{0}\left(s_{0}\right)+\sum_{t=0}^{T}\left(\log P\left(s_{t+1} \mid s_{t}, a_{t}\right)+\log \pi_{\theta}\left(a_{t} \mid s_{t}\right)\right) ---(8-2)
计算log函数的梯度,并且约去一些常量:
\nabla_{\theta} \log P(\tau \mid \theta) = \cancel{\nabla_{\theta} \log \rho_{0}\left(s_{0}\right)} + \sum_{t=0}^{T}\left(\cancel{\nabla_{\theta} \log P\left(s_{t+1} \mid s_{t}, a_{t}\right)} + \nabla_{\theta} \log \pi_{\theta}\left(a_{t} \mid s_{t}\right)\right)
=\sum_{t=0}^{T} \nabla_{\theta} \log \pi_{\theta}\left(a_{t} \mid s_{t}\right) ---(9)
因此,结合公式(7)和公式(9),我们得到了最终的表达式
\nabla_{\theta} J\left(\pi_{\theta}\right)=\underset{\tau \sim \pi_{\theta}}{\mathrm{E}}\left[\sum_{t=0}^{T} \nabla_{\theta} \log \pi_{\theta}\left(a_{t} \mid s_{t}\right) R(\tau)\right] \quad ---(10)
公式(10)就是PG算法的核心表达式了,从这个公式中可以看出,我们要求取的策略梯度其实是一个期望,具体工程实现可以采用蒙特卡罗的思想来求取期望,也就是采样求均值来近似表示期望。我们收集一系列的\mathcal{D}=\left\{\tau_{i}\right\}_{i=1, \ldots, N} ,其中每一条轨迹都是由agent采用策略\pi_{\theta}与环境交互采样得到的,那策略梯度可以表示为:
\hat{g}=\frac{1}{|\mathcal{D}|} \sum_{\tau \in \mathcal{D}} \sum_{t=0}^{T} \nabla_{\theta} \log \pi_{\theta}\left(a_{t} \mid s_{t}\right) R(\tau) ---(11)
其中,|\mathcal{D}|表示采样的轨迹的数量。现在,我们完成了详细的策略梯度的推导过程,长舒一口气,接下来的工作就比较轻松了,就是在公式(10)的基础上修修改改了。

再进行简单修改之前,我们再总结一下公式(10),毕竟这个公式是PG算法最核心的公式:

3. 改进回报函数

我们继续观察公式(10),对于公式中的R(\tau),表示整个轨迹的回报,其实并不合理。对于一条轨迹中的所有动作,均采用相同的回报,就相当于对于轨迹中的每一个动作都赋予相同的权重。显然,动作序列中的动作有好有坏,都采取相同的回报,无法达到奖惩的目的,那我们该怎么表示 “某个状态下,执行某个动作” 的回报呢?

一种比较直观思路是,当前的动作将会影响后续的状态,并且获得即时奖励(reward),那么我们只需要使用折扣累计回报来表示当前动作的回报就行了,用公式表示为:
\hat{R}_{t} \doteq \sum_{t^{\prime}=t}^{T} R\left(s_{t^{\prime}}, a_{t^{\prime}}, s_{t^{\prime}+1}\right) ---(12)
这在spinning up中叫做reward to go,所以,公式(10)可以表示为:
\nabla_{\theta} J\left(\pi_{\theta}\right)=\underset{\tau \sim \pi_{\theta}}{\mathrm{E}}\left[\sum_{t=0}^{T} \nabla_{\theta} \log \pi_{\theta}\left(a_{t} \mid s_{t}\right) \sum_{t^{\prime}=t}^{T} R\left(s_{t^{\prime}}, a_{t^{\prime}}, s_{t^{\prime}+1}\right)\right] ---(13)
当然,使用reward to go的权重分配还是相当初级,我们可以使用更加高级的权重分配方式,进一步减少回报分配的方差,限于篇幅原因,我们后续再聊。

4. 总结

本章我们花了大量的篇幅推导了策略梯度(PG)的核心公式,得到了关键表达式(10),理解该公式对于我们后续理解整个PG算法族非常有帮助,希望大家能够认真的理解这一公式推导过程。


我们是行者AI,我们在“AI+游戏”中不断前行。

如果你也对游戏感兴趣,对AI充满好奇,就快来加入我们吧~


  1. OpenAI Spinning Up https://spinningup.openai.com/

上一篇 下一篇

猜你喜欢

热点阅读