我一直在尝试使用多层感知器和反向传播为井字游戏编写人工智能。我的想法是训练神经网络成为棋盘状态的准确评估函数,但问题是即使在分析了数千场比赛之后,网络也无法输出准确的评估。
我使用 27 个输入神经元; 3x3 板上的每个方 block 都与三个输入神经元相关联,这些神经元接收值 0 或 1,具体取决于方 block 是否有 x、o 还是空白。这 27 个输入神经元向 10 个隐藏神经元发送信号(我任意选择了 10 个,但我也尝试过使用 5 个和 15 个)。
对于训练,我让程序通过使用当前的评估函数与自身进行对战来生成一系列游戏,以选择每一方被认为是最佳的 Action 。生成游戏后,神经网络通过将给定棋盘状态的正确输出作为游戏中紧随其后的棋盘状态的值(使用评估函数)来编译训练示例(包括棋盘状态和正确输出)。游戏顺序。我认为这就是 Gerald Tesauro 在编写 TD-Gammon 时所做的事情,但我可能误解了这篇文章。 (注:我把更新权重的具体机制放在了这篇文章的底部)。
我尝试了各种学习率值以及不同数量的隐藏神经元,但似乎没有任何效果。即使经过几个小时的“学习”,策略也没有明显的改进,评估函数也远不准确。
我意识到有更简单的方法来编程 tic tac toe,但我想用多层感知器来实现,这样我以后就可以应用它来连接 4。这可能吗?我开始认为对于具有合理数量的隐藏神经元的井字游戏板来说,没有可靠的评估函数。
我向你保证,我并不是在寻找一些快速代码来提交家庭作业。我已经工作了一段时间不成功,只是想知道我做错了什么。感谢所有建议。
<小时/>这是我用于神经网络的具体机制:
27 个输入神经元中的每一个都接收一个 0 或 1,它通过可微分的 sigmoid 函数 1/(1+e^(-x))。每个输入神经元 i 将此输出 (i.output) 乘以某个权重 (i.weights[h]) 发送到每个隐藏神经元 h。这些值的总和被隐藏神经元 h (h.input) 作为输入,并且该输入通过 sigmoid 形成每个隐藏神经元的输出 (h.output)。我将最后一个输入表示为所有隐藏神经元的 (h.output * h.weight) 之和。板的输出值为 sigmoid(lastInput)。
我将学习率表示为 alpha,并将 err 表示为正确输出减去实际输出。我还让 dSigmoid(x) 等于 sigmoid 在 x 点的导数。
每个隐藏神经元 h 的权重按值递增:(alpha*err*dSigmoid(lastInput)*h.output),并且从给定输入神经元 i 到给定隐藏神经元 h 的信号权重递增通过值:(alpha*err*dSigmoid(lastInput)*h.weight*dSigmoid(h.input)*i.output)。
我从反向传播讲座中得到了这些公式:http://www.youtube.com/watch?v=UnWL2w7Fuo8 .
最佳答案
井字游戏有 3^9 = 19683 个状态(实际上,其中一些状态是不合法的,但数量级是正确的)。输出函数并不平滑,所以我认为反向传播网络能做的最好的事情就是“死记硬背”所有这些状态的查找表。
考虑到这一点,10 个隐藏神经元看起来非常小,并且您不可能通过教授几千个游戏来训练 20k 个不同的查找表条目。为此,网络必须从它所学的状态“推断”到它从未见过的状态,而且我不知道它如何做到这一点。
关于machine-learning - 作为评估函数的 Tic Tac Toe 神经网络,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10680049/