我正在开展一个项目,我将棋盘位置(FEN字符串转换为二进制)&它的评估分数并将其提供给神经网络。我的目标是让神经网络区分好的和坏的位置。
我如何对位置进行编码:国际象棋中有12个独特的棋子,例如 white 的棋子,车手,骑士,主教,女王和国王以及黑。我使用4位编码每个部分,0000表示空方块。因此,64个方块被编码为256位,我使用6个位来表示游戏状态,如轮到移动,国王城堡状态等。
问题:由于国际象棋位置的输入空间既不平滑也不是单模(棋盘位置的一个小变化会导致评估得分发生巨大变化),神经网络不会学得不错。现在,下一个逻辑上的东西以某种方式提取有用的功能(如材料差异,中心控制等)并将其提供给网络。
我不想亲自挑选功能,因为我希望网络能够自己学习所有内容。因此,我正在考虑使用 autoencoders 自动提取功能。有没有更好的方法来实现这个目标?
摘要:从棋盘位置自动提取功能以便将其输入神经网络的最佳方法是什么?
更新:为了生成培训数据,我修改了Stockfish以将其评估过程转储到日志文件中。因此,它考虑的每个新移动(位置)都将作为FEN字符串写入文件及其eval得分
答案 0 :(得分:1)
神经网络可以给出任何函数的近似值。要做的唯一考虑因素是搜索空间的维度,它会限制您获得良好近似值的数据量。
对于一个受监督的网络(你使用自动编码器,然后我认为你使用了一些反向传播的变体),我很难想象你如何使用单一位置进行训练,因为你需要在你的训练集中使用类似的位置。也许你的方法不同,但我确信第二种策略(使用功能)更有前途。我认为使用职位需要大量的数据培训才能取得好成绩。
我还从Crafty的源代码中获取了有用的信息。
但你必须从FEN字符串中提取这些信息。
自动编码器是一种减少数据的方法(因为提高了性能)。据报告here,使用Pincipal Component Analysys似乎更好。
我希望这可以帮到你。