本系列文章的目的是要实现一个可以自动寻找迷宫路径的机器人,我们将会使用强化学习的方法训练一个机器人,它最终能够在一个迷宫中找到正确的路径,最终到达出口,而不会掉到坑里。我们要使用到的强化学习方法为Q Learning,它是最简单的一种强化学习方法。本系列将包含两篇文章。
在这第一篇文章中,我们将首先针对要实现的项目进行一个描述,来提出我们的问题,然后针对Q Learning做一个详细的解释,而在第二篇文章,我们将实际操练起来,实现Q Learning算法,从而训练出一个可以自动寻路的机器人。
点击访问第二篇文章学习如何用代码实现:训练机器人走迷宫2 – 强化学习之Q Learning
假设我们有下图这样一个迷宫,在迷宫中,我们的机器人是那个红色的图标,S代表迷宫的入口,迷宫中有一些坑(图中的H - hole),当机器人掉下去以后就会摔坏,需要重新开始游戏,图中的F就是普通的地面,机器人可以正常的站在上边并从上边通过,我们的目的是,让机器人能够自动的寻找一条不掉到坑里的路径,能够到达迷宫出口G位置。
幸运的是,python里边有一个现成的库已经帮我们把迷宫游戏做好了,我们将专注于实现一个强化学习机器人来玩这个迷宫游戏。
Gym库就是帮我们提供迷宫游戏的库,它是一个专门供人们学习强化学习的库,里边带来很多经典的游戏或问题,可以通过强化学习解决,我们用到的迷宫就是其中之一,大家可以在 https://gym.openai.com/envs/FrozenLake-v0/ 这个链接找到迷宫游戏的描述。另外,确保我们的环境中安装了gym库。
|
|
Q Learning是一种model-free的强化学习方法,所谓的model-free指的就是AI agent(也就是我们的机器人)并不知道迷宫的模型是什么,不会对环境进行任何建模,而它的行动都是基于它观察到的状态(state),以及它通过不断的学习所学习到的针对这种状态如何更好的执行动作(action)的知识。
Q Learning中有一个重要的概念,它是reward的,你可以这么想象,有一个裁判以上帝视角在看机器人在迷宫中的不断的尝试,机器人每走一步,他会给这一行动打分,然后告知机器人这个分数是多少,机器人无需要知道环境(迷宫)是什么样子的,根据不停的尝试以及对应拿到的分数,就可以学习推理出最佳的路径,即避免掉到坑里,并顺利抵达目的地。
那么很容易理解,机器人做每一次尝试走出迷宫,都会有一个结果,要不是掉到坑里,要不就是成功走出去,无论是掉坑里或者成功走出去,这一次尝试就结束了(成功或失败),这样的一次尝试在Q Larning中用episode来称呼。
按照前边我们所说,有一个裁判在观看着机器人的每一次尝试,在每一个episode中,机器人会根据当前机器人在环境中的状态来决定怎么走下一步,做出决定并实施之后,裁判会根据这一步是不是完成了目标来打分(reward),机器人到达了目的地,裁判打1分,机器人如果掉到了坑里或还没有到达目的地,裁判打0分,,此时因为机器人走了一步,那么它在环境中的状态发生了变化,也就是产生了新的状态,然后继续根据新的状态来决定下一步怎么走,反复循环,一直到本次尝试结束(掉坑里或者走出去)。就是反复的重复下图描述的动作。
Q Learning的目标就是让机器人在一次尝试中得到总打分(每一步的打分累加)最高,针对我们这个项目,如果能够在结束游戏的时候的得分为1则意味着机器人成功的走出去了,我们对是否成功训练出一个会走迷宫的机器人的评判标准就是,在100次连续的尝试中,没有一次失败,换句话说,100次连续尝试的得分平均值为1,最大值,最小值也为1。
读到这里,你可能已经想到Q Learning的核心在于,机器人根据现有状态来决定下一步怎么走的的逻辑,对了,这就是本算法的核心 Q Table。
通常,Q Table长下边这个样子,每一个状态(state),对应于该状态下可以执行的所有行动(action)都会有一个打分(Q Value),代表其是否可以更好地完成目标,而机器人在某一个状态时会选择该状态下打分最高的行动来执行。
而训练的过程就是通过Q Learning算法公式来更新T Table中每一格中的打分(Q Value),Q Learning算法公式为:
很简单是不是,哈哈,当你看到我们用代码实现以后就会觉得简单啦。
具体到我们的项目来说,我们的Q Table长这个样子:
你可能要问我,为什么Action的顺序是Left, Down, Right, Up,其实这不重要,对于机器人来说它并不知道上下左右,对于它来说是0,1,2,3,在它眼里Q Table是这样的,它只知道执行0,1,2,3动作对应的打分而已。
那我们为什么还要提Left,Down,Right,Up呢,这个是便于我们学习理解,而这个顺序,0对应Left,1对应Down,2对应Right,3对应Up,从gym的源代码中是可以查到的。
看到现在,你大概已经清楚,Q Learning算法的核心就是不断重复尝试,在每次状态变换以后,根据打分来修正上一步用于决策的Q Value,用更专业一点的方式描述就是:
这幅图中每一次迭代就是我们上文中提到的每一次尝试,即episode。那么什么时候终止训练呢,这个就是我们2.1章节提到的目标,我们做任何一件事情的时候们都会设置一个目标,当达到目标以后,我们就认为事情做成功了,在这个项目中,我们的目标就是 100次连续尝试的得分平均值为1,最大值,最小值也为1。
我们的初始Q Value怎么来呢?我们可以用0来填充Q Table,也可以像其他机器学习算法一样,我们可以用随机值来初始化Q Table。有了初始值以后,我们需要机器人在不停的尝试中掌握规律,因为初始的Q Table是随机的或者都是0,Q Value没有任何意义,也就是说机器人无论如何也不会通过这样的 Q Table走出迷宫的,但是在机器人学习规律的过程中,如果它能成功的走出去,哪怕只有几次,那这样的走出去的经验就能够被学习下来,然后通过慢慢的改进,最终机器人的性能就能够达到我们的目标。
那么如何让机器人第一次成功走出去呢?这就是从探索(exploration)到利用(exploitation)的过程。我们会创建一个Epsilon变量,利用它来控制,探索和利用的比例,像下图一样,最开始,当机器人没有任何经验或者经验教少的时候,我们倾向于让机器人去随机的探索它所处的环境,简单来讲就是机器人可以随机的去行动,然后获得打分,然后更新Q Value,而Epsilon变量随着学习的深入,会逐渐减小,当Epsilon减小时,意味着机器人从探索学习转向利用已有的学习经验,最终到完全利用学习到的经验能达到我们的目标。
在训练机器人走迷宫系列第一篇文章中,我们主要介绍了项目以及Q Learning的一些基础知识,我们将在下一篇文章中以代码的形式实现能够达到我们目标(100次均能走出迷宫,没有失败)的机器人。
最下边这个视频展示了,模型从最初训练,到最终达到目标以后的走迷宫效果。整个过程还是很有趣的。
Python之所以如此流行,在于它有强大的生态,使用各种各种的库可以帮助用户最快速的解决问题。Python酷致力于输出高质量的Python库相关教程及技术性文章,帮助用户更好更快速的解决问题