NNUE已经出现并统治国际象棋引擎一年有余了。其技术细节在网上已经引起了广泛且大量的讨论,我们不再赘述。这篇文章以问答的形式,从普通国际象棋(及引擎)爱好者的视角出发提出一些问题,并根据我们的理解简要回答。
答:NNUE指的是Efficiently Updatable Neural Network,由那須悠在2018年提出,并于同年应用到将棋引擎。2020年8月,NNUE作为实验加入国际象棋引擎Stockfish 12,显示出了惊人的实力。接下来的一年里,NNUE不断为其它引擎如Komodo, Ethereal, Slowchess所接纳。如今(2021年11月)有竞争力的国际象棋引擎,要么使用了NNUE,要么借鉴了alphazero的算法。问:从将棋引擎到国际象棋引擎,从Stockfish到Ethereal,是什么使得NNUE应用如此广泛?答:这是因为NNUE在各个引擎中起到了估值函数(估值函数等概念,请参考国际象棋引擎分类)的作用。无论是将棋引擎还是国际象棋引擎,估值函数都必不可少,这使得NNUE在引擎领域大放异彩。国际象棋引擎的估值函数难以应用于将棋,是由于传统估值函数依赖于“王的安全”,“兵型弱点”,“子力价值”等人工选定的国际象棋专有特征。与之相比,NNUE只需要各个棋子的位置信息,故不针对特定棋类。另外同一种棋的棋子位置信息相同,只要Stockfish开发出了NNUE,Ethereal能参考Stockfish的NNUE来开发自己的NNUE,甚至于可以直接用Stockfish的NNUE替换自己的估值函数。问:如果Ethereal可以用Stockfish的NNUE,那么Stockfish NNUE和Ethereal NNUE有什么不同?
答:NNUE的参数并不是凭空得到的,而是经由训练得来。可以把Stockfish和Ethereal看成两个老师,Stockfish教出来的学生就是Stockfish NNUE,反之亦然。问:为什么作为学生的NNUE,会超过老师呢?或者说NNUE比传统估值函数强在哪里?答:这主要涉及到NNUE的两个层面。第一,NNUE比传统估值函数更准确。第二,NNUE比传统估值函数更复杂。首先是第一点。传统估值函数只是基于当前的局面特征进行估值,而NNUE却可以参考老师在40深度下,计算几十亿个局面(数字仅举例,并不意味实际如此)后更加精确的估值。由于NNUE利用了更深层次的信息,综合了估值+搜索,自然要优于传统单纯的估值函数。
NNUE能利用更深层次信息的这种bug能力,就依赖于第二点了。相信某些对神经网络熟悉的读者已经耳朵磨出茧子了。对于神经网络,有所谓universal approximation theorem。简单地说,任何函数都可以被神经网络以任意精度逼近。深层次的信息就这样被藏在了神经网络中。问:利用神经网络提取深层次信息以提高估值函数的准确度,这令我想到了Lc0。为什么有了Lc0这个成功的例子,人们还要尝试NNUE呢?答:确实,Lc0和NNUE都将神经网络作为估值函数。不过Lc0的搜索是蒙特卡洛树搜索(Monte-Carlo Tree Search),而Stockfish NNUE的搜索是传统的极大极小AB剪枝(AB-minimax pruning)。尽管蒙特卡洛树搜索在围棋中取得了令人叹为观止的成就,但是这是因为围棋的搜索树过于庞大,无法进行AB剪枝。对于搜索树远远小于围棋的国际象棋来说,AB剪枝传统上的成功,让人们希望将神经网络和AB剪枝结合起来,这也就是为什么他们尝试了NNUE。答:原因有很多,不过囿于篇幅限制,只说一个有代表性的原因。AB剪枝一层一层的遍历搜索树,其搜索树相对平衡,因此不容易错过战术组合。MCTS按照胜率遍历搜索树,其搜索树过于偏向高胜率的分支,因此可能会错过战术组合。问:懂了但又没完全懂。既然AB剪枝如此成功,为什么不把Lc0的蒙特卡洛树搜索换成AB剪枝,而是用NNUE换掉Lc0的神经网咯呢?
答:先说结论,再说原因。如果将估值函数和搜索算法做自由组合,目前来看引擎的强度如下
CPU NNUE + CPU AB剪枝 ≈ GPU nn + GPU 蒙特卡洛树搜索 > GPU nn + CPU AB剪枝 ≈ CPU 传统估值函数 + CPU AB剪枝
为什么将Lc0的搜索换成 CPU AB剪枝会负提升呢?虽然很难从理论上说明这件事,不过有具体的例子显示着这一点。AllieStein即是将Leelenstein的GPU网络和AB剪枝结合起来,但目前它已不再有竞争力了。一个可能的解释是Leelenstein的神经网络运行在GPU上,AB剪枝运行在CPU上,这就导致运算结果需要在不同的硬件交互,进而降低了计算速度。不过如果不同硬件之间的数据交互速度能提升,相信此类引擎(GPU nn + CPU AB剪枝)还是未来可期的。至于CPU 传统估值函数 + GPU 蒙特卡洛树搜素?今天还有人记得Komodo MCTS么?
问:神经网络不大都运行在GPU上,为什么NNUE能运行在CPU上?答:我动笔就是为了回答这个问题(激动),这就是NNUE的创新点啊!首先是差分计算。可以认为是上一个局面中99%的计算结果都可以直接用来计算下一个局面。它是这么实现的(下略)其次是SIMD技术,通过并行计算提高速度。(下略)最后,棋盘表示、网络结构设计、 激活函数的选取都大有讲究。比如为什么激活函数用clipped ReLU而不是ReLU呢?(下略)问:总结一下,就是NNUE通过特殊设计,使得其在CPU上算的又快又好?问:说了半天NNUE又强又厉害,那最强的NNUE引擎Stockfish有没有什么弱点?答:Stockfish的计算速度快,估值又好,我们还没有见过它在战术上犯错。不过和GPU神经网络这种算到对局结束的估值函数比,NNUE“仅仅”是算到了一定回合后。这意味着它可能会在极其精细的局面棋上不如Lc0。不过我们觉得战术滴水不漏,局面棋又仅是稍逊Lc0。讨论它的弱点,似乎放在比它更强的引擎出现后比较合适。稍微跑一点题的话,Stockfish的缺点相信有人能感觉得到。开局阶段的很多局面,Stockfish看透了一切,四五个主变评分全是0.00(如下图所示),这让人类在准备开局的时候难以判断哪个变化更值得自己选择。![]()
问:能不能谈谈国际象棋引擎未来可能的新技术,新方向?
答:好问题,专业人士要敢于下判断做预测。可我们并非专业人士,不成熟的观点只适合私下交流,不宜公开发表。答:首先可以试试新出的Stockfish 14.1https://stockfishchess.org/download/Dragon: https://komodochess.com/Ethereal: https://github.com/AndyGrant/Ethereal/releases问:最后的最后一个问题,这篇科普很有意思,你们还写了其它的么?