如何将强化学习应用于具有无限多动作的游戏?

人工智能 强化学习 游戏-ai 应用 爪哇
2021-11-10 23:04:28

如果可能的话,我试图弄清楚如何使用强化学习算法作为“黑匣子”来玩游戏。在这个游戏中,玩家必须避免飞鸟。如果他想移动,他必须在显示器上移动鼠标,它通过施加力来控制玩家的位置。玩家可以选择鼠标在显示器上的任何位置。一个人可以玩这个游戏。要了解需要做什么,请查看此 Youtube 视频

我考虑过使用人工神经网络,它将游戏的信息(例如位置、速度、半径等)作为输入并输出一个动作。但是,我不太可能记录足够的训练数据来正确训练网络。

因此,我认为像 Q-learning 这样的 RL 算法更适合这项任务。但是,我不知道如何将 Q-learning 应用于此任务。例如,编码员怎么可能知道另一次行动会带来什么未来的回报?

我有几个问题:

  1. 在这种情况下,玩家有无限多的动作。我将如何将 RL 应用于这种情况?

  2. RL 是解决此任务的好方法吗?

  3. 是否有一个方便的 Java 库可以让我使用 RL 算法(作为块盒)来解决这个问题?

  4. 有替代品吗?

1个回答

这看起来像是强化学习算法可以学习玩的那种游戏。如果你是直接从游戏对象中学习(而不是想让代理通过查看屏幕来学习),那么这样做应该相对简单——我的意思是它会涉及一些新概念,一些数学,也许你需要几周的时间来学习足够的知识,并在人工智能上进行足够的实验,直到你有一些好的东西。但至少你不应该需要一个 GPU 服务器集群来运行你的学习器。

但是,我不知道如何将 Q-learning 应用于此任务。例如,编码员怎么可能知道另一次行动会带来什么未来的回报?

这是 RL 的主要部分——作为 RL 一部分的算法都解决了这个问题。因此,编码者不需要知道如何计算未来的奖励,只需要立即的奖励。对于示例游戏,您似乎可以授予以下奖励+1对于播放器不会崩溃的每一帧。可以解决这种环境的 RL 算法应该通过“反复试验”找出哪些动作可以让游戏继续运行。

Q Learning 通过跟踪对未来价值的估计并跨时间步更新它们来实现这一点——如果采取行动a1处于状态s1始终导致后来的状态s2具有高值,则 Q learning 将更新其对值的估计Q(s1,a1)也要高。估计开始时非常糟糕,但是随着代理的学习,更新会通过时间步长返回,并且只要事情没有出错,最终它会知道一个动作会比另一个动作带来更高的价值,并且它能够始终如一地选择它。

这是一个非常基本的问题,如果你想使用 RL,即使你找到了一个为你实现整个事情的库,你显然也需要学习一些 RL 的基础知识。有几个不同的地方可以做到这一点。我可以推荐两个我用过的:

两者都是该主题的在线、免费和全面介绍。如果您搜索例如“Q 学习教程”,您可以在网上找到更短、更直接的介绍。

准备好花几个小时来学习足够多的主题,了解如何构建数据和与游戏交互,以便为你的 AI 创建学习环境。

  1. 在这种情况下,玩家有无限多的动作。我将如何将 RL 应用于这种情况?

这是一个很好的问题。有些算法比其他算法更好。Q Learning 不能与无限多的动作一起工作。但是,您可以选择一组离散的鼠标点 - 例如,可能是 64 个 - 与玩家(红点)不同的角度和距离,并尝试获取这些点的值。这将允许您尝试 Q 学习,并且值得考虑,因为正确解决大型动作空间的 RL 更难理解和使用。您可以为此研究 DQN 算法。简而言之,DQN 算法使用动作历史及其即时结果来训练神经网络来估计每个动作的值。

如果您真的想正确解决大型动作空间,那么您需要研究 Policy Gradient 方法。两种流行且有效的 PG 算法是 A3C 和 DDPG。这些更难学习和实施。他们使用神经网络来学习多种功能,其中之一是策略——在给定当前状态/观察的情况下,它直接选择要采取的行动。

  1. RL 是解决此任务的好方法吗?

绝对可以使用 RL 来做你想做的事。

  1. 是否有一个方便的 Java 库可以让我使用 RL 算法(作为块盒)来解决这个问题?

我在简短的搜索中找不到一个。首先,您可能想查看实现了 Sutton & Barto 的一些算法的java-reinforcement-learning,这将是一个很好的起点。我发现的大多数其他 Java 包都涵盖了基础知识和学习材料,但它们不是即插即用的游戏。

如果您确实找到了一个库,您将需要学习足够的基本 RL 才能了解如何使用它。

  1. 有替代品吗?

一种可能适用于您的游戏环境并且更容易理解和实施的替代方法是将策略函数(如神经网络)与尝试策略变体的进化算法相结合。这里的首选算法可能是 NEAT,它能够有效地解决简单的游戏代理。您的游戏应该适合 NEAT,因为生存时间评分系统提供了良好的适应度函数。

在深入研究(非常难以理解)A3C 和 DDPG 算法之前,真正值得尝试的一件事是交叉熵方法它是一个非常简单的 RL 代理,与遗传算法有一些相似之处(它选择“最佳”项目,但不是从总体中选择,而是来自同一个人的随机行为),但并不总是能很好地扩展。但是,它可能适用于您的游戏。