11 TRPO 算法
11.1 简介
本书之前介绍的基于策略的方法包括策略梯度算法和 Actor-Critic 算法。这些方法虽然简单、直观,但在实际应用过程中会遇到训练不稳定的情况。回顾一下基于策略的方法:参数化智能体的策略,并设计衡量策略好坏的目标函数,通过梯度上升的方法来最大化这个目标函数,使得策略最优。具体来说,假设
\theta 表示策略
\pi_\theta 的参数,定义
\displaystyle J(\theta)=\mathbb{E}_{\pi_{\theta}}[V^{\pi_\theta}(s_0)]=\mathbb{E}_{\pi_{\theta}}[\sum_{t=0}^\infin \gamma^t r(s_t,a_t)],基于策略的方法的目标是找到
\theta^*=\underset{\theta}{\argmax}J(\theta),策略梯度算法主要沿着
\nabla_\theta J(\theta) 方向迭代更新策略参数
\theta。但是这种算法有一个明显的缺点:当策略网络是深度模型时,沿着策略梯度更新参数,很有可能由于步长太长,策略突然显著变差,进而影响训练效果。
针对以上问题,我们考虑在更新时找到一块信任区域(trust region),在这个区域上更新策略时能够得到某种策略性能的安全性保证,这就是信任区域策略优化(trust region policy optimization,TRPO)算法的主要思想。TRPO 算法在 2015 年被提出,它在理论上能够保证策略学习的性能单调性,并在实际应用中取得了比策略梯度算法更好的效果。
11.2 策略目标
假设当前策略为
\pi_\theta,参数为
\theta。我们考虑如何借助当前的
\theta找到一个更优的参数
\theta',使得
J(\theta')\ge J(\theta)。具体来说,由于初始状态
s_0的分布和策略无关,因此上述策略
\pi_\theta下的优化目标
J(\theta)可以写成在新策略
\pi_{\theta'}的期望形式:
\begin{aligned}
J(\theta) &= \mathbb{E}_{s_0} [V^{\pi_\theta}(s_0)]\\
&= \mathbb{E}_{\pi_{\theta'}} \bigg[\sum_{t=0}^\infin \gamma^tV^{\pi_\theta}(s_t) - \sum_{t=1}^\infin \gamma^t V^{\pi_{\theta}}(s_t)\bigg]\\
&= -\mathbb{E}_{\pi_{\theta'}} \bigg[\sum_{t=0}^\infin \gamma^t \Big(\gamma V^{\pi_\theta}(s_{t+1}) - V^{\pi_{\theta}}(s_t)\Big)\bigg]\\
\end{aligned}
基于以上等式,我们可以推导新旧策略的目标函数之间的差距:
\begin{aligned}
J(\theta') - J(\theta)
&= \mathbb{E}_{s_0}[V^{\pi_{\theta'}}(s_0)] - \mathbb{E}_{s_0}[V^{\pi_{\theta}}(s_0)]
\\
&= \mathbb{E}_{\pi_{\theta'}}\Big[ \sum_{t=0}^\infin \gamma^tr(s_t,a_t) \Big] - \mathbb{E}_{\pi_{\theta'}} \bigg[\sum_{t=0}^\infin \gamma^t \Big(\gamma V^{\pi_\theta}(s_{t+1}) - V^{\pi_{\theta}}(s_t)\Big)\bigg]
\\
&= \mathbb{E}_{\pi_{\theta'}} \bigg[\sum_{t=0}^\infin \gamma^t \Big(r(s_t,a_t) + \gamma V^{\pi_\theta}(s_{t+1}) - V^{\pi_{\theta}}(s_t)\Big)\bigg]
\\
\end{aligned}
将时序差分残差定义为优势函数
A:
\begin{aligned}
&= \mathbb{E}_{\pi_{\theta'}} \bigg[\sum_{t=0}^\infin \gamma^t A^{\pi_\theta}(s_t,a_t)\bigg]
\\
&= \sum_{t=0}^\infin \gamma^t \mathbb{E}_{s_t \sim P_t^{\pi_{\theta'}}} \mathbb{E}_{a_t \sim \pi_{\theta'}(\cdot|s_t)} [A^{\pi_\theta}(s_t,a_t)]
\\
&= \dfrac{1}{1-\gamma} \mathbb{E}_{s_t \sim P_t^{\pi_{\theta'}}} \mathbb{E}_{a_t \sim \pi_{\theta'}(\cdot|s_t)} [A^{\pi_\theta}(s_t,a_t)]
\\
\end{aligned}
最后一个等号的成立运用到了状态访问分布的定义:
\displaystyle \nu^\pi(s)=(1-\gamma)\sum_{t=0}^\infin (1-\gamma)\gamma^tP_t^\pi(s),所以只要我们能找到一个新策略,使得
\mathbb{E}_{s \sim \nu^{\pi_{\theta'}}} \mathbb{E}_{a \sim \pi_{\theta'}(\cdot|s)} [A^{\pi_\theta}(s_t,a_t)] \ge 0,就能保证策略性能单调递增,即
J(\theta') \ge J(\theta)。
但是直接求解该式是非常困难的,因为
\pi_{\theta'}是我们需要求解的策略,但我们又要用它来收集样本。把所有可能的新策略都拿来收集数据,然后判断哪个策略满足上述条件的做法显然是不现实的。于是 TRPO 做了一步近似操作,对状态访问分布进行了相应处理。具体而言,忽略两个策略之间的状态访问分布变化,直接采用旧的策略
\pi_\theta的状态分布,定义如下替代优化目标:
L_\theta(\theta') = J(\theta) + \dfrac{1}{1-\gamma} \mathbb{E}_{s \sim \nu^{\pi_{\theta'}}} \mathbb{E}_{a \sim \pi_{\theta'}(\cdot|s)} [A^{\pi_\theta}(s_t,a_t)]
当新旧策略非常接近时,状态访问分布变化很小,这么近似是合理的。其中,动作仍然用新策略
\pi_{\theta'}采样得到,我们可以用重要性采样对动作分布进行处理:
L_\theta(\theta') = J(\theta) + \mathbb{E}_{s \sim \nu^{\pi_{\theta'}}} \mathbb{E}_{a \sim \pi_{\theta'}(\cdot|s)} \bigg[ \dfrac{\pi_{\theta'}(a|s)}{\pi_{\theta}(a|s)} A^{\pi_\theta}(s_t,a_t)\bigg]
这样,我们就可以基于旧策略
\pi_\theta已经采样出的数据来估计并优化新策略
\pi_{\theta'}了。为了保证新旧策略足够接近,TRPO 使用了库尔贝克-莱布勒(Kullback-Leibler,KL)散度来衡量策略之间的距离,并给出了整体的优化公式:
\begin{aligned}
& \underset{\theta'}{\max} L_\theta(\theta')\\
& \text{s.t. } \mathbb{E}_{s \sim \nu^{\pi_{\theta_k}}} \Big[
D_{KL}(\pi_{\theta_k}(\cdot|s), \pi_{\theta'}(\cdot|s))
\Big]\le\delta
\end{aligned}
这里的不等式约束定义了策略空间中的一个 KL 球,被称为信任区域。在这个区域中,可以认为当前学习策略和环境交互的状态分布与上一轮策略最后采样的状态分布一致,进而可以基于一步行动的重要性采样方法使当前学习策略稳定提升。TRPO 背后的原理如图 11-1 所示。
图11-1 TRPO原理示意图
左图表示当完全不设置信任区域时,策略的梯度更新可能导致策略的性能骤降;右图表示当设置了信任区域时,可以保证每次策略的梯度更新都能来带性能的提升。