我们这里要简要介绍一下增强学习(RL)——一种为了提高玩游戏效率的训练程序的通用技术。我们的目标是解释其实际实现:我们讲述一些基本理论,然后走马观花地看一下为玩《战舰》游戏而训练神经网络的最小python程序。
导言
增强学习[RL]技术是一种可用于提高效玩游戏效率的学习算法。与督导机器学习[ML]方法一样,增强学习是从数据——这里是指过去玩游戏的数据——中进行学习。然而,尽管督导学习算法只是根据现有的数据进行训练,但RL还挑战如何在收集数据的过程中表现良好性能。具体地说,我们所追求的设计原则是
让程序从过去实例中识别好的战略,
通过连续地玩游戏快速地学习新的战略。
我们在这里特想让我们的算法快速学习的理由是在培训数据有限或者战略空间太大而难以进行穷尽搜索的情况下最富有成果地运用RL。正是在这种体制下督导技术面临困境而RL则闪耀着光芒。
我们在本贴中要回顾一般性的RL培训程序:策略梯度、深度学习方案。我们下一节要回顾一下这种办法背后的理论。随后,我们将粗略地演示一下培训神经网络来玩战舰游戏的 python 实现。
我们的python码可以从我们的github网页这里下载。它需要 jupyter, tensorflow, numpy, 和 matplotlib包。
策略梯度,深度RL
策略深度和深度RL有两个主要构件。下面我们要详述二者并描述它们是如何协作训练好的模型的。
策略网络
一定深度RL算法的策略是一种神经网络,它将状态值ss映射为一定游戏行为 aa的概率。 换句话说,该网络的输入层接受环境的数字编码——游戏在特定时刻的状态。当输入通过网络馈送后,其输出层的值对应着我们现有每个行动可选的对数概率——我们可供选择的每个可能的行动都有一个输出节点。请注意如果我们肯定知道我们应采取的步骤,只有一个输出节点有一定的概率。但如果我们的网络不能肯定哪种行动最优时,那么就不只一个节点有一定的权值。
为了说明这一点,我们来图示一下下面“战舰”程序中所用的网络。(要回顾“战舰”的游戏规则请看注[1])简明起见,我们只用一维战舰网格。我们然后对我们对手的每个网格位置用一个输入神经元将我们对目前的环境知识进行编码。具体地说,我们对于每个神经元/下标运用下列编码:
在下面例图中,我们有五个输入神经元,因此游戏盘的大小是五。前三个神经元的值是−1−1 表明我们尚未轰炸这些网格点。最后两个分别是+1+1 和 00, 意味着战舰位于第四而不是第五的位置。
需要注意的是,在所显示的策略网输出层中,前三项值标为对数概率。这些值对应着每个下标的下次轰炸的概率。我们不能再次轰炸第四和第五个网格点,所以,尽管网络可能对这些神经元输出一些值,我们会忽略它们。
需要注意的是,在所显示的策略网输出层中,前三项值标为对数概率。这些值对应着每个下标的下次轰炸的概率。我们不能再次轰炸第四和第五个网格点,所以,尽管网络可能对这些神经元输出一些值,我们会忽略它们。 在我们继续前,我们注意到我们对我们的策略运用神经网络的理由是进行有效地归纳:对于象围棋这样有大量状态值的游戏来说,收集每个可能的游戏盘位置的数据并不可行。这正是ML算法所擅长的场合——根据过去的观测进行归纳从而对新局面做出很好的预测。为了将注意力放在RL上,我们不想在本贴中回顾ML算法(但你可以看看我们的库中的入门章节)。我们只是提请注意——利用这些工具,我们通过只培训游戏中有代表性的子集就能获得良好的性能而不必研究会非常庞大的整个集合。
收益函数
为了训练RL算法,我们必须反复地进行游戏/得分过程:我们根据当前的策略玩游戏,根据与该网络输出的概率成比例的频率做出移动选择。如果所采取的行动得到好的结果,我们就要在往后提高这些行动的概率。
收益函数是我们用于对我们以前游戏的结果进行正式打分的工具——我们将鼓励我们的算法在游戏期间努力将该量最大化。它其实是RL算法的超级参数:可以使用许多不同的函数,并每个都得出不同的学习特征。对于我们的战舰程序来说,我们用下列函数