背景信息:
我正在尝试使用前馈人工神经网络为视频游戏创建AI,并且我遇到了一些问题,即我的一些输入功能依赖于其他输入功能的存在或价值。
我能想到的最基本,最简单的例子是:
功能1是玩家数量(范围2 ... 5) 功能2到?是每个玩家的得分(范围> = 0)
通知ANN的分数所需的功能数量取决于玩家的数量。
问题:如何将这种动态知识输入表示为ANN?
我已经考虑过的事情:
只是不使用此类功能,或将它们合并到静态输入中。 I.E使用球员得分的总和代替。我严重怀疑这适用于我的问题,它会导致信息丢失,人工神经网络表现不佳。
为不存在的输入传递错误值(例如-1)或默认值(例如0) 我不确定这会有多好用,理论上人工神经网络可以很容易地从这个输入中学习并适当地模拟这个功能。在实践中,我担心导致人工神经网络出现问题的数量不存在。例如,如果玩家的范围是2-10,如果只有2个玩家,80%的输入数据将是不存在的,并且会在ANN中引入奇怪的偏差,从而导致性能不佳。
在不存在的输入上传递训练集上的平均值 同样,不存在的输入量也是一个问题,我担心这会给离散值输入带来奇怪的问题。
所以,我问这个问题,有没有人能想到其他任何解决方案?是否有一种标准或常用的方法来处理这个问题?
我知道这对于SO而言是一个相当小众而又复杂的问题,但我对“如何修复此代码感到厌倦?”和“我如何在PHP / Javascript中执行此操作?”问:P,谢谢你们。
答案 0 :(得分:3)
听起来你有多个数据集(对于每个玩家数量)彼此并不真正相容。从5人游戏中吸取的教训真的适用于2人游戏吗?尝试简化问题,例如#1,并查看程序的执行情况。在AI中,荒谬的简化有时会给你带来很多牵引力,比如垃圾邮件过滤器中的bag of words。
答案 1 :(得分:1)
尝试考虑以下模型:
假设xi(例如x1)是可变数量可以存在的输入之一。你可以有n个(x1到xn)。让y成为其余的输入。
在第一个隐藏层上,将x1和y传递给前c个节点,x1,x2和y传递给下一个c节点,x1,x2,x3和y传递给下一个c节点,依此类推。假设x1和x3都不能在没有x2的情况下激活。如果需要,模型必须适当改变。
网络的其余部分是标准的前馈网络,所有节点都连接到下一层的所有节点,无论您选择哪种节点。
每当你有w个有效输入时,禁用除了第三组c节点之外的所有节点(完全将它们排除在该输入集的训练之外,在计算它们输出到的节点的值时不要包含它们,不要&# 39; t更新其输入或输出的权重)。这将允许大多数网络进行训练,但对于第一个隐藏层,只有适用于该数量输入的部分。
我建议选择c使得c * n(第一个隐藏层中的节点数)大于(或等于)第二个隐藏层中的节点数(并且c至少为c) 10对于中等规模的网络(进入100s也很好))我还建议网络至少有2个其他隐藏层(总共3个,不包括输入和输出)。这不是经验,而是我的直觉告诉我的。
这种工作取决于不同数量的输入之间的某种(可能是不可确定的)相似性,并且如果有的话,如果这种相似性不存在则可能效果不好。对于每个输入数量,这也可能需要相当多的训练数据。
如果你试试,让我/我们知道它是否有效。
如果您对人工智能讨论感兴趣,我建议您加入一些专门针对它的Linked-In小组,其中一些非常活跃,并且讨论很有趣。在涉及人工智能时,堆栈溢出似乎并没有发生太多事情,或者我们应该努力改变它,或者两者兼而有之。
<强>更新强>
以下是一些体面的人工智能LinkedIn群组的名单(除非他们最近改变了他们的政策,它应该很容易加入):
&#39;人工智能研究人员,教师+专业人员&#39;
&#39;人工智能应用&#39;
&#39;人工神经网络&#39;
&#39; AGI - 人工智能&#39;
&#39;应用人工智能&#39; (目前没有太多进展,仍处理一些垃圾邮件,但情况正在好转)
&#39; Text Analytics&#39; (如果您对此感兴趣)