一、 重要性采样
TRPO和PPO主要思想的数学基础是重要性采样
- 重要性采样:$x_i $是从$p(x)$分布中采样得到的, 但是$p(x)$的值往往无法直接获得,需要通过其他分布$q(x)$进行间接采样获得。
二、 梯度与参数更新
1. 回报的期望:最大化全部采样轨迹上的策略回报值,$R(\tau)$ 表示某一个轨迹$\tau$的回报值
2. 回报的期望的梯度:(第三个等号用到的公式:$\nabla f(x) = f(x) \nabla \log f(x)$)
式中
$N$表示采样了$N$条trajectory, $T_n$表示每条trajectory的step数量。
关于$p_{\theta}(\tau)$
由两部分组成一部分是来自环境的 $p_\theta(s_{t+1}|s_t, a)$, 一部分是来自agent的 $p_\theta {(a_t|s_t)}$, 其中来自环境的部分不带入计算,策略更新只考虑agent这部分。所以最后一步并没有$t+1$这部分。
3. 参数更新:
三、 实际算法中对策略梯度的处理方法
策略梯度方法:
加入baseline
$b$ 的加入保证reward不是恒大于0的,若reward一直大于0,则会导致未被采样的action无法得到提升,但其实该action并不是不好而是未被采样。
状态值函数估计轨迹回报:
$R(\tau^n)-b$ 部分使用状态值函数来替代
优势函数估计轨迹回报:
$R(\tau^n)-b$ 部分用以下Advantage function来替代
TD-Error估计轨迹回报:(A3C)使用值网络估计值,引入bias减小variance
$R(\tau^n)-b$ 部分用以下TD-Error 代替
四、GAE(Generalized Advantage Estimation)
GAE的作用
- GAE的意思是泛化优势估计,因而他是用来优化Advantage Function优势函数的。
- GAE的存在是用来权衡variance和bias问题的:
- On-policy直接交互并用每一时刻的回报作为长期回报的估计$\sum_{t’=t}^{T} \gamma^{t’-t}r_{t’}$ 会产生较大的方差,Variance较大。
- 而通过基于优势函数的AC方法来进行回报值估计,则会产生方差较小,而Bias较大的问题。
GAE 推导
满足$\gamma$-just条件。(未完待续)
GAE形式
GAE的形式为多个价值估计的加权平均数。
运用GAE公式进行优势函数的估计:
为了快速估计序列中所有时刻的估计值,采用倒序计算,从t+1时刻估计t时刻:
五、PPO关于策略梯度的目标函数
以上所述的策略梯度算法属于on-policy的算法,而PPO属于off-policy的算法
on-policy: 使用当前策略$\pi_\theta$收集数据,当参数$\theta$更新后,必须重新采样。
off-policy: 可以从可重用的样本数据中获取样本来训练当前的策略$\pi _\theta$,下式用了重要性采样。
1. PPO目标函数
对于PPO而言,轨迹回报通过采用Advantage function的方式进行估计,因而其梯度更新方式为:
其中,从第二个等式用的是重要性采样,第三到第四个约等式由于$\frac{p_\theta(s_t)}{p_\theta^\prime(s_t)}$这一项来源于重要性采样,前提假设两个分布差别不大,近似为1,且不易计算,故省略,后面的$\nabla \log p_\theta({a_t^n|s_t^n})$ ,根据公式$\nabla f(x) = f(x) \nabla \log f(x)$转换。
因而,定义目标函数为:
2. PPO对于重要性采样约束的处理
为了保证$p_\theta(s_t,a_t) $ 与 $p_\theta^\prime(s_t,a_t)$ 分布的差别不会太大,采用以下约束:
- TRPO: 使用约束 $KL(\theta,\theta’)<\delta$,在分布上进行约束。
- PPO1(Adaptive KL):使用$J_{PPO}^{\theta’}(\theta)=J^{\theta’}(\theta)-\beta KL(\theta,\theta’)$,在目标函数上加一个正则项进行约束,注意,这里KL散度衡量的是action之间的距离,而不是参数$\theta$与$\theta’$之间的距离。
- PPO2 (Clip,论文中推荐的):使用$J_{PPO_2}^{\theta’}(\theta)=\sum_{(s_t,a_t)}\min\{([\frac{p_\theta(a_t|s_t)}{p_\theta^\prime(a_t|s_t)}A^{\theta^\prime}(s_t,a_t)], [clip(\frac{p_\theta(a_t|s_t)}{p_\theta^\prime(a_t|s_t)},1-\epsilon,1+\epsilon)A^{\theta^\prime}(s_t,a_t)])\}$, 来约束分布距离。
- 使用GAE对优势函数进行优化
1 | def get_gaes(self, rewards, v_preds, v_preds_next): |
六、 PPO的目标函数
PPO的最终目标函数由三部分组成,可使用梯度下降求解,而不是像TRPO一样使用共轭梯度法:
- 策略梯度目标函数: $L_t^{CLIP}(\theta)$
- 值函数目标函数:$L_t^{VF}(\theta)=(V_\theta(s_t)-V_t^{target})^2=((r+\gamma v(s_{t+1}))-v(s_t))^2$
- 策略模型的熵: $S_{[\pi_\theta]}(s_t)=-\pi_\theta(a|s)\log\pi_\theta(a|s)$
完整的形式如下:
这部分相应的代码如下:
1 | with tf.variable_scope('assign_op'): |
七、Actor-Critic
A2C、A3C等方法采用的是TD方法来替代R-b部分
A3C
方法:
- 启动N个线程,Agent在N线程中同时进行环境交互收集样本;
- 收集完样本后,每一个线程将独立完成训练并得到参数更新量,异步更新到全局的模型参数中;
- 下一次训练的时候,线程的模型参数将与全局参数完成同步,使用新的参数进行下一次训练。
目标函数:
使用TD-$\lambda$减小TD带来的偏差,可以在训练早期更快的提升价值模型。为了增加模型的探索性,目标函数中引入了策略的熵。
A2C
与A3C不同的是参数更新全部在全局master完成,每个子线程只负责env.step()进行探索。