2015年,DeepMind的几位研究人员在《自然》杂志上发表了一篇论文,描述了他们用神经网络构建了一个强化学习系统,该系统可以自发地学会熟练地玩雅达利(Atari)电子游戏。在这些笔记中,我将解释他们是如何做到这一点的,并展示一些示例代码来在keras中实现他们的系统。
这里有一个YouTube视频的链接,显示了该系统学习玩Breakout。
在强化学习中,Q表是一个表,它记录了智能体在状态s和动作a的每种组合下的预期未来奖励Q(s,a)。在系统中可用状态有限且离散的情况下,这些值确实可以存储在一个表中,其中行是系统的可能状态,列是代理可以执行的可能操作。
Q表中的项满足Bellman等式:
Q(s,a) = r(s,a) + γ V(s')
在r(年代,一个)是执行行动的直接奖励一个从国家年代,V(年代)是国家未来给予的最大回报年代':
V(s') = maxa Q(s',a)
这些方程中的另一个因素是γ因素,它用于贴现未来。每次我们从一个可以获得奖励r的地方回到过去,我们就会用γ因子来贴现未来的奖励:这使系统倾向于想要尽早获得奖励。
这些是Q表的元素必须满足的方程,但不幸的是,它们并没有告诉我们如何实际计算表的值。为此,我们通常使用迭代更新策略来填充表。在这个策略中,我们做了以下几点:
这个计划实际上是有理论支持的,因为Bellman表明,如果我们对Q表进行足够多的更新,最终整个表的值将收敛到正确的值。
我在前一节中提出的理论的问题在于,它建立在一个有时并不正确的假设之上:我们假设我们正在处理的系统具有有限的离散状态集。我们想要运行的一些环境违背了这个假设,要么是因为环境没有离散状态,要么是因为它有太多的离散状态,以至于Q表变得不可行。在这些情况下,我们可以转而尝试构造一个Q函数,而不是一个Q表。一个Q函数仍然满足Bellman等式。
如果我们决定用一个Q函数来代替Q表,那么从这里想象构建一个Q神经网络来计算这个函数只是一个小小的跳跃。(这种网络通常被称为深度q网络。)我们甚至可以训练这个网络来学习Q函数,方法是使用一种非常类似于我上面列出的更新方案:
我们需要考虑的下一件事是选择行动:除非我们有这样做的策略,否则我们无法在环境中运作。幸运的是,这就是Q网络可以帮助我们的地方。当我们到达状态s并选择下一个动作a时我们可以使用我们的Q网络计算每个可能的a的Q(s,a)然后选择产生最大可能Q值的动作。
我们用来补充这个计划的另一个策略是ε-贪心策略。在这个策略中,我们设置了一个参数ε,开始时接近于1。在每一轮中,我们从区间(0,1)中随机选择一个实数:如果该数字大于ε,我们使用Q网络选择下一个行动,否则我们随机选择下一个行动。在每一轮之后,我们稍微降低ε,这样随着时间的推移,Q网络会更频繁地决定我们的行动,因为它学会了正确的Q值。这让系统有机会在早期最新体育赛事资讯、实时赔率分析及在线投注平台探索状态空间,并最终越来越依赖网络来控制我们的行为。
我们今天要看的主要例子是使用深度q网络来训练智能体玩Atari breakout游戏的例子。
下面是keras上的一些示例代码。该网站演示了如何构建和训练一个深度q网络来玩这个游戏。
系统从中学习的状态信息是由视频游戏屏幕的图像组成的。具体来说,状态空间由每次4帧的堆栈组成。我们必须在状态信息中包含多个帧,因为单个图像帧只能显示球和桨的位置。我们需要多个帧,这样系统才能确定球的运动方向。
代码运行一系列的情节,其中每一集是一个完整的游戏爆发。在每一集中,我们使用ε-greedy随机走法和使用网络确定的走法的组合,为每个可能的动作给出Q(s,a)的估计,然后选择Q值最大的动作。当我们玩游戏时,我们会存储状态、选择的行动和获得的奖励的记录。(这条记录被称为重放缓冲区。)
为了训练Q网络,我们从重播缓冲区中随机抽取样本,并为每个样本计算目标Q = r(s,a) + γ V(s')(我们使用Q网络来估计这一步的V(s'))。然后我们用输入(s,a)和目标Q来训练Q网络。
该示例的另一个重要特征是使用了两个网络。第二个网络,我们称之为目标网络,仅用于在需要时计算V(s)估计。第一个网络做其他赢博体育的事情,并且还定期从重播缓冲区中接受新示例的训练。最后,在每10000帧游戏之后,我们将Q网络的权重复制到目标网络中。这种不寻常的两个网络策略的原因是为了提高我们Q学习的稳定性:由于Q(s,a)和V(s)递归相关,有时对Q(s,a)的更新可能会在这两个因素之间造成不受欢迎的反馈循环。这个问题的解决方案是通过只更新Q(s,a)网络来打破反馈循环,并暂时保持我们用来计算V(s)的网络冻结。当我们将权重从Q网络复制到目标网络时,最终更新为Q(s),a (s)将转移到V(s)。