1 PARL
1.1 parl是paddle平台下的一款开源强化学习框架,用简单明晰的方式定义了强化学习过程,并且提供了从入门到进阶的全套学习路线,并配有视频教程,可以说是目前把强化学习的讲解深入浅出做的最好的视频教程了
1.2 parl的基本结构如下所示
environment接口提供了强化学习的环境,本文默认环境为雅达利游戏,因此接下来用游戏环境代称。游戏环境根据当前游戏的状态(observation)接收玩家的动作(action),将输出游戏的下一个状态(next_observation),本次动作得到的分数(reward)以及游戏是否结束(end)
agent接口模拟了游戏的玩家,包括model与algorithm两个内部接口,其中model可视为agent的大脑,用于根据当前状态选择最优的游戏策略。模型训练时,则根据当前策略输出的结果与游戏环境给出的结果进行对比,得到损失信息以更新策略, algorithm可视为训练时采用的具体方法。
parl的优势在于用非常简单的方式定义了一整套的强化学习框架,扩展性和实用性都很强,并且基于paddle给出了大量的算法实现例子,其中包括了代码、参数、论文,无论是学习还是研究强化学习技术,都可谓是非常强大好用的工具
2 Q learning
2.1 强化学习,一般可看作一个连续决策问题,对于游戏中的每一个状态采取一定的策略选取一个动作,使得游戏结束时总分最高,游戏总分包括两部分,一部分是由当前动作直接得到的分数,另一部分则是由当前动作影响到的后续的动作所得到的分数。具体过程可如下公式
其中s为状态,a为动作,π为策略,R1为此刻的分数,Rn(n>1)为将来的分数,γ为不大于1的系数,Q可视为状态为s时采取动作a所能得到的最终分数的期望,详细的推理过程可参考paddle官网的视频教程
2.2 Q learning从概念上来说,属于上述parl框架的algorithm,是一种根据玩家与游戏交互的情况来更新游戏策略的方法,思路很直观,玩家根据目前的策略选取动作,与游戏环境交互,并更新目前的策略,更新公式如下图所示
其θ为模型的参数,可视为游戏策略,具体过程如下
2.3 DQN,Double DQN,Dueling DQN
2.3.1 将Q learning的策略更新思路转移到parl框架中,将输入定义为卷积网络从游戏中图像抽取特征信息,则形成了DQN的基本雏形
2.3.2 为了更进一步的有效学习,DQN的作者设计了reply memory与target model两种极具创意的组件,其中前者用于保存玩家与游戏交互过程中得到的 observation, action, reward, next observation等信息,用以作为监督学习的训练样本,后者则用于使用target model则针对强化学习过程中模型更新频繁的问题,作为目前一段时间模型的近似,来稳定的获取未来的游戏分数期望
2.3.3 DQN在很多雅达利游戏中取得了超越人类的分数,但是谷歌的研究员们针对DQN做了进一步的优化,提出了Double DQN,用以战胜更复杂的游戏环境,其基本思路即DNQ的更新方式会引起过于乐观的估计,反而导致游戏总得分下降,作者采取的解决方案是计算未来的奖励期望时,在另一个模型中选取动作,再回到原本的模型中计算,来避免对某一个动作做出过高的估计。其中的证明过程很复杂,反应到代码上,这个模型用model即可。
2.3.4 Dueling DQN是对DQN的另一个改进,这个改进提升到了model层面,如下图所示,计算动作概率分布时,使用了两个额外的层A,V,分别对应强化学习公式中的优势函数与值函数,但是又不等同于真正的优势函数与值函数。从下述代码可知,作者做了一个非常巧妙的技巧,减去了A函数的平均值,从而使得A,V函数去逼近真正的优势函数与值函数,进一步来说,使得训练过程中,模型更关注于
2.3.5 Double DQN 与Dueling DQN都是针对更复杂的游戏所做的改进,也是为了更适应于真实世界的人与环境交互的场景,由于时间有限,仅做了部分实验结果,参数保持代码中的原始参数不变
A 对于pong游戏
DNQ仅用了1002234个steps达到了20分,但是其后分数波动较大,并不稳定
Double DQN 用了1100484个steps达到了20分,其后分数相对稳定
Dueling DQN 用了1301422个steps达到了21分,其后分数最稳定
B 考虑到pong游戏中动作比较简单,三种方法的差距拉不开,于是又尝试了bank heist游戏
bank heist游戏更加复杂,也更难得到较高的分数,尝试了很多次,都无法几个小时内达到预期的分数,所以只实验了一种方法,结合Double DQN与Dueling DQN一起训练,从结果上看
Double Dueling DQN用了2400161个steps达到了676分,其后分数还在持续上升,远远高于DQN论文中的最高分480分
3 parl 代码
3.1 用parl来解决强化学习的问题是十分简单方便的,运行的基本流程如下,包括定义超参数,编写训练代码,编写测试代码,配置parl框架并运行,尽管代码如此简单,但是parl还提供了更简单的方式,让parl的使用者连下述的代码都不用写,parl提供了大量的examples,包括各种经典、前沿的论文复现代码及其对应的参数,其中的代码都采取parl的统一接口,只需要根据自己的需要做一些简单的更高即可
3.2 比如,想要使用double dqn与dueling dqn两种方法结合进行训练,只将atari_model.py中的一行代码
由 if self.algo == 'Dueling' 改为
if self.algo == 'Dueling' or self.algo == 'DDQN_Dueling'即可
4 小结
原本选择论文的时候,想选择日期更加新鲜的文章,大致对比了一下论文的内容,觉得还是学习DQN模型更有助于巩固之前学习的效果,不得不感慨,这几篇文章都是值得反复读的论文,作者进行深度学习研究的思路、技巧,作者对于强化学习中各种要素的理解,都让我印象十分深刻。写到此刻,最迫切的感触就是,这三篇论文,我想再读一遍
参考:
1 ai studio 强化学习视频教程 https://aistudio.baidu.com/aistudio/education/group/info/1335
2 基于paddle和parl框架的dqn复现代码 https://github.com/PaddlePaddle/PARL/tree/develop/examples