我很难建立一个神经网络来将井字棋棋盘状态(最终或中间)分类为“X 胜”、“O 胜”或“平局”。
我将描述我目前的解决方案和结果。任何建议表示赞赏。
* 数据集 * 数据 集 = 958 种可能的终局游戏 + 958 种随机游戏 = 1916 种棋盘状态(随机游戏可能不完整,但都是合法的。即没有两个玩家同时获胜)。
训练集 = 数据集测试集的 1600 个随机样本 = 剩余 316 个案例
在我当前的伪随机开发场景中,数据集具有以下特征。训练集: - “X” 527 胜 - “O” 264 胜 - 809 场 测试集: - “X” 104 场 - “O” 56 场 - 156 场
* 调制 * 输入层:18 个输入神经元,每个神经元对应一个棋盘位置和玩家。因此,棋盘(B=blank):xxo ox B B o X 编码为:1 0 1 0 0 1 0 1 1 0 0 0 0 0 0 1 1 0
输出层:3 个输出神经元,分别对应每个结果(X 胜、O 胜、平)。
* 建筑学 *
基于:http ://www.cs.toronto.edu/~hinton/csc321/matlab/assignment2.tar.gz
1 Single Hidden Layer 隐藏层激活函数:Logistic 输出层激活函数:Softmax 误差函数:Cross-Entropy
* 结果 *
似乎没有任何参数组合能够达到 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 个输入单元(对应于玩家的行、列或对角线)的“更大”连接权重和“更大”连接权重到其中一个输出单元(对应于该玩家的“胜利”)。
如上表所示,无论我做什么,我都无法减少测试错误的数量。
任何建议表示赞赏。