【发布时间】:2012-05-27 15:30:58
【问题描述】:
我一直在尝试使用多层感知器和反向传播来编写用于井字游戏的 AI。我的想法是训练神经网络成为棋盘状态的准确评估函数,但问题是即使在分析了数千场游戏之后,网络也无法输出准确的评估。
我使用了 27 个输入神经元; 3x3 板上的每个方块都与三个输入神经元相关联,它们接收值 0 或 1,具体取决于方块是否有 x、o 或空白。这 27 个输入神经元向 10 个隐藏神经元发送信号(我随意选择了 10 个,但我也尝试了 5 个和 15 个)。
对于训练,我让程序生成一系列游戏,通过使用当前评估函数与自己对战来选择被认为是每一方的最佳动作。生成游戏后,NN 通过将给定棋盘状态的正确输出作为跟随它的棋盘状态的值(使用评估函数)来编译训练示例(包括棋盘状态和正确输出)。游戏顺序。我认为这是 Gerald Tesauro 在编写 TD-Gammon 时所做的,但我可能误解了这篇文章。 (注意:我把更新权重的具体机制放在了这篇文章的底部)。
我尝试了不同的学习率值,以及不同数量的隐藏神经元,但似乎没有任何效果。即使经过数小时的“学习”,策略也没有明显的改进,评估功能也无法接近准确。
我意识到编程井字游戏有很多更简单的方法,但我想使用多层感知器来实现,以便以后可以将其应用于连接 4。这甚至可能吗?我开始认为对于具有合理数量的隐藏神经元的井字棋棋盘来说,没有可靠的评估函数。
我向您保证,我不是在寻找一些快速代码来完成家庭作业。我已经工作了一段时间没有成功,只是想知道我做错了什么。感谢所有建议。
这是我用于NN的具体机制:
27 个输入神经元中的每一个都接收一个 0 或 1,它通过可微 sigmoid 函数 1/(1+e^(-x))。每个输入神经元 i 发送这个输出(i.output),乘以某个权重(i.weights[h])到每个隐藏神经元 h。这些值的总和作为隐藏神经元 h (h.input) 的输入,该输入通过 sigmoid 形成每个隐藏神经元的输出 (h.output)。我将 lastInput 表示为所有隐藏神经元的 (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。
【问题讨论】:
标签: machine-learning neural-network tic-tac-toe backpropagation