【附完整代碼】AlphaGo Zero 遲遲不開源,Google 員工等不及自己偷偷推出一個啦!

【我們為什麼挑選這篇文章】Google 大腦團隊所開發的 TensorFlow 是一個開源軟體庫,前陣子,TensorFlow 官方在 GitHub 上推出了一個 AlphaGo Zero 的開源代碼,簡直驚倒眾生一片。雖然官方強調這並非正式的 AlphaGo Zero 專案,但是大勝棋王柯潔的人工智慧機器人 AlphaGo Zero 還是讓人超級好奇。一起來一窺它的真面目!(責任編輯:杜維)

本文經 AI 新媒體量子位(公眾號 ID:QbitAI)授權轉載,轉載請聯繫出處

TensorFlow 官方在 GitHub 上推了一個 AlphaGo Zero 的開源代碼!

這個叫做 Minigo 的圍棋 AI 引擎,是一個使用 Python 語言、在 TensorFlow 框架實現的基於神經網路的圍棋算法。

這個項目確實是受到 DeepMind 的 AlphaGo 算法的啟發,但 TensorFlow 官方再三強調這個項目不屬於 DeepMind,也不是官方正式的 AlphaGo 項目

不是行貨!不是行貨!不是行貨!

重要的事情說三遍!

DeepMind 遲遲不開源 AlphaGo 代碼,看來 Google 自己人也等不及了。

以下內容搬運自 TensorFlow 的 GitHub 項目網頁。

Minigo 其實基於 Brian Lee 此前發布的 MuGo。

MuGo 是依據首篇 AlphaGo 論文 Mastering the Game of Go with Deep Neural Networks and Tree Search 用 Python 復現的結果。

Minigo 裡所添加的參數,以及所做的架構調整是參考 AlphaGo Zero 的論文 Mastering the Game of Go without Human Knowledge。

最近,這個經調整的架構已經擴展運用到了國際象棋和將棋的論文 Mastering Chess and Shogi by Self-Play with a General Reinforcement Learning Algorithm 中了。

這些論文的工作都會在 Minigo 中用 AG(AlphaGo),AGZ(AlphaGo Zero),AZ(AlphaZero) 縮寫表示。

這個項目的目標

  • 提供一套清晰的學習樣板,能夠運用 TensorFlow、Kubernetes 及 Google Cloud 平台來建立硬體加速器上的增強學習的流程。
  • 盡可能還原重現原始 DeepMind AlphaGo 論文中的方法,通過開源的流程工具及開源的實現。
  • 把我們的數據、結果、發現都公開出來,讓圍棋、機器學習、Kubernetes 社群獲益。

這個項目還有一個明確但不是目標的願景,就是做出來一個具有競爭力的圍棋項目,甚至能成為頂級的圍棋算法。

我們致力於做一個可讀的、可理解的操作手冊,能夠對圈子裡的人有幫助,即使這麼做意味著我們操作起來效率和速度上會受到影響。

儘管最後的結果是會做出來一個強大的模型,但是我們是更看重和享受其中的過程:)

我們希望這個項目,對於感興趣的開發者來說,可以通過容易理解的 python 代碼平台觸及到強大的圍棋模型,來擴展,適配更多的項目任務。

如果你想知道我們是怎麼訓練這個模型的,請看 RESULTS.md

也想加入我們看看能幫忙做些什麼的話,請參考 CONTRIBUTING.md

發車!

想做這個項目,你需要有以下的:

1.virtualenv / virtualenvwrapper

2.Python 3.5+

3.Docker

4.Cloud SDK

搭便車指南(Hitchhiker’s guide) 是非常棒的 python 開發及虛擬環境使用的入門資料。往後的指導沒有一個不是在非虛擬環境下測試的。

pip3 install virtualenv
pip3 install virtualenvwrapper

安裝 TensorFlow

首先創建一個新的虛擬環境,進去之後,開始安裝 TensorFlow 和依賴工具:

