两种强法

皮卡鱼靠速度取胜。它每秒看一百多万个局面,用人工写成的规则评估每一个局面。AB-JChess 同样由皮卡鱼改造而来,但它用神经网络评估局面,这个网络用大约十亿个揭棋局面训练而成。它看的局面少了大约五十倍,但对每个局面理解得更深。它的训练代码也公开在同一个代码库里,见 abjchess-nnue-pytorch。

优势从哪里来

比赛中,两个引擎每走一步都会报出一个分数;两者看法不一致时,通常是 AB-JChess 看对了。有 137 盘棋出现过这样的时刻:AB-JChess 给自己 75% 或更高,而皮卡鱼在前一步或后一步只给 AB-JChess 60% 或更低。这些棋 AB-JChess 赢了 115 盘,输 13 盘,和 9 盘。反过来,皮卡鱼给自己 75% 或更高、而 AB-JChess 只给它 60% 或更低的情况出现在 202 盘棋中,皮卡鱼赢了其中 101 盘,输 90 盘,和 11 盘。这些是皮卡鱼在比赛中报出的分数,当时还带着我们后来修复的翻子错误。

下面是 AB-JChess 的两盘胜局,两盘它都执红,它的分数一路上升,而皮卡鱼的分数一直持平。我们用两个引擎把每个局面重新评估了一遍(AB-JChess 每个局面搜索 100 万个节点,修复后的皮卡鱼搜索 6400 万个),并用一条按这次对抗赛拟合的曲线把各自的分值换算成期望得分。每张图显示两个引擎各自眼中 AB-JChess 的得分,回合编号与下方棋盘一致。棋盘上的 ?! 标出按 AB-JChess 的算法让皮卡鱼损失 5 到 10 个百分点的着法;两盘棋里都没有更差的着法。

第 68 盘:两个士和一个象,换来一场攻势

皮卡鱼执黑,第 11 回合用车吃掉一个暗子士,随后把在 b1 翻出的马杀进红方阵地,又吃掉第二个士和一个象。AB-JChess 利用这几步把一个车、一个马和一个兵调到黑将附近。从第 13 回合到第 21 回合,AB-JChess 给红方的估分从未低于 69%;皮卡鱼搜索同样的局面,给红方的估分在 40% 到 58% 之间。

第 18 回合,马吃掉了 c1 的象。AB-JChess 给红方 85%;皮卡鱼给红方 50%,对局中它报的是 47%。第 20 回合红象吃掉了这匹马。第 21 回合皮卡鱼在 b10 翻出的棋子是兵,它自己给红方的估分这才升到 85%。

第 6 盘:一车对一排没翻开的暗子

第 6 盘,AB-JChess 第 15 回合用车吃掉一个士,并让双方兑车。第 16 回合之后,盘面上只剩红方一个车,而黑方还没翻开的七个棋子只可能是五个兵和两个马。AB-JChess 给红方 83%;皮卡鱼给红方 48%。

第 19 回合红车冲到黑方底线,吃掉了那里的两个马。AB-JChess 从第 17 回合起给红方的估分就在 80% 以上,皮卡鱼要到第 21 回合。

搜得更久会怎样

我们把五步被标注的着法重新搜索了一遍,实战着法和 AB-JChess 的选择各自单独搜索:AB-JChess 搜索 400 万个节点,修复后的皮卡鱼搜索 2.56 亿个。AB-JChess 仍然认为其中两步比它的选择差 5 个百分点以上,另外三步相差不到 2 个百分点。皮卡鱼有一次更喜欢 AB-JChess 的选择,另外四次更喜欢自己的实战着法。所以单看每一步,差别都很小。差距在于两个引擎对局面给出的分数;两盘棋里,皮卡鱼自己的分数都是后来才跟上 AB-JChess:第 68 盘是第 23 回合而不是第 18 回合,第 6 盘是第 21 回合而不是第 17 回合。研究里每一步被标注的着法都附有两个引擎的分数。

它排在哪里

AB-JChess 排在揭棋电脑列表的最上面,在第 8 级之上。第 1 到第 8 级仍是皮卡鱼,新手从第 2 级开始。它不占用级别编号:最高的位置留给我们实测过最强的揭棋引擎,并以它自己的名字标示。它在电脑对手页面上的等级分是 2354(第 8 级为 2226),和各个级别一样,来自电脑之间的对局。作者们正在训练更强的网络;新网络发布后,我们会让它和现在这个对弈,赢了就换上。

写这篇文章的过程中,我们发现我们的皮卡鱼电脑在给翻子打分时有一个错误。现已修复,后续文章讲清楚了这个错误是什么、造成了多大影响。

致谢

AB-JChess 以 GPL-3.0 许可证开源,地址是 github.com/lxsgx23/AB-JChess。作者允许我们在 Mistboard 上使用这个引擎及其神经网络。每次构建网站时,神经网络都从作者自己的发布页下载,从不在本站转存。谢谢 Huorongrong 和 Laoxu。

挑战 AB-JChess揭棋规则