我想使用人工神经网络来玩井字棋。我对网络的配置如下:对于 9 个字段中的每一个,我使用 2 个输入神经元。当然,所以我总共有 18 个输入神经元。对于每个字段,我为玩家 1 的棋子准备 1 个输入神经元,为玩家 2 的棋子准备 1 个神经元。除此之外,我还有 1 个输出神经元,它给出当前棋盘位置的评估。输出值越高,对玩家 1 来说位置越好。输出值越低,对玩家 2 来说位置越好。
但我的问题是:我该如何编写这个神经网络?我的想法是使用一个 Array[1-18] 作为输入神经元。这个数组的值是输入权重。然后我会用一个循环遍历数组。每当有一个神经元被激活,我就把权重加到输出值上。因此,输出值是激活的输入神经元的权重的总和:
Output = SUM(ActivatedInputNeurons)
你认为这是编程网络的好方法吗?你有什么更好的想法吗?
我希望你能帮助我。提前感谢!
回答:
好吧,你有一个由 18 个神经元组成的输入层和一个由 1 个神经元组成的输出层。这没问题。但是,你需要让你的神经网络有机会将输入关联起来。为此,你至少需要一个中间层。我建议在中间层使用 9 个神经元。这些神经元中的每一个都应连接到每个输入神经元,并且输出神经元应连接到每个中间神经元。每个这样的连接都有一个权重,并且每个神经元都有一个激活水平。
然后,你一次一层地遍历所有神经元。输入层只是用棋盘状态激活。对于所有其他神经元,你遍历其各自的连接,并将连接的神经元的激活水平与连接的权重之积求和。最后,你通过对这个总和应用 sigmoid 函数来计算激活水平。
这是工作原理。现在,你需要训练这个网络以获得更好的结果。有几种算法可以做到这一点,你将不得不进行一些谷歌搜索和阅读。最后,如果结果没有足够快地令人信服,你可能需要调整神经元和层的数量。例如,你可以将输入层减少到 9 个神经元,并用 +1 激活 X,用 -1 激活 O。或许添加另一个中间层会产生更好的结果,或者增加一层的神经元数量。