6.3 深度Q-learning
刚刚介绍的Q-learning方法解决了在整个状态集上迭代的问题,但是在可观察到的状态集数量很大的情况下仍然会遇到困难。例如,Atari游戏具有多种不同的屏幕状态,因此,如果决定将原始像素作为单独的状态,那么很快就会意识到有太多的状态无法跟踪和估算。
在某些环境中,不同的可观察状态的数量几乎是无限的。例如,在CartPole中,环境提供的状态为四个浮点数。4个数值组合的数量是有限的(用位表示),但是这个数量非常大。我们可以通过创建箱体来离散化这些值,但和它能够解决的问题相比,这通常会引入更多的问题:需要确定哪些参数范围对于区分不同的状态非常重要,以及哪些范围可以聚集在一起。
在Atari的例子中,单个像素的变化不会产生太大的区别,因此将两个图像视为一个状态是有效的。但是,仍然需要区分某些状态。
图6.2显示了Pong游戏中的两种不同情况。我们通过控制球拍来对抗人工智能(Artificial Intelligence, AI)对手(我们的球拍在右侧,而对手的球拍在左侧)。游戏的目的是使球反弹,使其越过对手的球拍,同时防止球越过我们的球拍。我们可以认为这两种情况是完全不同的:在右侧的情况下,球靠近对手,因此我们可以放松并观察。但是,左侧的情况要求更高:假设球从左向右移动,球正在向我们这边移动,因此我们需要快速移动球拍以避免丢分。图6.2中的情况只是1070 802种可能情况中的两种,但是我们希望智能体对它们执行不同的动作。
图6.2 Pong的观察结果是模糊的(在左图中,球正向右朝我们的球拍移动,而在右图中,球的移动方向相反)
作为此问题的解决方案,我们可以使用非线性表示将状态和动作都映射到一个值。在机器学习中,这称为“回归问题”。表示形式根据训练的具体方法可能有所不同,但是你可能已经从本节标题中猜出来了,使用深度NN是最流行的选项之一,尤其是在处理屏幕图像类的观察结果时。考虑到这一点,我们对Q-learning算法进行修改:
1)用一些初始近似值初始化Q(s, a)。
2)通过与环境交互,获得元组(s, a, r, s')。
3)计算损失L:如果片段结束,则,否则。
4)通过最小化模型参数的损失,使用随机梯度下降(Stochastic Gradient Descent,SGD)算法更新Q(s, a)。
5)从步骤2开始重复,直到收敛为止。
前面的算法看起来很简单,但不幸的是,它的效果并不好。我们来讨论可能出问题的地方。
6.3.1 与环境交互
首先,我们需要以某种方式与环境交互以获得要训练的数据。在诸如FrozenLake之类的简单环境中,我们可以随机执行动作,但这是最佳策略吗?想象一下Pong游戏。随机移动球拍来得分的概率是多少?这个概率虽然不是零,但非常小,这意味着需要等待很长时间才能遇到这种罕见情况。作为替代方案,可以将Q函数近似作为动作的来源(就像之前在价值迭代方法中所做的那样,需要记住测试过程中的历史经验)。
如果对Q的表示是好的,那么从环境中获得的经验就可以展示相关数据给智能体以进行训练。但是,当近似估计不理想时(例如,在训练开始时),就会遇到麻烦。在这种情况下,智能体在某些状态下可能会困在不好的动作中,而不去探索其他的动作。这就是在第1章及本章前面部分中简要提到的探索与利用难题。一方面,智能体需要探索环境,以全面了解状态转移和动作结果。另一方面,应该有效地利用已有知识与环境交互:不应该浪费时间去随机尝试已经尝试过并已知奖励的动作。
如你所见,当Q近似值很差时,随机动作在训练开始时会比较好,因为它可以提供有关环境状态的更均匀分布的信息。随着训练的进行,随机动作变得效率低下,我们希望退回到通过Q近似值来决定如何采取行动。
混合执行两种极端行为的方法称为ε-greedy方法,它使用概率超参ε在随机策略和Q策略之间切换。通过改变ε,我们可以选择执行随机动作的比率。通常的做法是从ε=1.0(100%随机动作)开始,然后将其慢慢减小到某个较小的值,例如5%或2%随机动作。使用ε-greedy方法既有助于在训练开始时对环境进行探索,又有助于在训练结束时坚持良好的策略。探索与利用问题还有其他解决方案,我们将在本书的第三部分讨论其中一些。这个问题是RL中基本的开放性问题之一,也是一个尚未完全解决的活跃研究领域。
6.3.2 SGD优化
Q-learning过程的核心是从监督学习中借鉴而来的。实际上,我们正在尝试用NN近似一个复杂的非线性函数Q(s, a)。为此,必须使用Bellman方程计算该函数的目标,然后假装我们手头有一个监督学习问题。但是SGD优化的基本要求之一是训练数据独立同分布(i.i.d.)。
在我们的案例中,用于SGD更新的数据并不满足这些条件,因为:
1)样本并不是独立的。尽管我们积累了大量的数据样本,但因为它们属于同一片段,它们彼此是非常接近的。
2)训练数据的分布与我们要学习的最佳策略所提供的样本分布并不相同。我们拥有的数据是其他策略(当前的策略、随机策略,或者在ε-greedy方法中二者皆有)的结果,但是我们并不想学习如何随机运行,而是希望找到一个能获得最高奖励的最优策略。
为了解决这种麻烦,我们通常需要大量使用过去的经验,并从中提取训练数据样本,而不是使用最新经验数据。此技术称为回放缓冲区(replay buffer)。最简单的实现是设置一个固定大小的缓冲区,将新数据添加到缓冲区的末尾,同时将最旧的经验数据移除。
回放缓冲区允许我们在大致独立的数据上训练,但数据仍需足够新,以便在由最近策略生成的样本上训练。下一章将介绍另一种回放缓冲区:带优先级的回放缓冲区,它提供了更复杂的采样方法。
6.3.3 步骤之间的相关性
默认训练过程的另一个实际问题也与缺少i.i.d.数据有关,但方式略有不同。Bellman方程通过Q(s', a')提供Q(s, a)的值(此过程称为bootstrapping)。但是,状态s和s'之间只有一步之遥。这使得它们非常相似,而NN很难区分它们。当对NN的参数进行更新以使Q(s, a)更接近所需结果时,可以间接更改为Q(s', a')和附近其他状态产生的值。这会使训练变得非常不稳定,就像追逐自己的尾巴一样:当更新状态s的Q时,在随后的状态中,我们会发现Q(s', a')变得更糟,但是尝试更新它会破坏Q(s, a)的近似值,以此类推。
为了让训练更加稳定,使用一个叫作目标网络的技巧,通过该技巧我们可以保留网络的副本并将其用于Bellman方程中的Q(s', a')值。该网络仅周期性地与主网络同步,例如,每N步进行一次同步(其中N通常是很大的超参,例如1000或10 000次训练迭代)。
6.3.4 马尔可夫性质
RL方法以马尔可夫决策过程(MDP)为基础,它假设环境服从马尔可夫性质:从环境中观察到的一切都是获取最佳动作所需的。(换句话说,观察使我们能够区分不同状态。)
从前面的Pong游戏屏幕截图中可以看到,Atari游戏中的一张图像不足以捕获所有重要信息(仅使用一张图像,我们不知道物体的速度和方向,例如球和对手的球拍的速度和方向)。这显然违反了马尔可夫性质,并将单帧Pong环境变成了部分可观察的MDP(POMDP)。POMDP基本上是没有马尔可夫性质的MDP,在实际中非常重要。例如,对于大多数无法看到对手卡牌的纸牌游戏,游戏观察值就是POMDP,因为当前观察值(你的卡牌和桌上的卡牌)可能对应于对手手中的不同卡牌。
在本书中,我们不会详细讨论POMDP,但是会使用一个小技巧将环境推回到MDP领域。解决方案是保留过去的一些观察结果并将其作为状态。对于Atari游戏,我们通常将k个后续帧堆叠在一起,将其作为每个状态的观察值。这可以使智能体推算出当前状态的动态,例如获得球的速度及方向。Atari游戏常用的“经典”k值为4。当然,这只是一个小技巧,因为环境中的依赖时间可能更长,但是对于大多数游戏而言,这已经可以运行良好了。
6.3.5 DQN训练的最终形式
研究人员发现了许多其他技巧,可以使DQN训练更加稳定高效,我们将在下一章介绍其中的最佳技巧。但是,ε-greedy、回放缓冲区和目标网络构成了其基础,使AI公司DeepMind能够成功地在49款Atari游戏中训练DQN,并证明了在复杂环境中使用此方法的效果。
原始论文(无目标网络)已于2013年底发表(“Playing Atari with Deep Reinforcement Learning”, 1312.5602v1, Mnih等),并使用了7款游戏进行测试。后来,在2015年初,该论文的修订版包含了49种不同的游戏,发表在Nature杂志上(“Human-Level Control Through Deep Reinforcement Learning”, doi:10.1038/nature14236, Mnih等)。
前面论文中的DQN算法包含以下步骤:
1)使用随机权重(ε←1.0)初始化Q(s, a)和的参数,清空回放缓冲区。
2)以概率ε选择一个随机动作a,否则。
3)在模拟器中执行动作a,观察奖励r和下一个状态s'。
4)将转移过程(s, a, r, s')存储在回放缓冲区中。
5)从回放缓冲区中采样一个随机的小批量转移过程。
6)对于回放缓冲区中的每个转移过程,如果片段在此步结束,则计算目标y=r,否则计算。
7)计算损失:L=(Q(s, a)–y)2。
8)通过最小化模型参数的损失,使用SGD算法更新Q(s, a)。
9)每N步,将权重从Q复制到。
10)从步骤2开始重复,直到收敛为止。
我们现在就实现它并尝试击败Atari游戏!