世界冠军带你从零实践强化学习心得

世界冠军带你从零实践强化学习心得写在前面强化学习——从尝试到决策初识强化学习强化学习的分类和方法PARL框架和GYM环境基于表格型方法求解RL序列决策的经典表达(MDP)状态动作价值(Q)的求解Sarsa和Q-learning代码构建与演示基于神经网络方法求解RL神经网络近似Q函数DQN:入门deep RL代码构建与演示总结

写在前面

不要重复造轮子,学会使用轮子。

本文源于百度AI平台飞桨学院《世界冠军带你从零实践强化学习》课程中我自己的心得和理解,感谢科科老师这几天精彩的讲解,带我们从小乌龟(Sarsa、Q-learning),到倒立摆(DQN,PG),再到四旋翼飞行器(DDPG),逐步领略强化学习的魅力。本文旨在介绍PARL框架的使用方法,并从模型的理解和代码的构建角度来整理所学内容,不求详尽但求简洁明了,看完都能学会ModelAlgorithmAgent的构建方法。我认为强化学习中对算法每一个概念的理解很重要,你可以不懂公式的推导,但是只要你理解了算法框图中的每一个步骤,那你就能够灵活的应用PARL框架去解决自己的问题。为了让大家理解代码的模块化构建,这篇文章只介绍Sarsa、Q-learning和DQN,前两者只用了一个Agent函数,后者用了PARL的ModelAlgorithmAgent模块,对比两种构建方式的不同,我们就可以很轻松的举一反三,PG和DDPG同样也可以用这三大模块构建。

依赖库是python初学者永远的痛点,相信很多人都有网上查到代码,本地一运行各种报错的经历,本文在各代码之前列举了所需依赖库,希望大家自己研究代码时能一次跑通。所有课程官方代码和作业答案都已上传至我的GitHub,欢迎大家star一下,文章中有问题或疏漏的地方大家也可以直接查看源码。

开始之前我希望大家都具有python编程基础,一定程度上掌握Numpy的用法,这个库真的是很有用。没用过的可以参考我之前的文章(查看这里)。学习过程中也可以参考大神的文章,推荐Tiny TonyMr.郑先生_hhhsy叶强

强化学习——从尝试到决策

每个人都是过去经验的总和。

初识强化学习

强化学习(Reinforcement learning,简称RL)是机器学习中的一个领域,强调如何基于环境而行动,以取得最大化的预期利益。核心思想是:智能体(agent)在环境(environment)中学习,根据环境的状态(state)或观测(observation),执行动作(action),并根据环境的反馈 (reward)来指导更好的动作。

强化学习核心思想

作为机器学习三巨头之一,强化学习和监督学习以及非监督学习关系如下图。

机器学习三巨头

监督学习关注的是认知,而强化学习关注的是决策。简单的说,前者学习经验,后者运用经验。同样都是一张小熊的图片,监督学习输出的是灰熊、熊猫还是老虎,强化学习输出的是装死、逃跑还是干一架。

熊来了怎么办?强化学习告诉你

强化学习的分类和方法

强化学习的分类

强化学习主要关注的是无模型的问题,在未知的环境中进行探索学习,在生活中有广泛的应用。

强化学习应用

其探索方案有二:

强化学习方法

PARL框架和GYM环境

Agent的训练(Train)和测试(Test)过程直接上图展示如下。

gym中agent训练和测试过程

本文所需全部依赖库代码如下,paddlepaddle默认使用CPU版本,可自行选用GPU版本,这里不再赘述。

基于表格型方法求解RL

没有什么比前人走过的路(Q)更有价值(V)。

序列决策的经典表达(MDP)

某一状态信息包含了所有相关的历史,只要当前状态可知,所有的历史信息都不再需要,当前状态就可以决定未来,则认为该状态具有马尔科夫性马尔可夫决策过程(MDP)是序列决策的数学模型,它是一个无记忆的随机过程,可以用一个元组<S,P>表示,其中S是有限数量的状态集,P是状态转移概率矩阵。

强化学习中我们引入奖励R和动作A来描述环境,构成MDP五元组<S,A,P,R,>,其中P函数表示环境的随机性,R函数其实是P函数的一部分,表示获得的收益,是衰减因子以适当的减少对未来收益的考虑。

熊问题树形图

同样以熊问题为例,对应的是Model-free的情况,即P函数和R函数都未知的情况。这时我们用价值V代表某一状态的好坏,用Q函数来代表某个状态下哪个动作更好,即状态动作价值。

熊问题model-free

现实世界中,奖励R往往是延迟的,所以一般会从当前时间点开始,对后续可能得到的收益累加,以此来计算当前的价值。但是有时候目光不要放得太长远,对远一些的东西当作近视看不见就好。适当地引入一个衰减因子,再去计算未来的总收益,的值在0-1之间,时间点越久远,对当前的影响也就越小。

