如何利用 Python 打造一款簡易版 AlphaGo
2017 年伊始,再度出山的 AlphaGo 化名 Master 在網(wǎng)絡(luò)圍棋平臺上打遍棋界無敵手。你是否也想打造一個自己的 AlphaGo 呢?GitHub 用戶 Brian Lee(brilee)發(fā)布了一個效仿 AlphaGo 的極簡圍棋引擎的 Python 實(shí)現(xiàn) MuGo。
這是 AlphaGo 基本組成部分的一個純 Python 實(shí)現(xiàn)。
AlphaGo 邏輯/控制流(logic/control flow)其實(shí)并不非常復(fù)雜,本項(xiàng)目就是其復(fù)現(xiàn)。AlphaGo 的秘密武器是在于其各種神經(jīng)網(wǎng)絡(luò)之中。
就我所知,AlphaGo 在對弈過程中使用了三個神經(jīng)網(wǎng)絡(luò)。
***個神經(jīng)網(wǎng)絡(luò)是一個速度很慢但很準(zhǔn)確的策略網(wǎng)絡(luò)(policy network)。這個網(wǎng)絡(luò)被訓(xùn)練用來預(yù)測人類的走子(大約 57% 的準(zhǔn)確度),它會輸出一個可能走子的列表,并且每一種走子方式都對應(yīng)了一個概率。這個網(wǎng)絡(luò)為蒙特卡洛樹搜索(MCTS)提供了可能的走子起點(diǎn)。這個神經(jīng)網(wǎng)絡(luò)很慢的一大原因是它具有很大的規(guī)模,這是因?yàn)檫@個神經(jīng)網(wǎng)絡(luò)的輸入是圍棋棋盤上的各種計(jì)算成本高昂的屬性——氣的數(shù)量、叫吃、征等等。
第二個神經(jīng)網(wǎng)絡(luò)也是一個策略網(wǎng)絡(luò),它比***個更小更快,但準(zhǔn)確度更低(大約 24%),這個網(wǎng)絡(luò)并不使用復(fù)雜的屬性作為輸入。一旦到達(dá)了當(dāng)前 MCTS 樹的葉節(jié)點(diǎn)(leaf node),這個第二個更快的網(wǎng)絡(luò)就會被用來得到一個棋盤局面的可能走子,并且對這個這個最終局面進(jìn)行評分。
第三個神經(jīng)網(wǎng)絡(luò)是一個價(jià)值網(wǎng)絡(luò):它為棋盤輸出一個預(yù)期獲勝的范圍,而不會自己下任何棋。
然后,將使用第二個神經(jīng)網(wǎng)絡(luò)的蒙特卡洛得到的結(jié)果和使用第三個神經(jīng)網(wǎng)絡(luò)的價(jià)值計(jì)算結(jié)果進(jìn)行平均,然后這個值被記為該 MCTS 節(jié)點(diǎn)的近似結(jié)果。
開始
安裝 TensorFlow
開始需要安裝 TensorFlow,并使用 GPU 驅(qū)動器(即英偉達(dá)顯卡的 CUDA 支持)
獲取用于監(jiān)督學(xué)習(xí)的 SGF
接下來需要一個 SGF 文件源。你可以在 https://u-go.net/gamerecords 獲取 15 年時長的高段位對局?jǐn)?shù)據(jù)。你也可以從其它來源下載專業(yè)比賽的數(shù)據(jù)庫。
預(yù)處理 SGF
第三,對你的 SGF 文件進(jìn)行預(yù)處理。這需要 SGF 文件中的所有局面并提取出每一個局面的特征以及記錄正確的下一步走子。
然后將這些局面分割成塊(chunk)——一塊用于測試,其它的都用于訓(xùn)練。這個步驟需要一定時間,而且要是你修改了 features.py 文件中的特征提取步驟,你還需要重新預(yù)處理。
- python main.py preprocess data/kgs-*
注:這句代碼用了通配符,比如說:KGS 目錄可以名為 data/kgs-2006-01、data/kgs-2006-02 等等
監(jiān)督學(xué)習(xí)(策略網(wǎng)絡(luò))
使用上面預(yù)處理過的 SGF 數(shù)據(jù)(默認(rèn)輸出目錄是 ./processed_data/),你可以訓(xùn)練策略網(wǎng)絡(luò)。
- python main.py train processed_data/ --save-file=/tmp/
網(wǎng)絡(luò)訓(xùn)練好了之后,當(dāng)前模型會被保存在 --save-file。你可以通過如下代碼繼續(xù)訓(xùn)練這個網(wǎng)絡(luò):
- python main.py train processed_data/ --read-file=/tmp/savedmodel
- --save-file=/tmp/savedmodel --epochs=10 --logdir=logs/my_training_run
此外,你也可以使用 TensorBoard 跟蹤你的訓(xùn)練過程——如果你為每一次運(yùn)行定義了一個不同的名字(如:logs/my_training_run、logs/my_training_run2),你可以將這些運(yùn)行彼此重疊起來:
- tensorboard --logdir=logs/
與 MuGo 對弈
MuGo 使用了 GTP 協(xié)議,你可以通過任何兼容 GTP 的程序來使用它。要調(diào)用原始策略網(wǎng)絡(luò),使用如下代碼:
- python main.py gtp policy --read-file=/tmp/savedmodel
要調(diào)用集成了 MCTS 的策略網(wǎng)絡(luò)版本,使用:
- python main.py gtp mcts --read-file=/tmp/savedmodel
通過 GTP 下棋的一種方式是使用 gogui-display(它有一個兼容 GTP 的 UI)。你可以在 http://gogui.sourceforge.net/ 下載 gogui 工具套件。參見 http://gogui.sourceforge.net/doc/reference-twogtp.html 了解使用 GTP 的有趣方式。
- gogui-twogtp -black 'python main.py gtp policy --read-file=/tmp/savedmodel' -white 'gogui-display' -size 19 -komi 7.5 -verbose -auto
另一種通過 GTP 玩的方式是對抗 GnuGo,同時還能觀看比賽:
- BLACK="gnugo --mode gtp"
- WHITE="python main.py gtp policy --read-file=/tmp/savedmodel"
- TWOGTP="gogui-twogtp -black \"$BLACK\" -white \"$WHITE\" -games 10 \
- -size 19 -alternate -sgffile gnugo"
- gogui -size 19 -program "$TWOGTP" -computer-both -auto
還有一種玩法是通過 GTP 連接 CGOS(http://yss-aya.com/cgos/ 計(jì)算機(jī)圍棋在線服務(wù)器)。由 boardspace.net 運(yùn)營的 CGOS 服務(wù)器已經(jīng)關(guān)閉了;你需要在 yss-aya.com 接入 CGOS 服務(wù)器。
配置好了你的 cgos.config 文件之后,你可以通過 cgosGtp -c cgos.config 連接到 CGOS,以及使用 cgosView yss-aya.com 6819 查看你自己的游戲。
MuGo 項(xiàng)目地址:https://github.com/brilee/MuGo



























