什麼是「NNUE」?
NNUE(高效可更新神經網路)是一種神經網路的架構,適合 CPU 處理器推理。
現在象棋頂級引擎都使用 NNUE,NNUE 僅是評估網路,只負責評估局面。(關於評估是什麼,請看什麼是「評估」?)
而現在象棋頂級引擎使用的搜尋演算法,仍然是傳統的 ab 剪枝搜尋。
具體介紹
NNUE 的全稱是 Efficiently Updatable Neural Network(倒過來寫的,鵺(Nue)是日本的妖怪,這裡使用了 Nue 的諧音),它的核心思想,就是設計一種特別適合棋類遊戲這種輸入變化微小場景的神經網路結構,比如我們下一步棋,棋盤的變化比較小,這時候我們就可以做增量更新,不需要把整個棋盤算一遍,大大提高了效率。
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:nnue-pytorch/docs/nnue.md
