强化学习算法Q-learning入门:教电脑玩“抓住芝士”小游戏

简介:
本文来自AI新媒体量子位(QbitAI)

这篇文章打算教你使用强化学习中的Q-learning算法,让电脑精通一个简单的游戏。文中代码所用语言是Ruby。

为了展示算法内部的工作机制,我们将会教它去玩一个非常简单的一维游戏。当然这个算法也可以被应用于更复杂的游戏中。

游戏介绍

我们的游戏叫做“抓住芝士”,玩家P需要移动到芝士C那里(抓住它!),同时不能落入陷阱O中。

每抓到一块芝士,玩家就会得一分,而每次落入陷阱,玩家就会减一分。当玩家得分达到5分或者-5分时游戏结束。下面的动画展示的是一个人类玩家玩游戏的过程。

8dfd2df79281e43041cf85109ef2503349767e40

请注意,为了简化这个游戏,所有的陷阱O和芝士C的位置都是不变的。你可以从这里找到关于游戏的Ruby源代码以及相应Q-learning算法的实现过程:
https://github.com/daugaard/q-learning-simple-game

Q-learning算法

Q-learning是一种强化学习算法。强化学习是指受到行为心理学启发的一系列机器学习方法,它的前提是你可以通过奖励或惩罚行为来教会算法在之前经验的基础上采取特定的行动。这跟用食物奖励教会狗狗坐好是一个道理。

Q-learning算法通过在表格中记录游戏中所有可能的状态,和这些状态下玩家可能的行为来运作。对于每个游戏状态S和玩家行为A,表格中记录的数值Q代表着在S状态下采取行为A可能获得的奖励。这意味着为了能够得到最大奖励,在特定状态下,只需要依据表格采取拥有最大潜在奖励的行为。

现在我们来看一下上面描述的那个游戏。

根据玩家所处的位置,这个游戏一共有12种可能的状态(重申一下:陷阱和芝士的位置是不变的),在每个状态下玩家可以采取的行动就是向左或者向右。

Q值表格看起来像是下面这样,注意这只是我们这个问题下Q表格一种可能的形式,其中的数值可能跟实际有出入。

e5e0450b76910f669aa581e1be4c72ea83161d5e

你可以从Q值表格中看出,当里在采取向左的行为、靠近陷阱时,玩家会得到负面的奖励;而向右走、靠近芝士时,玩家可能会得到正面的奖励。

Q值表格的初始化就是指将表格中所有的Q值随机赋值,这象征着在初始阶段AI对游戏没有任何了解。为了让它学会如何玩这个游戏,我们必须设计出一个能够根据经验不断更新Q值表格的算法。

我们采取的步骤如下:

第1步:初始化Q值表格,随机赋值

第2步:在游戏进行中反复执行以下操作:

    2a) 从0到1中生成一个随机数 — 如果数字大于阈值e,选择随机行为,否则就依据Q值表格选择当前状态下奖励最大的行动。

    2b) 采取2a中选择的行动

    2c) 在行动完成后得到奖励r

    2d) 结合下式和奖励r更新Q值表格

10207b2380ad0f6e0e58e06dd1ffb48c93683a98

可以看出,更新Q值表格的过程中将会使用新得到的当前状态和行为的奖励信息,以及未来可能采取的行为的相关信息,但这不需要遍历未来所有的可能得到,只需Q表格就能完成。这使得Q-learning成为一个相当快速的学习算法,但同时也意味着算法一开始会采取一些随机的行为,所以在玩过几局游戏之前,不要对你的AI有任何指望。

搭建一个Q-learning AI player class

我们游戏通常使用human player class(人类玩家)作为玩家。human player class的搭建过程如下所示,class通过两个函数运行:构造器函数(constructor)和get_input函数。

get_input函数在游戏进行中的每一次迭代中都会被调用,然后依据键盘上的输入返回玩家行动的方向。

446f348d3ea2e973e1bdc48f4fa8add00fdbd18b

为了构造Q-learning AI player class,我们将会使用一个新的class,包括Q值表格和基于上述算法的get_input函数。

如下所示,我们定义了这个新class和它的构造器。注意这里我们新定义了一个attribute/特性: game。这被用来在Q-learning算法中记录游戏得分,从而更新Q值表格。

此外,在构造器中我们为每个在上述算法中列出的学习参量定义了attribute,然后初始化我们的随机数生成器。

64a1bd865bfffff61787bb48a770d16357f5a10c

下一步,我们将定义一个函数负责用随机数初始化Q值表格。状态的数量用游戏的map_size表示,每个状态即对应着一个玩家的位置。

7fecba9e8931a3c8a329e81ffb08eafd193b94e2

最终,我们采用了如下所示的get_input函数。首先,停顿0.05秒,保证我们能够看清AI玩家移动的步骤。

随后我们将会检查这是否是程序第一次运行,如果是的话就对Q值表格进行初始化。(步骤1)

如果不是第一次运行,那么我们就对游戏进行评估,因为从上一次游戏的结果中就能得到Q-learning算法所需要的输入——奖励r。如果游戏的得分增加了,那么得到的奖励为1;如果得分减少了,得到的奖励为-1;得分不变奖励为0.(步骤2c)

接着我们把结果状态设置为游戏的当前状态(在我们的例子中即为移动玩家),然后使用下式更新我们的Q值表格。(步骤2d)

909df39242e4b966d173c77147bf3ce60ad1cb9d

