国际象棋神经网络可能无法训练的原因

人工智能 神经网络 深度学习
2021-10-21 09:15:53

在过去的几周里,我一直在尝试使用类似 Stockfish 的国际象棋评估神经网络,但无济于事。我想就为什么我目前的方法没有奏效得到一些其他的意见。

输入:8×8×12一热编码板件。我有大约 6000 万个独特的例子。评估介于 -15 和 15 之间(任何更大或更小的值都被带到 15 或 -15)

输出:代表 Stockfish 评估的单个数字。

我已经尝试过完全连接和卷积模型,但都没有很好地工作。下面是一些 Tensorflow 代码,可以让您了解结构的外观:

卷积模型:

import tensorflow as tf

def block(filters, x, res=None):
  if res is not None:
    x = tf.keras.layers.concatenate([x, res])
  x = tf.keras.layers.Conv2D(filters=filters, kernel_size=3, padding='same', activation='relu', kernel_initializer='he_normal')(x)
  x = tf.keras.layers.BatchNormalization()(x)
  x = tf.keras.layers.MaxPooling2D(pool_size=2, strides=1, padding='same')(x)
  
  return x

board = tf.keras.Input(shape=(8, 8, 12))
conv1 = block(64, board)
conv2 = block(128, conv1)
conv3 = block(256, conv2)
conv4 = block(512, conv3, conv3)
conv5 = block(1024, conv4, conv2)
conv6 = block(1024, conv5, conv1)
conv7 = block(512, conv6)
x = tf.keras.layers.Flatten()(conv7)
x = tf.keras.layers.Dense(128, activation='relu')(x)
x = tf.keras.layers.Dense(32, activation='relu')(x)
x = tf.keras.layers.Dense(1)(x)

全连接模型:

import tensorflow as tf

board = tf.keras.Input(shape=(8, 8, 12))
x = tf.keras.layers.Flatten()(board)
x = tf.keras.layers.Dense(1024, activation='relu')(x)
x = tf.keras.layers.Dense(1024, activation='relu')(x)
x = tf.keras.layers.Dense(1024, activation='relu', kernel_regularizer='l2')(x)
x = tf.keras.layers.Dropout(0.3)(x)
x = tf.keras.layers.Dense(1024, activation='relu', kernel_regularizer='l2')(x)
x = tf.keras.layers.Dropout(0.3)(x)
x = tf.keras.layers.Dense(1024, activation='relu', kernel_regularizer='l2')(x)
x = tf.keras.layers.Dropout(0.3)(x)
x = tf.keras.layers.Dense(1024, activation='relu')(x)
x = tf.keras.layers.Dense(1024, activation='relu')(x)
x = tf.keras.layers.Dense(1024, activation='relu')(x)
x = tf.keras.layers.Dense(256, activation='relu')(x)
x = tf.keras.layers.Dense(1)(x)

只是添加一些关于当前结果的注释,它们是不错的(例如,在 -15 和 15 之间评估的 Stockfish 的均方误差约为 7)。早期的比赛也打得相当不错,但后期比赛变得非常糟糕(引擎无法评估主教带走敌后是好的)。我的评估网络也将四步将死评估为黑色偏爱。

1个回答

这可能是因为游戏后期没有足够的数据。为了使模型更加重视游戏的后期阶段,您可以尝试调整损失函数,以便在棋盘上的棋子较少时惩罚更多。(这可能会给出一个想法:https ://medium.com/visionwizard/understanding-focal-loss-a-quick-read-b914422913e7 )

你可以做的另一件事;鉴于我的上述推理是正确的,是提供棋盘上的棋子数作为输入。我不确定您如何在一次性编码场景中执行此操作,但可能值得研究(您可以将二进制格式的片段数附加到展平输入)。反对这一点的一个论点是,网络应该隐含地知道棋盘上有多少棋子,但将其作为额外的输入仍然很有用。