最近在整理电脑文件,看到一份当初给同事讲解TRPO算法原理时写的PPT,感觉要比先前那篇写的更加清楚明白,加之这几天刚好在复习RL相关的知识,然后便将PPT的内容加上我比当时更加深入的理解,整理成了这篇文章,分享给大家。
策略梯度方法及其缺点
相对于Value Based的方法,基于策略梯度的强化学习方法的很明显的优势是它可以直接去学习Policy本身,这样学习速度会更快,并且更关键的是它可以用于连续动作空间的情况。
它的基本思想是通过最大化状态价值来更新策略函数的参数,即最大化目标函数,其中 为策略函数的参数, 具体的优化过程如下:
- agent观察到一个环境状态
- 可以计算 关于策略函数参数的梯度
- 基于策略 随机采样一个动作 a,求随机梯度
当然,上式子中的 和 是未知的,我们可以使用一个参数为的神经网络 来近似,而 我们可以使用走完一整个episode后的真实回报, 或者使用 来近似,这样我们就得到了随机梯度 - 在通过梯度上升最大化的参数, 其中 为学习率
这种方法的缺点也是显而易见的,因为强化学习环境的变化往往非常大,也导致Value的方差比普通的深度学习数据要大的多,很难选择到一个合适的学习率 可以保障更新参数之后的价值比现在的好,一旦选择了这个更不好的策略进行采样学习,再次更新的参数会更差,因此很容易导致越学越差,一直无法收敛。
对于怎么选择这个合适的学习率是一个相当棘手的问题,然而不愧是Shulman博士,并没有纠结于表面上的学习率,而是从问题的本质出发,从而另辟蹊径给出了TRPO的解决方案。(P.S. 这就是马斯克所谓的第一性原理的实践案例吧~)
Trust Region Policy Optimization
TRPO算法尽量通过能提高状态价值的方式来更新策略。它通过在新旧策略之间增加约束,将整个参数空间的变化限制在一个小范围之内,从而避免了错误决策导致Value的崩塌,尽可能的保持快速而单调的提升。
我们用来表示参数为 的策略函数,那么TRPO的参数更新方式可以表示为:
这里的 是原始策略梯度最大化目标在限制范围内的近似:
其中 是优势函数,表示选择动作所带来的优势,直观上看,如果 说明动作不好,应该降低 的概率,于是应该减小动作的概率,那么 应该小于1,越接近0越好,正好符合 的最大化,反之亦成立,因此从直观上看,这个替代的目标函数是符合要求的。但是这个替代函数到底是怎么来的呢?
其实非常简单,我们只需要对 做一点微小的变换:
虽然推出了优化目标,但是要怎么来解这个带约束的优化问题呢?其实就是参考了 Trust Region 算法的求解过程,这也是TRPO这个算法名字的由来。
Trust Region
我们先来看一下Trust Region算法是怎么来最大化目标函数的,TRPO用的也是同样的方法。
第一步, 我们定义参数 的邻域, 是该邻域内的点,满足 和 比较接近,常见的方式就是保证:
-
然后我们在这个邻域内找到 的相似函数
第二步,在邻域内求 的最大值:
第三步,重复上面两步,直到收敛:
TRPO的更新过程
显然TRPO算法的训练过程就是在策略梯度方法的基础上,套用了Trust Region 。
在邻域 内找到 的近似函数
我们使⽤蒙特卡洛来作为期望的近似,使⽤当前策略来和环境交互,除了记录transition之外,还记录每一步的,就可以得到公式中的 ,另外用一个神经网络来近似, 利用TD算法可以求出公式中的Advantage,这样近似函数就找到了,另外我们使用 和 的平均KL散度来增加这个约束。
但是从理论上来说,上面所说的TRPO更新十分难求,于是需要做进一步的近似。
我们使用泰勒级数来估计 和散度的均值,将 展开到一阶,KL散度展开到二阶:
就得到了这样一个近似的优化问题:
最大化
这个近似问题可以⽤拉格朗⽇对偶⽅法解析求解:
如果我们只使用这个结果,算法将精确计算自然策略梯度。但是这样有一个问题,由于泰勒展开式引入了近似误差,可能会导致不满足KL散度的约束,或者实际提高了相应动作的优势,于是TRPO对这个更新规则增加了一个修改,称之为回溯线搜索:
其中 是回溯系数, 是 满足KL散度约束并产生正向替代优势的最小非负整数。
另外,当神经网络有数百万个参数时,计算和存储矩阵的代价是很大的。TRPO通过使⽤共轭梯度算法计算来避免求解 .这样我们就可以只⽤⼀个函数来计算,从而避免直接存储整个矩阵 .(其实这个⽅法跟梯度下降有点像)。沿着更新方程迭代直到收敛...
Proximal Policy Optimization
看了上面的更新过程,我们其实就会发现,当我们使用神经网络来近似策略时,参数非常多,TRPO的二阶解法计算量会非常大,于是就有了后来的PPO算法。它们的动机是完全一样的,就是为了让当前策略上进行有效更新时不至于导致Value的崩溃。PPO算法可以看作时TRPO的一阶近似,它的试用范围更广、计算效率更高、更容易实现,并且从OpenAI的经验上来看,至少效果是不比TRPO差的。PPO也成为了SOTA强化学习算法中最常用的之一。
PPO主要有两种变体:PPO-Penalty 和 PPO-Clip 。
- PPO-Penalty修改了KL散度的约束方式,它不再添加硬约束,而是通过在目标函数中加入KL散度的正则项的方式来处理约束问题。
- PPO-Clip 则删除了约束,直接使用强制剪裁的暴力方式来让 的更新保持在一定范围之内。
实践证明,PPO-Clip这种暴力的方式反而更有效,因此现在主流的PPO用的都是PPO-Clip,因此,本文也就只讲PPO-Clip的原理和实现。
PPO-Clip的目标函数可以改写为:
这个公式非常复杂,我们将其拆解成两种情况来看...
当优势A大于0:, 说明动作a是好的,于是应该让大于1且范围内越大越好,当 时就截取到, 否则取原值 .
当优势A小于等于0:,说明动作a是不好的,于是应该让 < 1且范围内越小越好,当, 则截取到, 否则 ,此时应该是取max,但是因为A是负的,于是又变成了取min,这样就刚好对应上面的公式。
然后价值网络和策略网络的设计方式和普通的actor-critic并没有区别,分别用td算法来有优化value网络,用梯度上升来优化policy网络训练即可。
GAE
另外值得一提的还有generalized advantage estimator算法,因为我们一般在实现PPO的时候并不会用最原始的Advantage function,而是GAE,GAE实际上就是multi-step td的Advantage的指数加权移动平均,正如multi-step的td算法比one-step的会好,gae可以让优势估计更加平滑和稳定,因为GAE的效果更好,因此在后期GAE版本的TRPO和PPO才是标准的实现。
参考Multi-step TD target的思想, 我们将作为状态价值的近似,折扣系数为,定义, 则n步的Adventage的估计应该是这样的:
但是我们到底选几步的优势是最好的呢?又是否存在这样一个最好的n呢?
在不知道选哪个预测值的情况下,数值优化算法上有一种很常见的作法,就是取附近值的指数加权移动平均,这便是GAE了,我们将加权系数设置为 :
当 时, , 相当于one-step的TD。
当 时, , 相当于玩完整局菜更新的Reinforce。
这个权重系数 就是用来控制取多少步的,比如 , 此时 很小,我们可以认为平均了2步,再设大一些就会多取几步。
总结
PPO通过on-policy的方式训练随机策略,这意味它通过最新版本的随机策略来对环境进行采样,但是实际分布式采样和训练的时候往往有策略更新的延迟的情况,因此也可以算作是有点off-policy的...
基础实现的代码可以参考我教程中的实现tutorials/ppo ,不过请注意,这个单worker的版本仅用于学习基本的原理,实际并没有什么用,真正有用的请参考进阶版中的多worker实现。
参考
Trust Region Policy Optimization, Schulman et al. 2015
Approximately Optimal Approximate Reinforcement Learning, Kakade and Langford 2002
Proximal Policy Optimization Algorithms, Schulman et al. 2017
High Dimensional Continuous Control Using Generalized Advantage Estimation, Schulman et al. 2016
Emergence of Locomotion Behaviours in Rich Environments, Heess et al. 2017
Trust Region Policy Optimization, spinningup.openai