计算机可以玩电子游戏吗?
电子游戏由于其休闲性与竞技性吸引了大量的人类玩家;计算机的兴起和人工智能的出现使人类看到了更多的可能性,那么计算机可以像人类一样操纵这些游戏吗?如果可以又如何能够训练计算机使其具有达到甚至超过人类玩家的游戏水平?
不妨幻想此刻的你是一个毫无游戏经验的菜鸟,而你的朋友跟你打赌如果你周末前能够把XX游戏打到100积分就请你吃一顿大餐。面对大餐的诱惑使你打开了游戏——聪明的你立刻想到,想要快速入门这款游戏,最便捷的方法便是查找游戏攻略,在其他玩家的操作中你可以学习到更加有效获得积分的技巧。经过一段时间的学习和训练,便能够轻松玩到100积分啦。
那么如果我们提供给计算机大量的游戏资料(这些资料甚至可以是计算机自己不断尝试得到的),并让计算机从这些资料中学习攻略游戏的经验,是不是计算机也可以像人类一样操纵游戏并打到100积分呢?
太棒了!看来计算机也可以像人类玩家一样通关游戏!但是请等一下,要想让计算机真正的实现游戏操纵与得分,我们还要解决以下三个问题:
1. 计算机如何学习游戏经验?
2. 计算机如何理解复杂游戏?
3. 计算机如何获得更高分数?
问题一:计算机如何学习游戏经验?
在观察玩游戏之前,我们需要先对游戏有一个基本的了解,不如做一些简单的定义和解释,以便于更好的和计算机进行交流:假设我们玩的这款游戏比较简单,这里的简单是指游戏状态很少,比如下图这个只有2X2方格的走迷宫游戏;而我们每走一步(上下左右)即采取了一次行动,我们可以根据采取的行动是否让我们离终点更进一步而给这次的行动一次奖赏。
在这个游戏中,我们的状态S有4个(起点1,陷阱2,无事发生3和终点4),对应的行动A也有四个(1上2下3左4右),那么我们如何给与奖赏R呢?不妨这样规定:如果采取了游戏中错误的行动扣掉1积分,如果采取行动后无事发生便不改变积分,如果掉进了陷阱扣掉100积分,如果到达了终点便得到100积分。这样一来你在玩游戏时便会尽量选择得到积分最多的方向,计算机也是如此。
计算机拿到下图左边的表格之后便可以采取行动啦。刚开始游戏时计算机毫无头绪,便只能随机的采取行动。计算机自己也画了一个表格(下图右,不妨叫Q表格),用来记录自己玩游戏采取相关行动的累计得分,开始时初始化为Qij=0。假设计算机刚开始随机选择了动作2,得到的奖赏R=-1;计算机本可以将记录下Q12=-1,但是聪明的计算机是有一定的远见的,他会继续考虑在这个基础上选择下一个动作又会有怎样的收获,这里我们用参数折扣率γ表示这个远见,γ越大表明计算机的目光越长远。
我们的计算机采取行动2之后还是处于状态1(实际上是因为这个行动是非法的),于是他开始考虑下一步该怎样行动才能够获得最大的奖赏R呢?想到这里,他默默的在笔记本上记下:
计算机兴奋地意识到这是一个迭代的过程,他可以用Qij的实际值(即已经列写在表格中的Q,比如这里初始化的0)和Qij的目标值(即由上式计算得到的Q,比如这里算出的-1)来更新Q表格,若引入学习效率α(字面意思),这个迭代过程可以描述为下:
可以证明这个迭代结果是唯一且最优的。那么我们的计算机便可以不断更新Q表格,并从最优的Q表格中选取一系列最大奖赏的动作,并最终成功的拿到了100积分。上述思路也就是强化学习中经典的Q-Learning算法。
问题二:计算机如何理解复杂游戏?
等一等,计算机玩游戏真的这么简单吗?我们的计算机突然意识到,刚才那个游戏太简单了(状态数少),而实际上计算机所能理解的游戏仅仅也是大量的0和1而已。真正的让计算机学会玩现实中的游戏,我们需要把游戏以图像或视频的形式发送给计算机,这将是大量的像素处理。我们来估计一下这个状态。就拿Deepmind的研究来举例:计算机玩Atari的游戏,每一幅图片都是210X160像素和128色的调色板,理论上如果每个像素都有128中选择,那么状态数将是:
这个状态是相当惊人的,看来我们的计算机已经不能用Q表格来记录这些状态了。那该怎么办呢?我们需要采用降低维度的方法,用一个函数来代替Q表格,其中参数θ代表这个函数的参数:
你突然想到深度神经网络就像一个黑箱子,他在接受了大量输入之后可以自动提取复杂特征,利用前向传递不断修改神经元,并拟合出你想要的函数。
当我们向神经网络输入状态S后,便可以从中获得每个动作的Q值。但是直接这样做会由于动作数量的增加而使神经网络的构造成本增加。另一种思路是我们只把状态S作为输入,输出包含所有动作A的Q值的向量:
这样做可以使我们的计算效率更高。
在Deepmind的文章中,他们使用了卷积神经网络,输入是经过处理的4个连续的84x84像素图像,然后经过两个卷积层,两个全连接层,最后输出包含每一个动作Q值的向量。
通过引入神经网络,我们把Q表格取而代之为Q网络的形式。那么如何像Q表格迭代更新那样去训练我们的Q网络呢?
神经网络的训练是一个最优化问题,即最优化一个损失函数loss function,也就是标签和神经网络输出的偏差,目标是让损失函数最小化。为此,我们需要有样本,即大量的有标签数据,然后通过反向传播使用梯度下降的方法来更新神经网络的参数。
损失函数构造的关键是如何选择标签。这里不妨选择目标Q值(利用奖赏R和Q计算出来的值)作为标签,通过训练使得损失函数达到最小化,便可以使Q值趋近于目标Q值。
有了损失函数,我们便可以采用梯度下降的算法调整参数θ。由于目标函数L(θ)关于参数θ的梯度是目标函数L(θ)上升最快的地方,因此只需要将参数沿着梯度相反的方向前进一个步长,就可以实现目标函数的下降。这里引入步长η,便得到参数训练公式:
梯度下降时如果遍历整个数据集合,运算量是相当惊人的;于是我们采用随机梯度下降SGD的算法,即每次更新参数仅仅使用一个数据,这样可能会走很多弯路,但是整体趋势仍然是寻找最小值,并且减少了算法时间。
实际上我们可以让增强学习的Q-Learning算法和深度学习的SGD训练同步进行,即通过Q-Learning获取大量的训练样本,然后对神经网络进行训练。具体表现为反复试验,然后存储数据;当数据存储到一定程度,就每次随机选取数据,进行随机梯度下降。我们的计算机通过这种方法,便可以只通过像素点和游戏分数作为输入,直接从高维的输入中进行学习,从而实现了端到端的学习方法。如此以来,对于Atari里面的游戏,计算机也能够轻松自如的操纵了。
问题三:计算机如何获取更高分数?
我们终于使计算机学会了如何玩游戏,但是只会玩游戏是不够的。由于游戏本身的竞技性,我们希望在一款游戏中能够获取更高的分数,对于人类玩家这意味着需要不断的练习,甚至需要一点儿天赋;那么对于计算机而言,又是如何上分的呢?
由前所述,我们采用随机梯度下降SGD的方法更新参数。SGD的方法做出了样本独立同分布的假设,以保证更新过程是收敛的,而不是产生振荡或发散。即一组独立同分布的数据所含的噪声可以相互抵消,从而提高算法的收敛速度。但是计算机在学习Atari的游戏时,采集的样本是一个时间序列,即采集的样本是一个连续帧,如果每次得到样本就更新Q值,受样本分布影响,算法在连续一段时间内基本朝着同一个方向做梯度下降,效果会不好。如果我们能够设法减小采集样本数据的相关性,便能够达到更好的学习效果。
由于样本采样具有连续性,我们可以采集大量的样本存放在一个经验池(Experience Replay)之中,再从中随机选取数据进行学习,这样就可以打乱样本数据的相关性。有了丰富的数据存储,计算机便可以进行离线学习。
另一种打乱相关性的思路是并不立即更新Q网络的参数,即试图建立两个网络——当前Q网络和目标Q网络,当前Q网络即为前述的更新网络,而目标Q网络的更新则是通过一段步长的延迟之后通过当前Q网络的参数更新。这样我们使用较旧的参数集中生成目标,减小了振荡或分歧的可能性。
解决了前述的3个问题,便可以说计算机也可以玩电子游戏了,甚至可以超越人类的水平。赋予计算机这种能力的算法便是Deepmind团队提出的Deep Q-Network算法(DQN)。
课后笔记:
基本概念:
1. 强化学习
包含状态(state)、动作(action)、奖赏(reward)这三个要素。强化学习的思路是智能体(Agent)根据当前状态来采取动作,获得相应的奖赏之后,改进动作,使得下次再到相同状态时,能做出更优的动作选择。
Q-Learning是强化学习的一种算法。它采用Q-Table存储每个状态动作对应的Q动作价值函数值(价值评估),采用迭代的方法更新Q值,最终收敛于最优Q值。
2. 深度神经网络
对于描述连续且高维的复杂状态,状态价值函数无法用Q-Table存储。深度神经网络可以自动提取复杂特征;因此采用Q网络代替Q-Table,即把Q-Table的更新问题变成一个函数拟合问题。
3. Deep Q-Network
深度强化学习是指将深度神经网络与强化学习结合,直接从高维原始数据学习控制策略。对于DQN则是将卷积神经网络(CNN)和Q-Learning结合起来,CNN的输入是原始图像数据(作为状态state),输出则是每个动作action对应的价值评估(Q值)。
基本数学原理:
1. 马尔可夫奖赏过程
设R为奖赏函数,λ为折扣率,Gt表示t时刻得到的回报:
当前状态下的价值取决于当前的回报加上之后状态的价值(根据λ决定其权重)。
3. 动作价值函数Qπ
4. 神经网络训练
Loss Function