【问题标题】:Tic Tac Toe Neural Network as Evaluation Function井字神经网络作为评估函数
【发布时间】: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


    【解决方案1】:

    Here 你可以找到一个在 Tik Tak Toe(可变棋盘大小)中使用 self-play 训练神经网络的实现。梯度通过一个简单的梯度复制技巧在整个游戏中反向传播。

    【讨论】:

      【解决方案2】:

      只是提出另一个想法,您是否考虑过使用强化学习来完成这项任务?这将更容易实施并且更有效。例如,您可以使用经常用于游戏的 Q learning。

      【讨论】:

        【解决方案3】:

        您可能需要考虑多个隐藏层,以及增加隐藏层的大小。为了进行比较,Fogel 和 Chellapilla 使用了两层 40 和 10 个神经元来编程一个跳棋玩家,所以如果你需要更多的东西,那么可能会出现严重错误。

        如果您还没有使用,您可能还想使用偏差输入。

        您的基本方法似乎是合理的,尽管我不能 100% 确定您的意思:

        After generating a game, the NN compiles training examples (which comprise a board state and the correct output) by taking the correct output for a given board state to be the value (using the evaluation function) of the board state that follows it in the game sequence.

        我认为您的意思是您正在使用一些已知良好的方法(例如极小极大博弈树)来确定训练示例的“正确”答案。你能解释一下吗?或者,如果我是对的,就对称板而言,似乎有一个微妙的问题需要处理,它可能有不止一个同样好的最佳响应。如果您只将其中之一视为正确,则可能会导致问题。 (或者它可能不会,我不确定。)

        【讨论】:

        • 感谢您的回复。为了生成训练示例,我实际上并没有使用已知的好方法;我只是让程序使用其当前的评估功能与自己对战。当然,原始游戏序列是随机的,但想法是随着神经网络收敛到良好的评估函数,训练集变得更加最优。我在网上看到这是 Tesauro 在编写 TD-Gammon 时使用的方法。
        【解决方案4】:

        井字游戏有 3^9 = 19683 个状态(实际上,其中一些是不合法的,但数量级是正确的)。输出函数并不平滑,所以我认为反向传播网络可以做的最好的事情是“死记硬背”所有这些状态的查找表。

        考虑到这一点,10 个隐藏的神经元似乎非常小,你不可能通过教几千个游戏来训练 20k 个不同的查找表条目。为此,网络必须从它被教导的状态“推断”到它从未见过的状态,我不知道它怎么能做到这一点。

        【讨论】:

        • 我意识到查找表对于井字游戏绝对是可行的,并且成功地对所有棋盘状态进行了编程。正如我在原始帖子中提到的,我正在寻找使用神经网络对井字游戏进行编程,以便我可以将相同的想法应用于 Connect 4 算法,在这种算法中查找表不起作用。
        • @Site:但这就是重点,您的 ANN 只是一个查找表。它应该如何判断它从未见过的位置?这只有在从输入到输出的函数是平滑的情况下才有可能,即网络可以在训练的模式之间进行插值。您可以尝试为其提供不同的输入功能,其中插值可能有效。例如,只有一个/两个玩家或敌人的行/列/对角线的数量。
        • 添加到 Niki 的答案:我尝试了与您相同的方法(27 ​​个输入神经元,1 个输出神经元),但我也无法教网络。
        • @Niki:NN 可以从 Tik Tak Toe 中的状态“推断”出来,因为仅查看部分游戏时就可以确定一些最佳动作。
        • @pianissimo:你说得对,数字 3^9 不准确 - 你不必存储 每个 位置,其中一些不是甚至合法。这只是一个数量级。拥有 10 个隐藏节点根本无法工作,即使网络足够聪明,可以仅通过查看部分游戏来“推断”某些位置。如果你使用例如一个 CNN,那么网络可能会从一行泛化到另一行或从一列泛化到另一列。但是一个完全连接的网络必须或多或少地“记住”每个位置的所有内容。
        猜你喜欢
        • 2013-06-30
        • 2018-04-30
        • 2017-06-07
        • 2016-11-04
        • 2017-04-13
        • 1970-01-01
        • 1970-01-01
        • 2019-11-17
        • 2017-12-05
        相关资源
        最近更新 更多