bb959581fa6d4851b1c9b92f1bfad9d519fb9f70

在上述最后一步更新过Q值表格后,我们为下一次运行保留之前的分数和状态。

然后我们依据阈值e,从随机或者基于Q值表格选择出一个行为(步骤2a),函数返回这个行为(步骤2b)。

13ea6d751cf6403568a1498d00f1422dd8ba8d80

这就完成了我们Q-learning算法的实现,你可以从上文中的github地址里看到有关算法和游戏的所有源码。

算法的运行

我们让Q-learning玩家进行了10次游戏,结果如下:

7ebc99e22d236cbcb25431b1aad4085bfa896f49

你可以看出在第1次游戏中,玩家还在不断尝试,包括漫无目的地左右移动。这是由于Q值表格的随机初始化导致的。然而当玩家得到一些分数、落入一些陷阱后,它很快就学会了如何避免陷阱,径直走向芝士。

在第7次和第8次游戏运行中,玩家事实上采取了最优的获胜方案,在37步移动中得到了5次芝士。

然后在第9次和第10次游戏中,获胜经历的总步数又变成了39步。这是由阈值e影响的,它的存在会使得算法有时候会采取随机移动,而不是采用优化的移动。这种随机性的设置会非常有必要的,它能够保证算法能够正确地探索整个游戏,而不被局域最优值卡住。

接下来…

这篇推送展示了如何将使用Q-learning来教会AI去玩“抓住芝士”这个简单的游戏。你可以想象,随着游戏复杂的提升,Q制表格的大小将会呈现爆炸式增长。一种避免这种情况发生的方法就是把Q值表格替换为一个神经网络。

DeepMind的研究者们探索了这种方法,发表了相关的论文。这这篇文章中,他们成功使用了神经网络通过Q-learning来训练AI去玩Atari出品的2600种游戏。

论文:
Playing Atari with Deep Reinforcement Learning
地址:
https://www.cs.toronto.edu/~vmnih/docs/dqn.pdf

本文作者:王瀚宸
原文发布时间:2017-08-20
相关文章
|
4天前
|
监控 算法 网络协议
Java 实现局域网电脑屏幕监控算法揭秘
在数字化办公环境中,局域网电脑屏幕监控至关重要。本文介绍用Java实现这一功能的算法,涵盖图像采集、数据传输和监控端显示三个关键环节。通过Java的AWT/Swing库和Robot类抓取屏幕图像,使用Socket进行TCP/IP通信传输图像数据,并利用ImageIO类在监控端展示图像。整个过程确保高效、实时和准确,为提升数字化管理提供了技术基础。
35 15
|
3月前
|
机器学习/深度学习 算法 机器人
多代理强化学习综述:原理、算法与挑战
多代理强化学习是强化学习的一个子领域,专注于研究在共享环境中共存的多个学习代理的行为。每个代理都受其个体奖励驱动,采取行动以推进自身利益;在某些环境中,这些利益可能与其他代理的利益相冲突,从而产生复杂的群体动态。
291 5
|
4月前
|
机器学习/深度学习 人工智能 算法
深度学习入门:理解神经网络与反向传播算法
【9月更文挑战第20天】本文将深入浅出地介绍深度学习中的基石—神经网络,以及背后的魔法—反向传播算法。我们将通过直观的例子和简单的数学公式,带你领略这一技术的魅力。无论你是编程新手,还是有一定基础的开发者,这篇文章都将为你打开深度学习的大门,让你对神经网络的工作原理有一个清晰的认识。
|
11天前
|
存储 运维 监控
探索局域网电脑监控软件:Python算法与数据结构的巧妙结合
在数字化时代,局域网电脑监控软件成为企业管理和IT运维的重要工具,确保数据安全和网络稳定。本文探讨其背后的关键技术——Python中的算法与数据结构,如字典用于高效存储设备信息,以及数据收集、异常检测和聚合算法提升监控效率。通过Python代码示例,展示了如何实现基本监控功能,帮助读者理解其工作原理并激发技术兴趣。
49 20
|
17天前
|
机器学习/深度学习 算法
强化学习之父Richard Sutton给出一个简单思路,大幅增强所有RL算法
Richard Sutton领导的团队提出了一种称为“奖励中心化”的方法,通过从观察到的奖励中减去其经验平均值,使奖励更加集中,显著提高了强化学习算法的性能。该方法在解决持续性问题时表现出色,尤其是在折扣因子接近1的情况下。论文地址:https://arxiv.org/pdf/2405.09999
55 15
|
2月前
|
机器学习/深度学习 人工智能 算法
探索人工智能中的强化学习:原理、算法与应用
探索人工智能中的强化学习:原理、算法与应用
|
2月前
|
机器学习/深度学习 人工智能 算法
探索人工智能中的强化学习:原理、算法及应用
探索人工智能中的强化学习:原理、算法及应用
|
2月前
|
机器学习/深度学习 算法 Python
机器学习入门:理解并实现K-近邻算法
机器学习入门:理解并实现K-近邻算法
39 0
|
3月前
|
机器学习/深度学习 算法
机器学习入门(三):K近邻算法原理 | KNN算法原理
机器学习入门(三):K近邻算法原理 | KNN算法原理
|
3月前
|
机器学习/深度学习 算法 大数据
机器学习入门:梯度下降算法(下)
机器学习入门:梯度下降算法(下)

热门文章

最新文章