状态动作价值(Q)的求解

假设人走在树林里,先看到树上有熊爪后看到熊,接着就看到熊发怒了,经过很多次之后,原来要见到熊才瑟瑟发抖的,后来只要见到树上有熊爪就会有晕眩和害怕的感觉。也就是说,在不断地训练之后,下一个状态的价值可以不断地强化、影响上一个状态的价值。

这样的迭代状态价值的强化方式被称为时序差分(Temporal Difference)。单步求解Q函数,用来近似,以迭代的方式简化数学公式,最终使得逼近目标值。这里的目标值Target就是前面提到的未来收益的累加。

Q表格TD单步更新

Sarsa和Q-learning

Sarsa全称是state-action-reward-state’-action’,目的是学习特定的state下,特定action的价值Q,最终建立和优化一个Q表格,以state为行,action为列,根据与环境交互得到的reward来更新Q表格,更新公式即为上面的迭代公式。Sarsa在训练中为了更好的探索环境,采用ε-greedy方式(如下图)来训练,有一定概率随机选择动作输出。

e_greedy

Q-learning也是采用Q表格的方式存储Q值,探索部分与Sarsa是一样的,采用ε-greedy方式增加探索。

二者更新Q表格的方式分别为:

sarsa和qlearning更新Q表格方式对比

二者算法对比如下图所示,有三处不同点。

sarsa和qlearning算法对比

on-policy优化的是目标策略,用下一步一定会执行的动作来优化Q表格;off-policy实际上有两种不同的策略,期望得到的目标策略和大胆探索的行为策略,在目标策略的基础上用行为策略获得更多的经验。

离线在线之争

代码构建与演示

Sarsa Agent构建

Q-learning Agent构建

训练过程代码如下:

可以看到二者区别全在learn函数,训练过程的差别也仅在learn的输入是否有next_action。大家可以尝试用命令行运行以下演示代码(这里下载),训练环境是悬崖问题(CliffWalking)。作业中的冰湖问题(FrozenLake)见.\tutorials\homework文件夹。

最终结果如下面的GIF所示。可以看出来Sarsa比较保守,会选择下限最高的路线,即尽可能远离悬崖的路线,虽然路程远了,但至少掉下悬崖的风险就小了很多;而Q-learning比较激进,会选择上限最高的路线,即路程最近的路线,但存在些微扰动便可能掉下悬崖。

Sarsa训练图:

Sarsa训练图

Q-learning训练图:

QLearning训练图

基于神经网络方法求解RL

选择(A)有限,而人生(S)无限。

神经网络近似Q函数

前面提到的悬崖问题,状态(S)总量很少,但实际生活中,很多常见问题的状态都是数量庞大的,如象棋、围棋等。即使用Q表格装下所有状态,表格可能占用极大内存,表格的查找也相当费时。我们就可以用带参数的Q函数来近似Q表格,比如可以用多项式函数或者神经网络,优势是只需要输出少量参数,同时能实现状态泛化

神经网络结构如下图所示。

神经网络结构

由此可见,神经网络的本质是一个含有很多参数的“大公式”。

DQN:入门deep RL

DQN本质上是一个Q-learning算法,但使用神经网络来近似替代Q表格。

DQN流程

类比监督学习的训练,DQN的训练过程也非常地类似,它输入的是一批状态(S),输出的是对应的Q。计算输出的Q与Target Q的均方差,进行优化,以此更新神经网络参数。

DQN类比监督学习

在Q-learning的基础上,DQN提出了两个技巧使得Q网络的更新迭代更稳定:

代码构建与演示

这部分代码构建展示了PARL框架的基本用法,即ModelAlgorithmAgent嵌套。AlgorithmAgent的一部分,Model又是Algorithm的一部分,相比较前文中只有一个Agent的简单代码模块性更好,但理解起来也更复杂,容我慢慢道来。

训练过程代码如下:

大家可以尝试用命令行运行以下演示代码(这里下载),训练环境是倒立摆问题(CartPole),倒立摆可以说是强化学习中的hello world,入门必备。作业中的小车上山问题(MountainCar)见.\tutorials\homework文件夹。

最终DQN结果如下面的GIF所示。

倒立摆(CartPole):

cartpole训练图

小车上山(MountainCar):

mountaincar训练图

总结

框架库PARL将强化学习框架抽象为: ModelAlgorithmAgent三层,使得强化学习算法的实现和调试更方便和灵活。前两者尤其针对deep RL的情况,有神经网络时直接调用paddle的api可以很方便的进行网络和算法的构建。本文由强化学习经典算法Sarsa和Q-learning扩展到deep RL的DQN算法,并以DQN为例讲解了PARL的使用方法。下篇文章我会讲基于policy的PG算法和用于连续状态控制的DDPG,敬请期待。