pip3 install -r requirements-gpu.txt

當你要用 GPU 的時候,打開 requirements-gpu.txt 這個文件。一定要安裝 CUDA 8.0。具體看 TensorFlow 那堆文檔。

如果你不用 GPU 跑,或者你沒有,那麼你搞個較早的版本:

pip3 uninstall tensorflow-gpu
pip3 install tensorflow

或者安裝 CPU 要求:

pip3 install -r requirements-cpu.txt

創建一個環境

你可能需要用到一個雲來存資源,如果是醬安裝:

PROJECT=foo-project

然後,運行

source cluster/common.sh

這樣可以設置其他環境可變的默認參數。

運行單元測試

BOARD_SIZE=9 python3 -m unittest discover tests

基礎條件(basic)

所有請求必須兼容 Google 雲端硬碟(作為遠程文件系統),或者你本地的文件系統。這裡舉得例子是用 Google 雲端硬碟,你要用本地文件路徑是一樣 OK 的。

用 Google 雲端硬碟的話呢,就要設置 BUCKET_NAME 參數,然後驗證 登錄 Google 雲端硬碟 。不然的話,所有的請求都會被擱置。

比如說,設置一個桶,驗證,然後查找一個最近的模型。

export BUCKET_NAME=your_bucket;
gcloud auth application-default login
gsutil ls gs://minigo/models | tail -3

看起來是醬紫的:

gs:/BUCKET_NAME/models/000193-trusty.index
gs://$BUCKET_NAME/models/000193-trusty.meta

這三個文件共同組成這個模型。而一個模型所需的指令需要一個路徑傳遞給模型的 basename。比如說,gs://$BUCKET_NAME/models/000193-trusty

你需要把這個複製到你的本地盤上。這一節(fragment)把最近的模型拷貝到目錄下的 MINIGO_MODELS。

MINIGO_MODELS=$HOME/minigo-models
mkdir -p $MINIGO_MODELS
gsutil ls gs://minigo/models | tail -3 | xargs -I{} gsutil cp “{}” $MINIGO_MODELS

先讓 Minigo 自己玩

看 Minigo 開一局,你需要 specify 模型。下面是個用最新模型在你桶裡運行的例子。

python rl_loop.py selfplay —readouts=$READOUTS -v 2

READOUTS 那部分指的是,每一步需要做幾次搜索。每一步的時間信息和數據都會打印出來。把速度設定到 3 或更高,會把每一步都打印在板上。

再虐 Minigo

Minigo 用的是 GTP 協議,你可以使用任何的符合 GTP 協議的項目。

