©PaperWeekly 原创 · 作者|苏剑林
单位|追一科技
研究方向|NLP、神经网络
▲ 中国象棋
不知道读者有没有看过量子位年初的文章《最强写作AI竟然学会象棋和作曲,语言模型跨界操作引热议,在线求战》,里边提到有网友用 GPT2 模型训练了一个下国际象棋的模型。
笔者一直在想,这么有趣的事情怎么可以没有中文版呢?对于国际象棋来说,其中文版自然就是中国象棋了,于是我一直有想着把它的结果在中国象棋上面复现一下。拖了大半年,在最近几天终于把这个事情完成了,在此跟大家分享一下。
象棋谱式:
将军不离九宫内,士止相随不出官。象飞四方营四角,马行一步一尖冲。炮须隔子打一子,车行直路任西东。唯卒只能行一步,过河横进退无踪。
背棋谱
其实,简单看看量子位的文章,就能理解 GPT2 下象棋的原理了,无非就是“背棋谱”。简单来说,就是象棋的棋谱可以表示为一个连续的文本字符串,而 GPT2 正是擅长于背诵文本,因此可以用 GPT2 把人类的棋谱都背诵下来,而对于下棋来说,就可以看成是根据已经走的部分棋谱背诵下一步棋谱了,因此整个任务理论上确实是可以用 GPT2 完成。
为了完成这个任务,我们就需要了解计算机是如何记谱的。关于记谱的标准,比较通用的是 ICCS 记谱法和 FEN 局面表示法,其细节可以参考文章《中国象棋电脑应用规范(二):着法表示》[1] 和《中国象棋电脑应用规范(二):FEN文件格式》[2]。
1.1 ICCS记谱
简单来说,ICCS 记谱就是将棋盘用如下图的横纵坐标表示,每一步走法只需要记录起始坐标,比如“h2e2”就是指将原来位于坐标(h, 2)的子移动到(e, 2),如果是当前局面是新开局,那么这就对应着走法“炮二平五”。这样一来每一步就只需要 4 个字符来记录了,n 步的棋谱就变成了 4n 长度的字符串了。
当然,如果要输入到模型的话,不一定非得要按照这样的方式来,比如我也可以把“h2”只用一个 id 表示、“e2”用另一个 id 表示,也就是每个格点都用一个坐标而不是两个坐标来描述,这样每一步的只需要两个 id 来记录,以此来缩小棋谱的序列长度,这没有什么定法,有兴趣大家自己改进着完就好。
▲ 中国象棋棋盘ICCS坐标示意图
1.2 FEN局面
至于 FEN 局面表示法,则是用来表示当前局面有哪些子,轮到谁走。本文所建模的棋谱实际上都是全局棋谱,所以实际上本文的模型不需要用到它(局面都