兩種強法

皮卡魚靠速度取勝。它每秒看一百多萬個局面,用人工寫成的規則評估每一個局面。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揭棋規則