# Latest model should look like: /path/to/models/000123-something
LATEST_MODEL=$(ls -d $MINIGO_MODELS/* | tail -1 | cut -f 1 -d ‘.’)
BOARD_SIZE=19 python3 main.py gtp -l $LATEST_MODEL -r $READOUTS -v 3

(如果沒有模型的話,那它會隨機設個初始值)

在加載了幾個信息之後,它會提示 GTP 引擎已經準備好,也就是說這一刻它可以接受指令。GTP 的小抄 (cheatsheet):

genmove [color] # Asks the engine to generate a move for a side
play [color] [coordinate] # Tells the engine that a move should be played for color at coordinate
showboard # Asks the engine to print the board.

拿 GTP 來玩的一個辦法是用 gogui-display(含兼容 GTP 的 UI)。

你可以在 http://gogui.sourceforge.net/ 下載 gogui 工具。

看使用 GTP 的幾個好玩的方法。

gogui-twogtp -black ‘python3 main.py gtp -l gs://$BUCKET_NAME/models/000000-bootstrap’ -white ‘gogui-display’ -size 19 -komi 7.5 -verbose -auto

另外一個辦法呢,就是看 Minigo 和 GnuGo 互毆。

BLACK=”gnugo —mode gtp”
WHITE=”python3 main.py gtp -l path/to/model”
TWOGTP=”gogui-twogtp -black \”WHITE\” -games 10 \
-size 19 -alternate -sgffile gnugo”
gogui -size 19 -program “$TWOGTP” -computer-both -auto

訓練 Minigo

概述

接下來呢,跟著這一串的指令做,你能得到增強學習在 9×9 圍棋上的迭代。這些很基礎的指令都是用來建前面提到的模型的。

這些指令是:

  • bootstrap:初始化模型;
  • 自我博弈:用最新版的模型自我對弈下棋,產生可用來訓練的數據;
  • 收集:把同一個模型產生的數據文件導入到訓練數據中;
  • 訓練:用 N 代自我對弈產生的結果訓練一個新模型。

Bootstrap

這一步的指令是創建模型,放在 gs://MODEL_NAME(.index|.meta|.data-00000-of-00001)

export MODEL_NAME=000000-bootstrap
python3 main.py bootstrap gs://MODEL_NAME

自我對弈

這步指令是輸出原始對戰數據,能夠兼容 TensorFlow 格式以及目錄下的 SGF。

gs://MODEL_NAME/local_worker/ .tfrecord.zz
gs://MODEL_NAME/local_worker/ .sgf

python3 main.py selfplay gs://MODEL_NAME \
—readouts 10 \
-v 3 \
—output-dir=gs:/MODEL_NAME/local_worker \
—output-sgf=gs://MODEL_NAME/local_worker

蒐集

python3 main.py gather

這指令是把(可能只有幾 KB 大小的)tfrecord.zz 文件打亂重組成不到 100MB 的 tfrecord.zz 文件。

根據模型的編號來蒐集數據,這樣同一個模型產生的數據就會放在一起。默認情況下,目錄裡的文件名,rl_loop.py 之前後加個環境參數 BUCKET_NAME 的前綴。

gs://MODEL_NAME-{chunk_number}.tfrecord.zz

gs://$BUCKET_NAME/data/training_chunks/meta.txt 文件是用來查看目前是在處理哪個遊戲。

python3 main.py gather \
—input-directory=gs:/BUCKET_NAME/data/training_chunks

訓練

這步指令刨出最新的 50 個模型的訓練,以及參考最新的模型權重來訓練新的模型。

運行訓練任務:

python3 main.py train gs://BUCKET_NAME/models/000001-somename \
—load-file=gs://$BUCKET_NAME/models/000000-bootstrap \
—generation-num=1 \
—logdir=path/to/tensorboard /logs \

已經更新的模型權重會被保存下來。

(要做的事兒:搞幾個本地的基於 global_step 的檢查點兒,醬回頭可以任性地恢復)

另外,你可以一步步跟著 TensorBoard 訓練的指南。如果你給每次運行都不同的名字的話,比方說,logs/my_training_run ,  logs/my_training_run2,你可以覆蓋掉之前的數據。

tensorboard —logdir=path/to/tensorboard/logs/

在 Kubernetes Cluster 上運行 Minigo 啦

自個兒去 cluster/README.md 看!

最後,附上 開源代碼網址

(本文經 量子位 授權轉載,並同意 TechOrange 編寫導讀與修訂標題,原文標題為 〈AlphaGo Zero 代码迟迟不开源,TF 等不及自己推了一个 〉,首圖來源:Pixabay, CC Licensed 。)

更多關於 AlphaGo Zero

AlphaGo 技術負責人專訪:無師自通的 AlphaGo Zero 煉成術是什麼?
以後圍棋比賽都跟 AI 對弈就好啦?圍棋世界冠軍柯潔:AlphaGo Zero 太強,人類太多餘了
Deepmind 團隊最新力作:不需人類的 AlphaGo Zero,左右互搏練成 AI 版周伯通


我們正在找夥伴!

2019 年我們的團隊正在大舉擴張,需要你的加入跟我們一起找出台灣創新原動力! 我們正在徵 《採訪社群編輯》、《助理編輯》,詳細職缺與應徵辦法 請點我

點關鍵字看更多相關文章: