强化学习入门6—Policy Gradient策略梯度

1,790 阅读6分钟

这是我参与8月更文挑战的第4天,活动详情查看:8月更文挑战

本文是强化学习入门系列的第六篇,将介绍一种有别于前面Q-learning这些基于价值的算法——策略梯度。

Policy Gradient

即策略梯度,是一种Policy-based的方法。不同于Q-Learning等基于value的方法,策略梯度不需要计算value function,直接计算出随机策略,直接输出action。policy gradient 可以在一个连续分布上选取 action。策略梯度除了可以解决连续性问题,也适用于分幕式问题。分幕式可以理解为离散型问题。比如我们玩下棋游戏,棋子的上下左右移动这一动作是离散的,而在自动驾驶场景里面,汽车速度的变化是连续的,这也就对应连续型问题。

而在策略梯度算法中,两种问题考虑的性能指标有所不同:

  • 分幕式问题:当前参数化策略下初始状态的价值函数
  • 连续性问题:平均奖励

分幕式问题

我们知道 π(as)\pi(a|s) 表示状态s下选择动作a的概率,不同策略 π\pi 下不同的状态,其状态价值函数 VπV_{\pi} 不同;同一状态下不同动作的动作价值函数 QπQ_{\pi} 也不同。GtG_t 表示奖励的总和。

Qπ(st,at)=E[GtSt=st,At=at]Vπ(st,at)=EA[Qπ(st,A)]=aπ(ast)Qπ(st,a)\\ Q_{\pi}(s_t,a_t)=E[G_t|S_t=s_t,A_t=a_t] \\ V_{\pi}(s_t,a_t)=E_A[Q_{\pi}(s_t,A)]=\sum_a\pi(a|s_t)Q_{\pi}(s_t,a)

策略梯度使用神经网络来近似状态价值函数,我们引入神经网络的参数 θ\thetaθ\theta 其实就是决定了策略 π\piQ(st,a)Q(s_t,a) 是考虑所有策略 π\pi 后的可能的下一状态和动作的奖励的期望。又a在求和过程中被消掉,因此目标函数定义如下:

J(θ)=Vπ(s;θ)=aπ(as;θ)Qπ(s,a)J(\theta) = V_{\pi}(s;\theta)=\sum_a\pi(a|s;\theta)Q_{\pi}(s,a)

那么问题就变成如何学习出一个最优的 θ\theta 使得目标函数最大?

先对目标函数求梯度:

J(θ)=aπ(as;θ)θQπ(s,a)=aπ(as;θ)1π(as;θ)π(as;θ)θQπ(s,a)=aπ(as;θ)lnπ(as;θ)θQπ(s,a)\begin{aligned} \nabla J(\theta)=&\sum_a \dfrac{\partial \pi(a|s;\theta)}{\partial \theta} Q_{\pi}(s,a)\\ =&\sum_a \pi(a|s;\theta) \dfrac{1}{\pi(a|s;\theta)} \dfrac{\partial \pi(a|s;\theta)}{\partial \theta} Q_{\pi}(s,a) \\ =&\sum_a \pi(a|s;\theta) \dfrac{\partial \ln\pi(a|s;\theta)}{\partial \theta}Q_{\pi}(s,a) \\ \end{aligned}

这里面的变化是仔细看能发现是依据 lnx=xx\nabla\ln x=\dfrac{\nabla x}{x}。策略π\pi是一个概率密度函数,自然有 aπ(as;θ)=1\sum_a\pi(a|s;\theta)=1 。所以概率密度乘以右边项再对a求累加,就相当于对右边项求期望,所以有:

J(θ)=Eaπ(s;θ)[lnπ(as;θ)θQπ(s,a)]=Eaπ(s;θ)[lnπ(as;θ)Qπ(s,a)]\begin{aligned} \nabla J(\theta) =& E_{a \sim \pi(\cdot|s;\theta)}[\dfrac{\partial \ln\pi(a|s;\theta)}{\partial \theta} Q_{\pi}(s,a)]\\ =& E_{a \sim \pi(\cdot|s;\theta)}[\nabla\ln\pi(a|s;\theta) Q_{\pi}(s,a)] \end{aligned}

如何近似?

采用蒙特卡洛方法(随机样本采样),从策略 π\pi 的概率密度函数中随机采样 a^\hat{a} ,可以直接计算。

