背景:
我正在尝试使用前馈人工神经网络为视频游戏开发AI,但在实验过程中发现一些输入特征依赖于其他输入特征的存在或值。
我能想到的最基本、最简化的例子是这样的:
特征1是玩家数量(范围为2到5),特征2到?是每个玩家的得分(范围大于等于0)。
需要告知ANN得分的特征数量取决于玩家数量。
问题:如何向ANN表示这种动态知识输入?
我已经考虑过的事情:
-
简单地不使用这些特征,或者将它们合并为静态输入。例如,使用玩家得分的总和代替。我严重怀疑这是否适用于我的问题,这会导致信息损失过多,ANN将无法良好执行。
-
为不存在的输入传递错误值(例如-1)或默认值(例如0)。我不知道这会不会有效,理论上ANN可以从这种输入中学习并适当建模函数。但在实践中,我担心大量不存在的输入会给ANN带来问题。例如,如果玩家数量范围是2到10,如果只有2个玩家,80%的输入数据将不存在,这会给ANN引入奇怪的偏见,导致性能不佳。
-
在不存在的输入处传递训练集上的平均值。同样,不存在的输入数量会是一个问题,我担心这会为离散值输入引入奇怪的问题。
所以,我问这个问题,有没有人有其他我可以考虑的解决方案?处理这个问题是否有标准或常用的方法?
我知道这是一个相当小众且复杂的问题,但我在SO上对“如何修复这段代码?”和“如何在PHP/JavaScript中做这个?”的问题感到厌倦了:P,谢谢大家。
回答:
试着考虑以下模型:
假设xi(例如x1)是可能存在可变数量的输入之一。你可以有n个这样的输入(x1到xn)。让y是其余的输入。
在你的第一隐藏层,将x1和y传递给前c个节点,将x1、x2和y传递给接下来的c个节点,将x1、x2、x3和y传递给再接下来的c个节点,依此类推。这假设x1和x3不能在没有x2的情况下同时激活。如果需要这种情况,模型需要相应地改变。
网络的其余部分是一个标准的前馈网络,所有节点都连接到下一层的节点,或者你选择的任何方式。
每当你有w个激活输入时,禁用除了第w组c个节点之外的所有节点(完全排除它们在该输入集的训练中,不包括它们在计算它们输出到的节点的值时,不更新它们的输入或输出的权重)。这将允许网络的大部分进行训练,但对于第一隐藏层,只有适用于该输入数量的部分进行训练。
我建议选择c,使得c*n(第一隐藏层中的节点数)大于(或等于)第二隐藏层中的节点数(并且c至少为10,对于中等大小的网络(到100s也是可以的)),我还建议网络至少有另外两个隐藏层(总共3个,排除输入和输出层)。这不是来自经验,而是我的直觉告诉我的。
这种工作依赖于不同输入数量之间的某种(可能无法定义的)相似性,如果这种相似性不存在,可能会效果不佳,甚至根本不起作用。这也可能需要每个输入数量的大量训练数据。
如果你尝试了,请告诉我/我们是否有效。
如果你对人工智能讨论感兴趣,我建议加入一些专门讨论它的Linked-In群组,有些群组非常活跃且有有趣的讨论。在stackoverflow上似乎没有太多关于人工智能的活动,或者我们应该努力改变这一点,或者两者兼而有之。
更新:
以下是一些不错的人工智能LinkedIn群组的名称列表(除非他们最近改变了政策,否则应该很容易加入):
-
‘人工智能研究人员、教职员工及专业人士’
-
‘人工智能应用’
-
‘人工神经网络’
-
‘AGI — 人工通用智能’
-
‘应用人工智能’(目前活动不多,且仍在处理一些垃圾信息,但情况正在好转)
-
‘文本分析’(如果你对这个感兴趣)