GPT v.s. 中国象棋:写过文章解过题,要不再来下盘棋?
?PaperWeekly 原創 ·?作者|蘇劍林
單位|追一科技
研究方向|NLP、神經網絡
▲ 中國象棋
不知道讀者有沒有看過量子位年初的文章《最強寫作AI竟然學會象棋和作曲,語言模型跨界操作引熱議,在線求戰》,里邊提到有網友用 GPT2 模型訓練了一個下國際象棋的模型。
筆者一直在想,這么有趣的事情怎么可以沒有中文版呢?對于國際象棋來說,其中文版自然就是中國象棋了,于是我一直有想著把它的結果在中國象棋上面復現一下。拖了大半年,在最近幾天終于把這個事情完成了,在此跟大家分享一下。
象棋譜式:
將軍不離九宮內,士止相隨不出官。象飛四方營四角,馬行一步一尖沖。炮須隔子打一子,車行直路任西東。唯卒只能行一步,過河橫進退無蹤。
背棋譜
其實,簡單看看量子位的文章,就能理解 GPT2 下象棋的原理了,無非就是“背棋譜”。簡單來說,就是象棋的棋譜可以表示為一個連續的文本字符串,而 GPT2 正是擅長于背誦文本,因此可以用 GPT2 把人類的棋譜都背誦下來,而對于下棋來說,就可以看成是根據已經走的部分棋譜背誦下一步棋譜了,因此整個任務理論上確實是可以用 GPT2 完成。
為了完成這個任務,我們就需要了解計算機是如何記譜的。關于記譜的標準,比較通用的是 ICCS 記譜法和 FEN 局面表示法,其細節可以參考文章《中國象棋電腦應用規范(二):著法表示》[1] 和《中國象棋電腦應用規范(二):FEN文件格式》[2]。
1.1 ICCS記譜
簡單來說,ICCS 記譜就是將棋盤用如下圖的橫縱坐標表示,每一步走法只需要記錄起始坐標,比如“h2e2”就是指將原來位于坐標(h, 2)的子移動到(e, 2),如果是當前局面是新開局,那么這就對應著走法“炮二平五”。這樣一來每一步就只需要 4 個字符來記錄了,n 步的棋譜就變成了 4n 長度的字符串了。
當然,如果要輸入到模型的話,不一定非得要按照這樣的方式來,比如我也可以把“h2”只用一個 id 表示、“e2”用另一個 id 表示,也就是每個格點都用一個坐標而不是兩個坐標來描述,這樣每一步的只需要兩個 id 來記錄,以此來縮小棋譜的序列長度,這沒有什么定法,有興趣大家自己改進著完就好。
▲ 中國象棋棋盤ICCS坐標示意圖
1.2 FEN局面
至于 FEN 局面表示法,則是用來表示當前局面有哪些子,輪到誰走。本文所建模的棋譜實際上都是全局棋譜,所以實際上本文的模型不需要用到它(局面都是默認的新開局面),不過為了方便有興趣的讀者做出改進,這里也簡單介紹下。
所謂 FEN 表示法,主要就是想辦法表示出每一行有哪些子,比如開局表示為“rnbakabnr/9/1c5c1/p1p1p1p1p/9/9/P1P1P1P1P/1C5C1/9/RNBAKABNR?w?-?-?0?1”。其中紅色部分表示局面,小寫表示黑方,大寫表示紅方,不同行之間用/隔開,字母含義如下表。
這樣,“rnbakabnr”就表示第一行為黑子的“車馬象士將士象馬車”,“9”表示第二行 9 個點都是空白的,“1c5c1”表示第三行是“1個空白 +1 個黑砲 +5 個空白 +1 個黑砲 +1個空白”,等等;綠色部分表示輪到哪一方走子,“w”表示紅方,“b”表示黑方;剩下部分一般不大重要,有興趣的讀者自己去看鏈接就行。
建模型
看了上述對記譜表示的介紹,我們知道,不管是每步的走法還是局面的表示,都被我們轉化為了一串文本了,而對于象棋的推演都是以局面與走法作為輸入輸出的,所以理論上來說象棋的建模完全就是一個“文本處理”問題!這便是 GPT2 下象棋的理論依據了。本質上來講,GPT 也就是 BERT 加上語言模型的 Attention Mask,所以這樣的做法我們說是 BERT 下象棋或者 GPT 下象棋都行。
2.1 代碼分享
模型原理就沒什么好寫的了,之前就有文章從語言模型到 Seq2Seq:Transformer 如戲,全靠 Mask 介紹,相關的例子有基于 Conditional Layer Normalization 的條件文本生成、BERT 可以上幾年級了?Seq2Seq“硬剛”小學數學應用題等,讀者可以自行翻看。本文的處理其實很簡單,就是只保留全局棋譜,將棋譜的 ICCS 記法當成一個長句子,然后訓練一個語言模型。
項目鏈接:
https://github.com/bojone/gpt_cchess
訓練過程使用漸進式訓練,即逐步增加序列長度,而不是一次性使用同一的長度,有些文章將這種做法稱之為“課程學習(Curriculum Learning)”。
這種做法能提高模型的訓練速度和收斂速度(一開始序列更短,訓練速度更快,也更容易收斂),直觀來看就是讓模型先學習“開局”,然后再學習“開局+中局”,最后學習“開局+中局+殘局”,逐步增加難度。
訓練前加載了 BERT 的權重,可能讀者會疑問 BERT 的權重還能跟棋譜有關系?其實沒什么關系,但是不管怎么說,用 BERT 的權重比完全隨機初始化的權重要好點,收斂會快一點點。
2.2 測試一下
模型腳本還包含了一個可以跟模型交互式下棋的實現,讀者可以自行體驗一下,這個交互式下棋使用了 python 的 cchess 模塊 [3] 來輔助實現,在此表示感謝。
GPT 本身是一個生成模型,但是在決定下一步棋走什么的時候,筆者并不是用生成式方法(因為無約束生成有可能輸出不可行的走法),而是用打分式的方法,即直接生成當前局面的所有可行走法,然后輸入到模型打分,取分數最高的那個走法,這樣就保證模型輸出的每一步都是可行的,保證了可以跟 AI 一直對局下去,直到分出輸贏。
▲ 交互式下期效果
也許讀者可能會有疑問,枚舉所有可行走法計算量會不會很大?其實,對于每個局面來說,可行走法并不多,可以通過簡單論證它不會超過 111 種(是不是有點意外?中國象棋每一步的候選走法不超過 111 種,而不是一個非常大的數字),所以這一步的 batch_size 不會超過111,因此是可以接受的。
推導過程很簡單:1 個車或炮最多有 17 種走法,2 車 2 炮最多有 68 種走法;兵如果都過河了,那么每個兵最多有3種走法,5 個兵最多有 15 種走法;1 個馬最多有8種走法,2 個馬就是 16 種;2 個相最多有 6 種走法(1 個在中間,1 個在邊,4+2);1 個士在花心最多有 4 種走法(2 個士反而相互堵塞);最后的帥最多有 2 種走法。因此結果是 68+15+16+6+4+2=111。具體局面設計可以參考數學研發論壇的《一個中國象棋局面設計難題》[4]。
大家最關心的可能就是這樣弄出來的模型棋力究竟怎樣?筆者簡單跟它測了一下,大概的結論是:基本上可以開一個比較好的局,開局的時候具有不錯的應變能力,不過一旦到了中局之后,應變能力會大大下降。對于吃子不是很敏感,也就是說當你亂吃它的子的時候,它可能不會應對。可以看出這些其實都是純背棋譜的缺點。當然,前面說了每一步的輸出都是可行,因此你可以跟它一直玩下去,直到把棋下完。
談改進
應該有讀者會問能不能自己跟自己對弈來提高棋力?理論上當然是可以的,但很遺憾這里沒有實現,一是沒那個心思實現,二是沒那個算力實現。
此外,增加模型大小應該也能進一步提升棋力,要注意筆者上述結果只用了 Base 版本(1 億參數)的模型,本文開頭提到的網友用 GPT2 下國際象棋可是用了 15 億參數的 GPT2,是我們的 15 倍。
還有一個改進的地方,那就是上面的建模中我們直接學習了整個對局棋譜,按道理為了更好的棋力我們可以只學習贏家的走法,不能學習輸家的走法。
當然,這些做法就算有提升,估計也是有限的,歸根結底,這跟我們所理解的下棋原理不一樣。我們下棋是根據局面形勢往前推的,但上述的語言模型做法則沒有局面這個概念,或者說它的局面需要用已經走的所有步驟來確定,這對于中后局來說歷史步數太多,確實有點強模型所難了。
改進方法其實也很簡單,改為“以局面為輸入、以走法為輸出”就好了,前面我們說了,局面也可以用 FEN 表示法表示為一個文本,因此這也是只是個 Seq2Seq 任務而已。
除此之外,還有一些別的做法,比如我們可以把贏家的每一個局面都當作正樣本,輸家的每一個局面都當作負樣本,那么就可以訓練一個二分類模型,來判斷局面優劣,有了這個判斷函數,我們也可以直接枚舉每一個可行走法,根據判斷函數的結果來選擇最優下法。而局面可以表示為文本,這就意味這我們將下棋變成了一個文本分類任務了。
總之,得益于 Transformer 模型對文本的強大的建模能力,這使得我們對下棋的建模思路也變得簡單多樣起來了。
總小結
本文嘗試了通過 bert4keras 用 GPT 來下中國象棋的做法,主要思路是通過“語言模型背棋譜”的方式來讓模型具有預測下一步的能力,并談及了一些改進思路。盡管本文的做法并非對下棋這個任務進行建模的標準做法,但通過這樣的方式,能讓我們進一步體會到語言模型的強大之處。
歡迎大家報告自己所訓練的下棋模型的棋力智商,哈哈。
參考文獻
[1]?https://www.xqbase.com/protocol/cchess_move.htm
[2] https://www.xqbase.com/protocol/cchess_fen.htm
[3] https://github.com/walker8088/cchess
[4] https://bbs.emath.ac.cn/thread-17051-1-1.html
更多閱讀
#投 稿?通 道#
?讓你的論文被更多人看到?
如何才能讓更多的優質內容以更短路徑到達讀者群體,縮短讀者尋找優質內容的成本呢?答案就是:你不認識的人。
總有一些你不認識的人,知道你想知道的東西。PaperWeekly 或許可以成為一座橋梁,促使不同背景、不同方向的學者和學術靈感相互碰撞,迸發出更多的可能性。?
PaperWeekly 鼓勵高校實驗室或個人,在我們的平臺上分享各類優質內容,可以是最新論文解讀,也可以是學習心得或技術干貨。我們的目的只有一個,讓知識真正流動起來。
?????來稿標準:
? 稿件確系個人原創作品,來稿需注明作者個人信息(姓名+學校/工作單位+學歷/職位+研究方向)?
? 如果文章并非首發,請在投稿時提醒并附上所有已發布鏈接?
? PaperWeekly 默認每篇文章都是首發,均會添加“原創”標志
?????投稿郵箱:
? 投稿郵箱:hr@paperweekly.site?
? 所有文章配圖,請單獨在附件中發送?
? 請留下即時聯系方式(微信或手機),以便我們在編輯發布時和作者溝通
????
現在,在「知乎」也能找到我們了
進入知乎首頁搜索「PaperWeekly」
點擊「關注」訂閱我們的專欄吧
關于PaperWeekly
PaperWeekly 是一個推薦、解讀、討論、報道人工智能前沿論文成果的學術平臺。如果你研究或從事 AI 領域,歡迎在公眾號后臺點擊「交流群」,小助手將把你帶入 PaperWeekly 的交流群里。
總結
以上是生活随笔為你收集整理的GPT v.s. 中国象棋:写过文章解过题,要不再来下盘棋?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: xl是175码还是180码(Xl是175
- 下一篇: 人工智能定义介绍(人工智能定义)