算法流程(梯度上升):

  1. t时刻观察到状态 sts_t
  2. 从策略 π\pi 的概率密度函数中随机采样 a^\hat{a}
  3. 近似价值函数 qπq_{\pi}:采用蒙特卡洛算法,需先观察到一段完整的轨迹(比如玩一局游戏),计算其奖励总和 GtG_t ,因为前面提到 Qπ(st,at)=E[GtSt=st,At=at]Q_{\pi}(s_t,a_t)=E[G_t|S_t=s_t,A_t=a_t],所以可用 Gt G_t 来近似 QQ
  4. 求导: dθ,t=lnπ(as;θ)θθ=θtd_{\theta,t}=\dfrac{\partial \ln\pi(a|s;\theta)}{\partial \theta}|\theta=\theta_t
  5. 近似策略梯度:lnπ(as;θ)θQπ(s,a)=qtdθ,t\dfrac{\partial \ln\pi(a|s;\theta)}{\partial \theta} Q_{\pi}(s,a)=q_t \cdot d_{\theta,t}
  6. 更新梯度:θt+1=θt+αlnπ(as;θ)θQπ(s,a)\theta_{t+1}=\theta_t+ \alpha \dfrac{\partial \ln\pi(a|s;\theta)}{\partial \theta} Q_{\pi}(s,a)α\alpha 是学习率

神经网络如何搭建?

因为最后输出的策略 π\pi 是一个概率密度,所以神经网络的输出层需加一个softmax处理。

连续性问题

假设现在智能体和环境交互比如玩一局游戏,观察到一段轨迹(Trajectory) τ=s1,a1,r1,...,st,at,rt\tau=s_1,a_1,r_1,...,s_t,a_t,r_t,每一个轨迹也有一个发生概率,假设agent有一个参数 θ\theta ,决定了其玩游戏的策略,在给定 θ\theta 下,轨迹的概率

pθ(τ)=p(s1)πθ(a1s1)p(s2s1,a1)...=p(s1)t=1Tπθ(atst)p(st+1st,at)\begin{aligned} p_{\theta}(\tau)=&p(s_1)\pi_{\theta}(a_1|s_1)p(s_2|s_1,a_1)...\\ =&p(s_1)\prod_{t=1}^T \pi_{\theta}(a_t|s_t)p(s_{t+1}|s_t,a_t) \end{aligned}

同时,不同的 θ\theta 下会有不同的奖励 RθR_{\theta} ,而我们要考虑的就是奖励 R 的期望,我们的目标就在于近似这一期望。

R(τ)=tTrtR=τR(τ)pθ(τ)=Eτpθ(τ)[R(τ)]R(\tau)=\sum_t^T r_t \\ \overline R=\sum_{\tau}R(\tau)p_{\theta}(\tau)=E_{\tau \sim p_{\theta}(\tau)}[R(\tau)]

因为我们想要的是奖励越大越好,所以要最大化这个期望,而要最大化我们则采用梯度上升。先对目标函数求梯度:

R=τR(τ)pθ(τ)=τR(τ)pθ(τ)pθ(τ)pθ(τ)=τpθ(τ)R(τ)lnpθ(τ)=Eτpθ(τ)[R(τ)lnpθ(τ)]\begin{aligned} \nabla\overline R=& \sum_{\tau}R(\tau) \nabla p_{\theta}(\tau) \\ =& \sum_{\tau}R(\tau) p_{\theta}(\tau) \dfrac{\nabla p_{\theta}(\tau)}{p_{\theta}(\tau)} \\ =& \sum_{\tau}p_{\theta}(\tau) R(\tau) \nabla \ln p_{\theta}(\tau) \\ =& E_{\tau\sim p_{\theta}(\tau)}[R(\tau) \nabla \ln p_{\theta}(\tau)] \end{aligned}

不难发现,因为 pθ(τ)p_{\theta}(\tau) 是一个概率密度函数,所以式子最终可以写成右边项的期望形式。实际上,这个期望是没办法求的,我们可以通过 nn 次随机采样,得到很多轨迹,从而来近似这一期望(其实也就是蒙特卡洛方法)。所以式子可以进一步写成:

R=1Nn=1NR(τn)lnpθ(τn)=1Nn=1NR(τn)(lnp(s1)+t=1Tlnpθ(atst)+t=1Tlnp(st+1st,at))=1Nn=1NR(τn)t=1Tlnpθ(atst)=1Nt=1Tn=1NR(τn)lnpθ(atst)\begin{aligned} \nabla\overline R=&\dfrac{1}{N}\sum_{n=1}^N R(\tau^n) \nabla \ln p_{\theta}(\tau^n)\\ =& \dfrac{1}{N}\sum_{n=1}^N R(\tau^n) \nabla(\ln p(s_1) + \sum_{t=1}^T \ln p_{\theta}(a_t|s_t)+ \sum_{t=1}^T\ln p(s_{t+1}|s_t,a_t)) \\ =& \dfrac{1}{N}\sum_{n=1}^N R(\tau^n) \nabla \sum_{t=1}^T \ln p_{\theta}(a_t|s_t) \\ =& \dfrac{1}{N} \sum_{t=1}^T \sum_{n=1}^N R(\tau^n) \nabla \ln p_{\theta}(a_t|s_t) \end{aligned}

