利用顺序模型和TensorFlow预测扑克游戏行动
1. 引言
扑克是一款复杂的游戏,涉及处理不完整和隐藏的信息,这与许多现实世界的情况相似。因此,它成为人工智能(AI)领域研究的有趣对象,也可作为评判AI方法进展的基准之一。同时,从游戏化的角度来看,分析扑克游戏也颇具意义,因为其规则可用于开发严肃游戏。
近年来,新的扑克代理(扑克游戏程序)数量大幅增长,大多用于学术研究。不同的扑克代理采用了不同的策略和算法:
-
Loki
:使用基于概率和公式的方法,结合GNU扑克库,分手牌评估和游戏策略制定两个主要阶段控制游戏。
-
Poki
:基于模拟的系统,通过神经网络和特定算法优化对手建模和决策。
-
Bluffbot
:结合伪最优博弈论策略和独特系统来确定游戏进程。
-
GS1
:使用各种抽象方法创建GameShrink算法的近似版本。
-
GS3
:引入新的游戏抽象算法,直接评估扑克游戏的所有阶段。
-
Smallbot
:采用e - Nash均衡策略。
-
Vexbot
:通过与对手游戏创建对手模型,但学习速度慢。
此外,神经网络也在扑克研究中得到应用,如Multi - Layer Perceptron(MLP)、Convolutional Neural Network(CNN)、Long Short - Term Memory(LSTM)等。扑克代理通常可分为基于规则、基于策略和基于对手建模三类。在本研究中,我们应用TensorFlow.js库的顺序模型,分析其参数空间,以找到扑克游戏的最佳解决方案。
2. 材料与方法
2.1 模型
为模拟扑克游戏,我们使用JavaScript编程语言、Node.js库和TensorFlow.js库创建了模型。该模型能生成随机但有意义且符合逻辑的情况,例如当对手提高赌注时,可能的回应只有提高赌注、弃牌或跟注。所有游戏数据基于5张牌的扑克游戏流程生成,在此游戏变体中,所有玩家最多有2次行动。模型的数据流图如下:
graph LR
A[开始] --> B[生成随机情况]
B --> C{对手行动}
C -->|提高赌注| D[提高赌注/弃牌/跟注]
C -->|其他行动| E[相应回应]
D --> F[记录行动]
E --> F
F --> G[结束]
为测试模型,我们开发了一个算法,该算法可更改神经网络的参数,包括激活函数、层数、优化器和损失函数。具体操作步骤如下:
1. 自动创建层。
2. 为每层设置所需的激活函数。
3. 为每个激活项初始化网络。
3. 实验与结果
3.1 研究计划
我们将实验分为三个阶段:
1.
第一阶段
:对不同的模型参数组合和单层模型进行多次测试。
2.
第二阶段
:使用第一阶段找到的最佳模型,测试2层和3层模型。
3.
第三阶段
:重复前两个阶段,但使用优化后的数据集。
3.2 研究数据
研究所需的数据来自UCI机器学习库,数据文件包含25010个不同的案例,涵盖手牌的颜色、牌值和手牌的整体强度。每个值以数组形式表示,通过将所需数组元素标记为1来指定具体值。具体可能的值如下表所示:
| 类别 | 可能的值 |
| ---- | ---- |
| S1 – S5 | [Heart, Spade, Drum, Club] |
| C1 – C5 | [A, 2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K] |
| CLASS | [Nothing in hand, One pair, Two pairs, Three of a kind, Straight, Flush, Full house, Four of a kind, Straight flush, Royal flush] |
为了寻找最佳行动,该数据数组还补充了描述五张牌扑克游戏简单流程的五行数据:DEALER(显示谁是庄家)、HA1(玩家第一次行动)、HA2(玩家第二次行动)、OA1(对手第一次行动)、OA2(对手第二次行动)。
3.3 设置
所有计算使用Intel(R) Core(TM) i7 - 4770k CPU @ 3.50 GHz和16 GB RAM进行。模型在85%的数据集上进行训练,剩余15%的数据用于模型验证和准确性测试。
在测试过程中,我们关注损失函数的值。为确定合适的训练轮数(epochs),需观察损失函数值何时不再下降或开始上升。经过计算和平均,发现平均5轮训练就足够了,因为之后损失函数值要么增加,要么变得非常接近。确定平均训练轮数后,我们检查了所有其他可能的配置。
神经网络模型的参数组合如下表所示:
| 激活函数 | 损失函数 | 优化器 | 优化器值 |
| ---- | ---- | ---- | ---- |
| elu, hardSigmoid, linear, relu, relu6, selu, sigmoid, softmax, softplus, softsign, tanh | MSE(Mean Squared Error) | Adam | 0.001, 0.01, 0.06, 0.1 |
| | | RMSProp | 0.001, 0.01, 0.06, 0.1 |
| | CE(Categorical Crossentropy) | Adam | 0.001, 0.01, 0.06, 0.1 |
| | | RMSProp | 0.001, 0.01, 0.06, 0.1 |
我们使用准确性来评估模型,通过让模型对剩余数据进行预测,并将预测结果与预期结果进行比较来计算准确性。
3.4 结果
3.4.1 单层模型测试
以下是使用sigmoid激活函数、Mean square error(MSE)和Cross - Entropy(CE)损失函数、Adam和RMSProp优化器以及不同优化器值的实验结果:
| 损失函数 | 优化器 | 优化器值 | 时间(s) | 准确性(%) |
| ---- | ---- | ---- | ---- | ---- |
| MSE | Adam | 0.001 | 19.053 | 46 |
| MSE | Adam | 0.01 | 23.935 | 59 |
| MSE | Adam | 0.06 | 24.071 | 51 |
| MSE | Adam | 0.1 | 24.812 | 59 |
| MSE | RMSProp | 0.001 | 23.755 | 62 |
| MSE | RMSProp | 0.01 | 20.421 | 63 |
| MSE | RMSProp | 0.06 | 22.139 | 64 |
| MSE | RMSProp | 0.1 | 22.118 | 64 |
| CE | Adam | 0.001 | 35.25 | 65 |
| CE | Adam | 0.01 | 35.852 | 62 |
| CE | Adam | 0.06 | 35.999 | 63 |
| CE | Adam | 0.1 | 34.907 | 63 |
| CE | RMSProp | 0.001 | 34.348 | 65 |
| CE | RMSProp | 0.01 | 35.662 | 57 |
| CE | RMSProp | 0.06 | 37.385 | 56 |
| CE | RMSProp | 0.1 | 37.282 | 55 |
从计算时间来看,使用Adam(值为0.001)优化器和MSE损失函数时计算速度最快;但从准确性来看,使用CE损失函数和Adam(值为0.001)优化器,或CE和RMSProp(值为0.001)优化器可获得最准确的结果。综合考虑,最佳模型为CE和RMSProp(值为0.001)。RMSProp的95%置信区间为53.92% - 63.08%,CE的95%置信区间为57.91% - 63.59%。
第一阶段测试的总结结果如下表所示:
| 激活函数 | 损失函数 | 优化器 | 优化器值 | 时间(s) | 准确性(%) |
| ---- | ---- | ---- | ---- | ---- | ---- |
| elu | MSE | Adam | 0.1 | 19.268 | 62 |
| hardSigmoid | MSE | Adam | 0.06 | 25.687 | 65 |
| linear | MSE | Adam | 0.001 | 16.715 | 59 |
| relu | MSE | Adam | 0.06 | 20.333 | 65 |
| relu6 | MSE | RMSProp | 0.1 | 21.99 | 65 |
| selu | MSE | Adam | 0.06 | 23.458 | 63 |
| sigmoid | CE | RMSProp | 0.001 | 34.348 | 65 |
| softmax | CE | RMSProp | 0.01 | 52.005 | 62 |
| softplus | MSE | RMSProp | 0.001 | 26.311 | 65 |
| softsign | MSE | Adam | 0.01 | 55.723 | 61 |
| tanh | MSE | RMSProp | 0.06 | 22.483 | 62 |
从这些结果可以看出,最低准确率为59%,最高为65%,95%置信区间为61.80% - 64.38%。这种准确性不太理想,可能是由于模型训练数据的不足或复杂性。通过经验选择,最佳的模型设置为:激活函数为relu,优化器为Adam(值为0.06),损失函数为MSE。
3.4.2 多层模型测试
使用上述最佳特征,我们对2层(11种不同组合)和3层(121种不同组合)模型进行了计算。当第一层使用relu激活函数时,2层模型的测试结果如下表所示:
| 激活函数组合 | 时间(s) | 准确性(%) |
| ---- | ---- | ---- |
| relu + elu | 29.032 | 66 |
| relu + hardSigmoid | 32.519 | 66 |
| relu + linear | 33.621 | 66 |
| relu + relu | 31.991 | 66 |
| relu + relu6 | 31.103 | 66 |
| relu + selu | 30.242 | 66 |
| relu + sigmoid | 30.317 | 40 |
| relu + softmax | 42.764 | 34 |
| relu + softplus | 31.805 | 53 |
| relu + softsign | 33.022 | 37 |
| relu + tanh | 38.229 | 66 |
与单层模型测试结果相比,准确率略有提高(1%),但66%的准确率仍然较低,且2层模型的计算时间更长。当第一层使用softplus激活函数时,2层模型的测试结果如下表所示:
| 激活函数组合 | 时间(s) | 准确性(%) |
| ---- | ---- | ---- |
| softplus + elu | 31.168 | 60 |
| softplus + hardSigmoid | 34.851 | 66 |
| softplus + linear | 33.611 | 28 |
| softplus + relu | 33.876 | 58 |
| softplus + relu6 | 33.321 | 42 |
| softplus + selu | 32.956 | 45 |
| softplus + sigmoid | 30.197 | 66 |
| softplus + softmax | 43.06 | 65 |
| softplus + softplus | 34.756 | 66 |
| softplus + softsign | 36.145 | 66 |
| softplus + tanh | 37.904 | 48 |
比较这两组2层模型的数据,relu + elu组合表现更好。对于3层模型,实验表明结果与2层模型相比没有明显变化,准确率不超过66%,且增加层数会增加模型训练时间。
综合考虑,如果计算时间比准确性更重要,可以使用单层模型,虽然准确率会降低1%,但训练速度更快;如果追求更高的准确性,2层模型相对单层模型有一定提升。
3.4.3 使用简化数据的测试
为了获得更好的准确性结果,我们使用简化后的数据重复了上述实验。简化数据的具体操作步骤如下:
1. 统计可用选项的总数。
2. 检查当前数据的值。
3. 将当前数据的值除以可能值的总数。
使用简化数据格式、单层模型以及所有激活函数、损失函数和优化器组合的测试结果总结如下表所示:
| 激活函数 | 损失函数 | 优化器 | 优化器值 | 时间(s) | 准确性(%) |
| ---- | ---- | ---- | ---- | ---- | ---- |
| elu | CE | RMSProp | 0.001 | 9.44 | 87 |
| hardSigmoid | MSE | Adam | 0.01 | 8.293 | 81 |
| linear | MSE | Adam | 0.01 | 7.969 | 76 |
| relu | MSE | Adam | 0.001 | 8.58 | 94 |
| relu6 | MSE | Adam | 0.001 | 8.264 | 81 |
| selu | MSE | Adam | 0.01 | 9.41 | 71 |
| sigmoid | MSE | Adam | 0.01 | 9.135 | 81 |
| softmax | MSE | Adam | 0.01 | 13.527 | 76 |
| softplus | CE | RMSProp | 0.01 | 13.617 | 82 |
| softsign | MSE | Adam | 0.01 | 12.308 | 78 |
| tanh | MSE | Adam | 0.001 | 9.947 | 75 |
从这些结果可以看出,使用简化数据后,模型的准确性有了显著提高。例如,使用relu激活函数、MSE损失函数和Adam(值为0.001)优化器的单层模型,准确率达到了94%。
使用简化数据和2层、3层模型的测试结果如下表所示:
| 激活函数组合 | 时间(s) | 准确性(%) |
| ---- | ---- | ---- |
| relu + elu | 10456 | 88 |
| relu + relu6 + selu | 15489 | 99 |
使用3层模型(第一层激活函数为relu,第二层为relu6,第三层为selu)时,准确率提高到了99%,95%置信区间为89.09% - 99.31%。下图展示了最佳模型(relu + relu6 + selu激活函数组合)每个训练轮次的损失函数和验证值的变化情况:
graph LR
A[Epoch 1] --> B[Loss Value 1]
A --> C[Validation Value 1]
B --> D[Epoch 2]
C --> D
D --> E[Loss Value 2]
D --> F[Validation Value 2]
E --> G[Epoch 3]
F --> G
G --> H[Loss Value 3]
G --> I[Validation Value 3]
H --> J[Epoch 4]
I --> J
J --> K[Loss Value 4]
J --> L[Validation Value 4]
K --> M[Epoch 5]
L --> M
M --> N[Loss Value 5]
M --> O[Validation Value 5]
N --> P[Epoch 6]
O --> P
P --> Q[Loss Value 6]
P --> R[Validation Value 6]
Q --> S[Epoch 7]
R --> S
S --> T[Loss Value 7]
S --> U[Validation Value 7]
T --> V[Epoch 8]
U --> V
V --> W[Loss Value 8]
V --> X[Validation Value 8]
W --> Y[Epoch 9]
X --> Y
Y --> Z[Loss Value 9]
Y --> AA[Validation Value 9]
Z --> AB[Epoch 10]
AA --> AB
AB --> AC[Loss Value 10]
AB --> AD[Validation Value 10]
从图中可以看出,损失函数和验证值持续下降,表明模型的预测能力在每个训练轮次中都在不断提高。但后续研究发现,如果增加训练轮数,损失函数值会继续下降,但验证值会出现不稳定的变化,这表明模型可能出现了过拟合现象。
4. 结论
预测扑克游戏行动的神经网络模型有多种不同的配置。为了找到最准确的模型,我们创建了一个算法来自动更改模型参数,并开发了一个算法来补充和简化研究所需的数据集,解决了数据有限和描述不清晰的问题。
最佳的解决方案是使用简化数据对神经网络模型进行训练,采用3层模型,其中第一层激活函数为relu,第二层为relu6,第三层为selu,损失函数为CPS,优化器为Adam(值为0.001)。该模型的预测准确率达到了99%(95%置信区间为89.09% - 99.31%)。
综上所述,通过合理选择模型参数和使用简化数据,可以显著提高扑克游戏行动预测模型的准确性。在实际应用中,可以根据具体需求权衡计算时间和准确性,选择合适的模型配置。
超级会员免费看
8591

被折叠的 条评论
为什么被折叠?



