最近在整理电脑文件,看到一份当初给同事讲解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
网友评论