在国际象棋数据上训练神经网络

机器算法验证 机器学习 神经网络 Python 大数据 亚当
2022-03-01 07:55:06

我一直在和朋友一起写一个国际象棋引擎,引擎本身已经非常好(2700+ CCRL)。我们的想法是使用神经网络来更好地评估位置。

输入到网络

因为网络的输出很大程度上取决于哪一方必须移动,所以我们使用输入的前半部分来解析谁必须移动的位置,而后半部分用于分析对手的位置。事实上,我们为每个部分和每个正方形都有一个输入,这将导致 12x64 输入。我们的想法也包括对手国王的位置。所以每一方都有 6x64 输入,对于每个方格,对手国王可以是 -> 6x64x64。总的来说,这会产生 12x64x64 二进制输入值,其中最多设置 32 个。

图层

下一层由 64 个神经元组成,其中前 32 个神经元只接受前半部分输入特征的输入,后 32 个只接受后半部分输入特征的输入。

它遵循一个具有 32 个完全连接的神经元的层,输出层只有一个输出。

激活功能

我们在隐藏层使用 LeakyReLU,在输出使用线性激活函数。

训练

最初,我想在大约 100 万个位置上训练网络,但这需要很长时间。位置本身的目标值在 -20 到 20 的范围内。我使用 ADAM 的随机梯度下降,学习率为 0.0001,MSE 作为损失函数。

我遇到的问题是,即使训练这 100 万个职位也需要很长时间。目标是稍后在 3 亿个位置上进行训练。

我不确定在哪里可以改善培训进度。

下面是显示超过 1000 次迭代的训练进度的图表

在此处输入图像描述

每次迭代的更改如下所示:

在此处输入图像描述

我希望有人能给我一两个提示,告诉我我可以改进什么,以便更快地训练网络。我很高兴有任何建议!

问候,芬恩

编辑 1

正如建议的那样,我应该将我的网络转换为 keras。我在让稀疏输入运行时遇到问题。

import keras
from keras.layers import Input, Concatenate, Dense, LeakyReLU
from keras.models import Model
from keras import backend as K
import numpy as np







# trainX1 = tf.SparseTensor(indices=[[0,0], [0,1]], values=[1, 2], dense_shape=[1,24576])
# trainX2 = tf.SparseTensor(indices=[[0,0], [0,1]], values=[1, 2], dense_shape=[1,24576])
#
# trainY = np.random.rand(1)


trainX1 = np.random.random((10000,24576))
trainX2 = np.random.random((10000,24576))

trainY = np.zeros((10000,1))



#input for player to move
activeInput = Input((64*64*6,))
inactiveInput = Input((64*64*6,))


denseActive = Dense(64)(activeInput)
denseInactive = Dense(64)(inactiveInput)


act1 = LeakyReLU(alpha=0.1)(denseActive)
act2 = LeakyReLU(alpha=0.1)(denseInactive)

concat_layer= Concatenate()([act1, act2])
dense1 = Dense(32)(concat_layer)

act3 = LeakyReLU(alpha=0.1)(dense1)

output = Dense(1, activation="linear")(act3)

model = Model(inputs=[activeInput, inactiveInput], outputs=output)
model.compile(loss='mse', optimizer='adam', metrics=['accuracy'])

# print(model.summary())

print(model.fit([trainX1,trainX2], trainY, epochs=1))

如果我sparse=True用于 Dense 层,它会抛出一些异常。如果有人可以帮助我创建稀疏输入向量,我会很高兴。

2个回答

我认为您需要考虑在 GPU 上运行它。谷歌 Colab 是免费的,亚马逊 AWS 非常便宜。您似乎知道自己在做什么,因此您可能可以很快启动并运行 PyTorch。一旦您比较了在 GPU 上实现的相同网络与您的单处理器设置的性能,您将能够更好地了解下一步该去哪里。

您也可以尝试 CPU 友好的 NNUE 替代方案。它目前是由 Stockfish 团队为国际象棋开发的,似乎效果不错。它易于使用和训练网络,并且应该比硬方式容易得多。我一直在 Stockfish 团队工作,如果您愿意,我想我也可以帮助您开发引擎(我也在开发自己的国际象棋引擎)。问候和祝你好运!