梯度更新:

θθ+αR\theta \leftarrow \theta+\alpha\nabla \overline R

REINFORCE:蒙特卡洛策略梯度

先介绍两种不同的更新方法:

  • 蒙特卡洛(Monte-Carlo),属于回合更新。当算法完成一个回合后,每个时刻的奖励rtr_t都可以获取到,这样就可以计算未来总奖励GtG_t。完成一次回合才learn一次。

  • 时序差分(Temporal-Difference),属于单步更新,比如Q-learning。每个步骤都learn一下。

前面我们在分幕式问题中近似状态价值函数的时候,使用了蒙特卡洛方法,其实就是这个REINFORCE(也称 蒙特卡洛策略梯度)算法。我们下面仔细讲讲。REINFORCE是属于回合更新的方法,也是一个策略梯度算法。

蒙特卡洛策略梯度的算法流程如下:

reinforce

其实就是使用 GtG_t 来近似 Qπ(st,at)Q_{\pi}(s_t,a_t)GtG_t 就是奖励的总和,这个我们是可以通过采样得到的。具体来说,就是先获取每一时刻的reward,再计算未来的总奖励(看上图伪代码)。所以梯度的近似可以进一步写成:

J(θ)=Eaπ(s;θ)[Gtlnπ(as;θ)]\begin{aligned} \nabla J(\theta) =& E_{a \sim \pi(\cdot|s;\theta)}[G_t\nabla\ln\pi(a|s;\theta)] \end{aligned}

伪代码中引入了折扣因子 γ\gamma 是为了兼容非分幕式的任务。对于分幕式的任务, γ=1\gamma=1,其实也可以看做是连续任务的一个特例。

加一个baseline

我们将策略梯度再进一步推广,给动作价值函数 Qπ(s,a)Q_{\pi}(s,a) 加入一个baseline b(s)b(s),这个baseline可以是任意函数。

J(θ)=aπ(as;θ)lnπ(as;θ)[Qπ(s,a)b(s)]\nabla J(\theta)=\sum_a \pi(a|s;\theta) \nabla \ln\pi(a|s;\theta)[Q_{\pi}(s,a)-b(s)] \\

为什么要引入这个baseline?

这是因为,如果我们得到的奖励总是正的,那更新的时候概率都要上升,只不过上升的程度有大有小。但是这是理想情况下的,在实际中采样时,某时刻只能采样到几个动作,某个动作没被采样到。因为其它动作被采样到,所以概率就上升,但那个没被采样到的动作,它的概率就会下降。这显然是不对的。这个时候我们希望奖励有正有负就好了。

那让总奖励减去一个baseline,可以变得有正有负。如果采样一个动作使得得到的 GtG_t 大于baseline,梯度更新的时候就让它的概率上升;如果 GtG_t 小于baseline,就让它的概率下降。而且,类似梯度赌博机算法在更新的时候减去奖励的均值,这样减去一个baseline,不会影响更新的期望,但会影响更新的方差,可以帮助算法收敛的更快些。

所以带baseline的REINFORCE算法的梯度改写为:

J(θ)=Eaπ(s;θ)[(Gtb(s))lnπ(as;θ)]\begin{aligned} \nabla J(\theta) =& E_{a \sim \pi(\cdot|s;\theta)}[(G_t-b(s))\nabla\ln\pi(a|s;\theta)] \end{aligned}

伪代码如下:

带baseline的reinforce

小结

策略梯度算法,不同于Q-Learning等基于价值的方法,策略梯度不需要计算价值函数,直接计算出随机策略,直接输出action。策略梯度除了可以解决连续性问题,也适用于分幕式问题。策略梯度在更新策略参数时虽然可能需要近似价值动作函数,但其在动作选择上是不需要动作价值函数的估计值的。

参考

  1. sutton.Barto.《强化学习(第二版)》
  2. 第四章 策略梯度 (datawhalechina.github.io)
  3. 深度强化学习(全)_哔哩哔哩_bilibili