什么是“NNUE”?

来自皮卡鱼 Wiki
New讨论 | 贡献2025年6月6日 (五) 00:37的版本
跳到导航 跳到搜索

返回“棋软知识”

NNUE(高效可更新神经网络)是一种神经网络的架构,适合CPU处理器推理。

现在象棋顶级引擎都使用NNUE,NNUE仅是评估网络,只负责评估局面。(关于评估是什么,请看什么是“评估”?

而现在象棋顶级引擎使用的搜索算法,仍然是传统的ab剪枝搜索。

具体介绍

NNUE的全称是Efficiently Updatable Neural Network(倒过来写的),它的核心思想,就是设计一种特别适合棋类游戏这种输入变化微小场景的神经网络结构,比如我们下一步棋,棋盘的变化比较小,这时候我们就可以做增量更新,不需要把整个棋盘算一遍,大大提高了效率。

NNUE最初是给日本将棋设计的,作者是那須悠(Yu Nasu),2018年被应用于Motohiro Isozaki的YaneuraOu,2019年6月NNUE又被Nodchip(Hisayori Noda)移植到了Stockfish上。

输入特征集

首先我们需要把棋盘局面转换为神经网络能够理解的输入,这就需要特征集了,这里以Stockfish为例进行讲解[1]

常见的特征集有HalfKP和HalfKA(v2),Stockfish早期使用的是HalfKP,现在使用的是HalfKAv2。

HalfKP的K是King(王)的意思,P是Piece(棋子,但不包括王)的意思,Half强调是某一方的王,其特征组合是 (我方王的位置 Sk, 某个棋子的位置 Sp, 该棋子的类型 Tp, 该棋子的相对颜色 Cp)。

对于国象来说,棋子有64个Squares可走,棋子类型去掉王只有5种,棋子颜色有两种,因此特征总数为64×64×5×2=40960。

HalfKA的A代表All,也就是说棋子的类型中也包括了王,把王也纳入进普通棋子里面,因此HalfKA的特征总数有64×64×6×2=49152,这样设计有利于NNUE捕捉到王相关的价值。

HalfKAv2相比于HalfKA优化了特征数量。这12种棋子中包括了我方王和对方王,但我方王的第一个特征Sk必然对应我方王的Tp,对方王的第一个特征必然对应对方的Tp王,可以直接合二为一,不需要区分是我方王还是对方王,这样特征总数就减少到了64×64×11=45056。

考虑到象棋可以水平镜像,又有了HalfKAv2_hm,hm是horizontally mirrored的简称。我方王在棋盘左侧和在棋盘右侧是等效的,这样王的位置总数就从64减少到了32(特征总数32×64×11=22528)。

累加器

累加器是NNUE增量更新的核心,NNUE第一层(22528->2560[2])的输出会被存储到累加器中,当棋盘发生变化(如走了一步棋),累加器也相应地进行变化(只需要在累加器中加上/减去该特征对应的第一层权重列),这样我们可以更加快速地更新累加器,不需要重新计算第一层。累加器会区分我方视角和对方视角,有两套不同的累加器。

更多内容

参见NNUE.md:https://github.com/official-stockfish/nnue-pytorch/blob/master/docs/nnue.md

脚注

  1. 皮卡鱼与Stockfish略有不同,但大体上是一样的,皮卡鱼NNUE的特征总数是25920。
  2. 2560是L1的大小,这里用的是SFNNv8的数据。