我很难设置一个神经网络来将Tic-Tac-Toe板状态(最终或中间)分类为“X wins”,“O wins”或“Tie”。
我将描述我目前的解决方案和结果。任何建议都表示赞赏。
* DATA SET * 数据集= 958个可能的结束游戏+ 958个随机游戏= 1916个董事会状态 (随机游戏可能不完整,但都是合法的。即两个玩家不能同时获胜)。
训练集= 1600数据集的随机样本 测试集=剩余316例
在我目前的伪随机开发方案中,数据集具有以下特征。 训练集: - “X”赢得527胜 - “O”获得264胜 - 809关系 测试集: - “X”获得104胜 - “O”获得56胜 - 156关系
*调制* 输入层:18个输入神经元,其中每个神经元对应一个棋盘位置和玩家。因此, 董事会(B =空白): x x o o x B B o X. 编码为: 1 0 1 0 0 1 0 1 1 0 0 0 0 0 0 1 1 0
输出层:3个输出神经元,对应于每个结果(X wins,O wins,Tie)。
*架构*
基于:http://www.cs.toronto.edu/~hinton/csc321/matlab/assignment2.tar.gz
1个单隐藏层 隐藏层激活功能:Logistic 输出层激活功能:Softmax 错误功能:交叉熵
*结果*
没有参数组合似乎达到100%正确的分类率。一些例子:
NHidden LRate InitW MaxEpoch Epochs FMom Errors TestErrors
8 0,0025 0,01 10000 4500 0,8 0 7
16 0,0025 0,01 10000 2800 0,8 0 5
16 0,0025 0,1 5000 1000 0,8 0 4
16 0,0025 0,5 5000 5000 0,8 3 5
16 0,0025 0,25 5000 1000 0,8 0 5
16 0,005 0,25 5000 1000 0,9 10 5
16 0,005 0,25 5000 5000 0,8 15 5
16 0,0025 0,25 5000 1000 0,8 0 5
32 0,0025 0,25 5000 1500 0,8 0 5
32 0,0025 0,5 5000 600 0,9 0 5
8 0,0025 0,25 5000 3500 0,8 0 5
重要 - 如果您认为我可以改进以下任何一项: - 数据集特征(培训和测试用例的来源和数量)不是最好的。 - 替代问题调制更合适(输入/输出神经元的编码) - 更好的网络架构(隐藏层数,激活/错误功能等)。
假设我目前在这方面的选择,即使不是最优的,也不应该阻止系统具有100%正确的分类率,我想关注其他可能的问题。
换句话说,考虑到游戏的简单性,这个数据集/调制/架构应该这样做,因此,我对参数做错了什么?
我对ANN没有太多经验,我的主要问题如下: 通过使用16个隐藏神经元,ANN可以学会将每个隐藏单元与“以某种方式获胜的某个玩家”相关联 (3个不同的行+ 3个不同的列+ 2个对角线)* 2个玩家
在此设置中,“最佳”权重集非常简单:每个隐藏单元具有来自3个输入单元(对应于玩家的行,列或对角线)和“更大”的“更大”连接权重“连接到其中一个输出单元的重量(对应于该玩家的”胜利“)。
无论我做什么,我都无法减少测试错误的数量,如上表所示。
感谢任何建议。
答案 0 :(得分:2)
你正在做的一切都是正确的,但你只是想在这里解决一个难题,即从一些井字游戏配置的例子中概括到所有其他。
不幸的是,您使用的简单神经网络不会感知输入(邻域)的空间结构,也无法利用对称性。因此,为了获得完美的测试错误,您可以:
增加数据集的大小以包含大多数(或所有)可能的配置 - 然后网络将能够简单地记忆,如大多数设置中的零训练错误所示;
选择一个不同的问题,其中有更多结构要概括;
使用可以捕获对称性(例如,通过权重共享)和/或输入的空间关系(例如,不同的特征)的网络架构。 Convolutional networks就是其中的一个例子。