28 天自制你的 AlphaGo (3) : 訓練策略網路,真正與之對弈

知乎對於人機大戰的關注度很高,所以寫這個系列,希望能讓大家對於人工智慧和圍棋有更多的了解。如果有收穫,請記得點一下贊。

這篇我們安裝 TensorFlow,真正訓練一下 AlphaGo v13 的 policy network,並且你還可以與它真正對弈,因為前幾天已經有網友在做可以運行的 AlphaGo v13 的簡化版:brilee/MuGo。所以這個過程真的已經很傻瓜化,毫不誇張地說,人人都可以擁有一隻小狗了,只要你把棋譜餵給它,它就能學到棋譜的棋風。(如果不會圍棋,可以看本系列的第一篇入門:zhuanlan.zhihu.com/p/24 )(本文是給大家快速找到感覺,後續我們會從頭寫代碼,因為這位網友的代碼真的很多 bug

本系列已更新多篇,其它幾篇的傳送門:

  • (1) : 圍棋 AI 基礎 知乎專欄

  • (2) : 安裝 MXNet 搭建深度學習環境 知乎專欄

  • (4) : 對於策略網路的深入分析(以及它的弱點所在) 知乎專欄

  • (4.5):後文預告(Or 為什麼你應該試試 Batch Normalization 和 ResNet)知乎專欄

一、安裝 TensorFlow

如果還沒有裝 CUDA 等等,請看前一篇(知乎專欄)裝好,記得把 cudnn 解壓到 CUDA 的目錄。TensorFlow 最近開始原生支持 Windows,安裝很方便。下面看 Windows 的安裝。

1. 在上一篇我們裝了 Anaconda Python 2.7,而 TensorFlow 需要 Python 3.5,不過兩者在 Windows 下也可以共存,具體見:Windows下Anaconda2(Python2)和Anaconda3(Python3)的共存 - Infin1te的博客 - 博客頻道 - CSDN.NET

2. 按上文切換到 Python 3,然後一個命令就可以裝好: tensorflow.org/versions 。例如 GPU 版本目前是:pip install --upgrade storage.googleapis.com/ 。但是,你很可能會遇到 404 錯誤,那麼可以把這個文件用迅雷下載下來,然後 pip install 文件名 即可。

3. 裝完後檢驗一下。首先進 python 然後 import tensorflow 然後 hello = tf.constant("Hello, TensorFlow!") 然後 sess = tf.Session() 然後 print(sess.run(hello))。

4. 然後 python -m tensorflow.models.image.mnist.convolutional 測試訓練 MNIST 模型(一開始也會下載數據文件,比較慢)。

另外再看看 Mac 的安裝。我是 OSX 10.11。

1.首先 sudo easy_install pip 然後 sudo easy_install --upgrade six 然後 pip install tensorflow-gpu 即可。

2. 可能需要再執行 sudo ln -s /usr/local/cuda/lib/libcuda.dylib /usr/local/cuda/lib/libcuda.1.dylib ,否則 import tensorflow 會報錯。

3. 用一樣的辦法檢驗一下安裝是否成功。

二、訓練策略網路

激動人心的時刻到了,我們開始真正訓練 policy network。下面都以 Windows 下面的操作為例。

1. 把網友做好的 AlphaGo v13 簡化版下載下來:brilee/MuGo 。然後 pip install 了 argh 和 sgf。注意 gtp 要額外裝:jtauber/gtp (下載下來後用 easy_install . 裝)。

2. 然後下載一些用於學習的棋譜。圍棋棋譜的通用格式是 SGF。比如,就下載 KGS 的對局棋譜吧:u-go.net 。我沒有統計過,不過上面大概有十萬局吧。從原理上說,棋譜越多,訓練的質量就越有保證;但是,棋譜中對弈者的水平參差不齊,如何控制這一變數,做過深度學習的朋友心中會有答案。本篇先不談技術細節,我們先繼續走。

3. 下面提取棋譜的特徵,並將其分類為訓練集和測試集。先建立 data 子目錄,把 SGF 拷貝進去。例如下載 2014 年的 13029 局棋譜,解壓到 data 下面是 kgs-19-2014,那麼就執行

python main.py preprocess data/kgs-19-2014

截至今天為止,你會發現它寫的 chunk 比預想少很多,所以生成的訓練數據很少。具體來說,棋譜的讓子大於 4 會崩潰,棋譜沒有寫明貼目會崩潰,有時候棋譜裡面的 [tt] 其實也代表 PASS,等等。做為作業,請自己一個個修復吧! SGF 格式的說明在此:SGF file format FF[4]

4. 再建立一個 tmp 目錄,然後開始訓練 1 個周期:

python main.py train processed_data --save-file=tmpsavedmodel --epochs=1 --logdir=logsmy_training_run

5. 你會發現策略網路的預測準確率開始從 0 慢慢上升了! 然後可以隨時繼續訓練,比如說繼續訓練 10 個周期就是:

python main.py train processed_data --read-file=tmpsavedmodel --save-file=tmpsavedmodel --epochs=10 --logdir=logsmy_training_run

6. 訓練的時候,可以再開一個命令行,激活 python3,然後 tensorboard --logdir=logs 然後在瀏覽器打開 127.0.0.1:6006/ 可以看到訓練的過程:

7. 一直訓練到準確率增加緩慢為止,應該可以到接近 60%。

三、與自製小狗對弈

8. 測試一下走棋(如果你會 GTP 協議):python main.py gtp policy --read-file=tmpsavedmodel 這是純網路輸出。如果把 policy 改成 mcts 就是加入了蒙特卡洛樹搜索的,棋力更高(但是截至今天為止,你執行會發現立刻退出,這位網友的程序 bug 真是太多了,我們以後再重寫)。

9. 如果不會 GTP,還是下載 GoGui 圍棋圖形界面吧: Download GoGui from SourceForge.net 。然後執行:"C:Program Files (x86)GoGuigogui-twogtp.exe" -black "python main.py gtp policy --read-file=tmpsavedmodel" -white "C:Program Files (x86)GoGuigogui-display" -size 19 -komi 7.5 -verbose -auto,但是截至今天為止,你會發現它很快就報錯退出......

10. 這是因為截至今天為止,代碼有個 bug 是 strategies.py 的第 95 行的函數要改成 is_move_reasonable(position, move) 。然後......你親手製造的小狗就可以運行了! 黑棋是小狗:

Behold,小狗已經學會了守角! 不過現在他還特別弱,因為沒有搜索,容易死活出問題。

11. 如果不會下圍棋,讓 GnuGo 來玩玩吧,下載鏈接:gnugo.baduk.org/gnugo2/ ,比如解壓到 C:gnugognugo.exe ,然後執行:"C:Program Files (x86)GoGuigogui.exe" -size 19 -computer-both -auto -program "C:Program Files (x86)GoGuigogui-twogtp.exe -black ""C:gnugognugo.exe --level 1 --mode gtp"" -white ""python main.py gtp policy --read-file=tmpsavedmodel"" -games 1 -size 19 -alternate -sgffile gnugo -verbose" 即可。你會發現下到後面也會崩潰,如果打開 GTP Shell 看看,是因為小狗還無法理解對方的 PASS,哈哈。

於是,這篇就到此吧,我們下一篇見。

本系列已更新多篇,其它幾篇的傳送門:

  • (1) : 圍棋 AI 基礎 知乎專欄

  • (2) : 安裝 MXNet 搭建深度學習環境 知乎專欄

  • (4) : 對於策略網路的深入分析(以及它的弱點所在) 知乎專欄

如需轉載本系列,請先與本人聯繫,謝謝。小廣告:晚上工作學習是否覺得光線不夠舒服,精神不夠集中,眼睛容易疲勞?不妨點擊看看我們的自然全光譜燈系列:Blink Sunshine護眼LED燈泡 高顯指97顯色指數無頻閃學習檯燈床頭 如果需要好用的耳機或錢包,我們也有 :-)

推薦閱讀:

圍棋比賽將成為人工智慧「奧運會」的雛形
AlphaZero實戰:從零學下五子棋(附代碼)
一張圖看懂AlphaGo Zero
人機大戰柯潔勝算不到一成,AlphaGo 身後的 TPU 殺傷力究竟有多強大?
AlphaGo無懸念勝出柯潔,人類更應該關注人工智慧的應用

TAG:AlphaGo | 深度学习DeepLearning | 人工智能 |