我有一个游戏,我想建立一个模型来学习玩这个游戏。然而,环境输出是两个列表,分别代表用户和对手的士兵的位置和数量。
列表的长度随着每一步而变化,因此要知道网络的输入大小是一个问题。
如何处理?
我有一个游戏,我想建立一个模型来学习玩这个游戏。然而,环境输出是两个列表,分别代表用户和对手的士兵的位置和数量。
列表的长度随着每一步而变化,因此要知道网络的输入大小是一个问题。
如何处理?
尽管这个问题在强化学习 (RL) 项目中经常发生,但这不是 RL 问题。这个问题是由于神经网络的要求,也适用于许多其他参数化机器学习解决方案。
您可以以有限的方式改变神经网络的参数数量。然而,它通常只能在训练(或重新训练)之前完成,并且不适合处理在少量时间步长内发生的变化,或在训练后预测期间(例如,当与训练有素的代理)。
您可以采取几种不同的方法。哪个合适取决于游戏的细节:
这是最简单的方法,您无需进行太多额外研究即可做到这一点。它依赖于您在任何时间步可能需要的最大输入数量。
实际考虑:
有一个简单的机制来识别是否存在一组特定的输入。例如添加一个标志以显示一个单元的存在,将代表该单元的其余输入保留为某个中性值,例如.
如果仅在极少数情况下使用最后几个输入,您应该期望神经网络非常缓慢地了解这些情况。它不会在不同输入“插槽”中的单元之间进行泛化,除非您更改架构以链接它们。
这对于运动是离散的并且存在限制任何单个空间中可能的堆叠量的规则的游戏非常有效。它还允许您使用 CNN 架构。
例如,这就是 AlphaZero 表示围棋和国际象棋的方式,它们都允许在任何时候在棋盘上出现不同数量的棋子,但棋盘本身是严格定义的。在国际象棋的情况下,这也是 AlphaZero 如何识别要移动的棋子,以及如何通过匹配网格上的输出来选择棋子和移动类型(在这种情况下,每个选择/移动类型组合都是一个单独的输出通道,输出同时代表 1000 次潜在移动)。
实际考虑:
如果您的单位有您需要跟踪的统计数据,那么这些数据中的每一个都可以进入一个单独的网格实例(有时称为“平面”或“通道”)。因此,假设棋盘是 2D,您可能有一个网格显示棋子的存在,另一个标识它的类型,另一个标识其附着强度等,所有这些都堆叠成一个 3D 结构。
如果地图非常大或连续,则可以将其离散为网格。
使用 CNN 可以基于片段及其统计数据之间的相似性进行良好的泛化。然而,如果网格非常大,或者任何一个网格位置的棋子堆可能变得很大,并且需要更大的内存占用来表示游戏状态,则该方法会变得有限。
从技术上讲,将游戏表示为地图/棋盘只是 RL 中特征工程的一种常见形式。无论它是否有效,您都了解这款游戏,并且可能知道哪些因素对玩好游戏很重要。您可以使用这些知识来简化表示并总结与单元数量无关的关键细节。
例如,根据游戏中最强单位的接近程度来确定游戏的优先级可能很重要。因此,您可以根据此启发式对可用单元进行排序,并提供较小的固定数量的关键单元。
实际考虑:
这可以与任何其他方法结合使用。
这在很大程度上取决于您的创造力和对游戏的良好技术理解,以及在用于神经网络的功能中效果如何。
如果您需要有关可能的特征工程方法的建议,我建议您打开一个新问题,其中包含正在玩的游戏的更多细节。
循环神经网络架构,例如 LSTM 或 GRU,可以直接处理混合长度的序列。当序列中的每个项目都是同一种对象但具有不同的特征值时,这可以很好地工作。
实际考虑:
RNN 比完全连接的前馈网络或 CNN 更难理解和训练。
如果两个单元列表只是游戏表示的一部分,您将需要一个将 RNN 架构与其他神经网络设计相结合的混合系统。