PyaqはPythonのみで実装された囲碁プログラムです。深層学習を学ぶための教育目的のコードです。
Switch branches/tags
Nothing to show
Clone or download
Latest commit ce0bde0 Feb 16, 2018
Permalink
Failed to load latest commit information.
pre_train first commit Feb 12, 2018
LICENSE first commit Feb 12, 2018
README.md modify README Feb 14, 2018
board.py fix hash bug in Python3.x Feb 16, 2018
gtp.py first commit Feb 12, 2018
learn.py modify file open option Feb 14, 2018
model.py first commit Feb 12, 2018
pyaq.py modify file open option Feb 14, 2018
search.py fix hash bug in Python3.x Feb 16, 2018
sgf.py first commit Feb 12, 2018
sgf.zip first commit Feb 12, 2018

README.md

Pyaq

PyaqはPythonのみで実装された囲碁プログラムです。
このプログラムは深層学習のチュートリアルとして、囲碁のニューラルネットワークモデルを学習させ、実際に対局することを目的としています。

top

具体的には次の内容を行います。

  • TensorFlowで9路盤の棋譜を学習する
  • 学習したモデルを使って対局する

囲碁の対局や深層学習のための必要最小限の実装となっており、学習・実行のすべてのコードを合わせて1000行程度です。より発展的に学習したい方はソースコードを読んでみると良いでしょう。もちろんプルリクエストも歓迎です。

1. 準備する

下記の環境を例に説明を進めます。

  • Ubuntu 16.04
  • Python 2.7
  • TensorFlow

TensorFlowの導入はUbuntuにTensorFlowをインストールを参考にしてください。
TensorFlowでGPUを用いる場合は

をインストールしておく必要があります。また、nVidia製のCUDA Capability3.5以上のグラフィックボードが必要です。
CUDA導入はCUDA 8.0とcuDNN 6をUbuntu 16.04LTSにインストールするなどを参考にしてください(注:リンク先の場合とバージョンが異なります)。

次に、ソースコードをダウンロードします。

$ git clone https://github.com/ymgaq/Pyaq

または右上の「Clone or download」から手動でダウンロードすることもできます。
これで準備は完了です。

すぐ遊びたい人は、学習済みのデータファイルPyaq/pre_train/model.ckptPyaq/にコピーし、「4.GoGuiで対局する」に進んでください。

では試しにテスト対戦が動作するかを確認してみましょう。

$ ./pyaq.py --self --random

次のような出力が出れば成功です。「2.学習する」に進みましょう。

   A  B  C  D  E  F  G  H  J 
 9 .  X  X  X  X  X  X  .  X  9
 8 X  X  X  .  X  X  X  X  X  8
 7 O  O  X  X  X  O  O  X  O  7
 6 O  O  O  O  O  .  O  O  O  6
 5 O  O  X  O  O  O  O  .  O  5
 4 X  X  X  O  .  O  .  O  O  4
 3 .  X  O  O  O  O  O  O  .  3
 2 X  X  X  X  X  O  O  O  O  2
 1 X  .  X  O  O  O  O  O  .  1
   A  B  C  D  E  F  G  H  J 

   A  B  C  D  E  F  G  H  J 
 9 .  X  X  X  X  X  X  .  X  9
 8 X  X  X  .  X  X  X  X  X  8
 7 O  O  X  X  X  O  O  X  O  7
 6 O  O  O  O  O  .  O  O  O  6
 5 O  O  X  O  O  O  O  .  O  5
 4 X  X  X  O  .  O  .  O  O  4
 3 .  X  O  O  O  O  O  O  .  3
 2 X  X  X  X  X  O  O  O  O  2
 1 X  .  X  O  O  O  O  O  .  1
   A  B  C  D  E  F  G  H  J 

result: W+16.0

2. 学習する

まず、学習用ファイルを展開します。

$ cd Pyaq
$ unzip sgf.zip

9路盤の棋譜ファイル(*.sgf)を用いて学習を行います。次のコマンドを実行すると、学習が始まります。

$ ./pyaq.py --learn

GPUなしで学習させたい場合は--cpuオプションを追加してください。
(ただし、CPUのみの学習は十分にテストされていません。)

$ ./pyaq.py --learn --cpu

次のように学習ログが展開されます。また、log.txtにも同じ内容が記録されます。
GPUの性能にもよりますが、大体3〜4時間で学習が完了します。 CPUのみの場合は3日程度かかります。

imported 34572 sgf files.
converting ...
learning rate=0.0003
progress: 0.10[%] 14.3[sec]
progress: 0.20[%] 13.3[sec]
progress: 0.30[%] 13.3[sec]
progress: 0.40[%] 13.4[sec]
progress: 0.50[%] 13.3[sec]
progress: 0.60[%] 13.4[sec]
progress: 0.70[%] 13.3[sec]
progress: 0.80[%] 13.3[sec]
progress: 0.90[%] 13.2[sec]
progress: 1.00[%] 13.2[sec]
progress: 1.10[%] 13.3[sec]
progress: 1.20[%] 13.3[sec]
progress: 1.30[%] 13.3[sec]
progress: 1.40[%] 13.2[sec]
progress: 1.50[%] 13.2[sec]
progress: 1.60[%] 13.2[sec]
progress: 1.70[%] 13.3[sec]
progress: 1.80[%] 13.3[sec]
progress: 1.90[%] 13.2[sec]
progress: 2.00[%] 13.2[sec]
progress: 2.10[%] 13.2[sec]
progress: 2.20[%] 13.4[sec]
progress: 2.30[%] 13.4[sec]
progress: 2.40[%] 13.2[sec]
progress: 2.50[%] 13.3[sec]
train: policy=46.95[%]  value=0.469
test : policy=47.13[%]  value=0.469

progress: 2.60[%] 15.5[sec]
progress: 2.70[%] 13.4[sec]

2.5%ごとにtestデータの評価を行います。 policyは棋譜の次の手とニューラルネットワークが出力する手との一致率、valueは棋譜の勝敗とネットワークが出力する評価値(-1~+1)の誤差(Mean Squared Error)を表します。 最終的に、testデータでpolicyが57%、valueが0.36程度になるようです。
学習が完了すると、パラメータファイルmodel.ckptが保存されます。

ネットワークモデルのBLOCK_CNTFILTER_CNT、または盤面のKEEP_PREV_CNTなどを変更したり、モデルの形を変えたり、オリジナルの棋譜データを使用することで、より強力なパラメータを生成できる可能性があります。 興味がある方は、あなただけの最強のネットワーク作りに挑戦してみましょう。

3. 自己対戦をさせてみる(コンソール)

コンソール上で学習したモデルを使って、まず探索なしの自己対戦をさせてみます。

$ ./pyaq.py --self --quick --cpu

探索なしの場合の対戦結果が得られます。

   A  B  C  D  E  F  G  H  J 
 9 .  .  .  .  .  O  O  X  .  9
 8 .  .  O  O  .  O  X  X  X  8
 7 .  O  X  X  O  O  O  X  .  7
 6 .  .  .  O  X  O  X  X  .  6
 5 O  O  .  O  X  X  O  .  .  5
 4[X] X  O  O  O  X  O  .  .  4
 3 X  X  X  O  X  X  X  .  .  3
 2 X  .  X  O  X  .  .  .  .  2
 1 .  X  O  O  O  X  .  .  .  1
   A  B  C  D  E  F  G  H  J 

   A  B  C  D  E  F  G  H  J 
 9 .  .  .  .  .  O  O  X  .  9
 8 .  .  O  O  .  O  X  X  X  8
 7 .  O  X  X  O  O  O  X  .  7
 6 .  .  .  O  X  O  X  X  .  6
 5 O  O  .  O  X  X  O  .  .  5
 4 X  X  O  O  O  X  O  .  .  4
 3 X  X  X  O  X  X  X  .  .  3
 2 X  .  X  O  X  .  .  .  .  2
 1 .  X  O  O  O  X  .  .  .  1
   A  B  C  D  E  F  G  H  J 

   A  B  C  D  E  F  G  H  J 
 9 .  .  .  .  .  O  O  X  .  9
 8 .  .  O  O  .  O  X  X  X  8
 7 .  O  X  X  O  O  O  X  .  7
 6 .  .  .  O  X  O  X  X  .  6
 5 O  O  .  O  X  X  O  .  .  5
 4 X  X  O  O  O  X  O  .  .  4
 3 X  X  X  O  X  X  X  .  .  3
 2 X  .  X  O  X  .  .  .  .  2
 1 .  X  O  O  O  X  .  .  .  1
   A  B  C  D  E  F  G  H  J 


result: Draw

次に、探索ありの自己対戦をしてみましょう。

$ ./pyaq.py --self --byoyomi=3

GPUなしの場合は--cpuオプションを追加してください。

$ ./pyaq.py --self --byoyomi=3 --cpu

1手3秒で対局が進行します。

move count=3: left time=0.0[sec] evaluated=104
|move|count  |rate |value|prob | best sequence
|D5  |   1114| 54.7| 56.3| 90.4| D5 ->C5 ->C4 ->E5 ->D6 ->E6 ->E7 ->E4 
|E4  |    150| 51.3| 55.2|  0.8| E4 ->E3 ->D5 ->C5 ->E5 ->F3 ->C4 ->D3 
|F4  |     20| 51.2| 54.3|  0.8| F4 ->D6 ->D7 
|D6  |      1| 48.1| 48.1|  3.0| D6 
|C6  |      1| 46.0| 46.0|  2.3| C6 
|C3  |      1| 44.4| 44.4|  1.8| C3 
   A  B  C  D  E  F  G  H  J 
 9 .  .  .  .  .  .  .  .  .  9
 8 .  .  .  .  .  .  .  .  .  8
 7 .  .  .  .  .  .  .  .  .  7
 6 .  .  .  .  .  X  .  .  .  6
 5 .  .  . [X] .  .  .  .  .  5
 4 .  .  .  O  .  .  .  .  .  4
 3 .  .  .  .  .  .  .  .  .  3
 2 .  .  .  .  .  .  .  .  .  2
 1 .  .  .  .  .  .  .  .  .  1
   A  B  C  D  E  F  G  H  J 

思考ログの内容は次の通りです。

  • move count 手数
  • left time 残り時間
  • evaluated この思考で評価された盤面の数
  • move 候補手
  • count 探索回数
  • rate 手番側からみた勝率
  • value 候補手を着手した場合の評価値
  • prob 候補手の確率
  • best sequence 候補手の後の読み筋

また、pyaq.pyのコマンドラインオプションは以下の通りです。

  • --cpu CPUのみを使用する
  • --learn 棋譜から学習する
  • --self コンソールで自己対戦を行う
  • --random ランダムに着手する
  • --quick 確率最大の手を選択する(探索しない)
  • --clean 最後まで打ち切る(探索ありの場合のみ)
  • --main_time=600 持ち時間 10分を設定
  • --byoyomi=10 秒読み 10秒を設定

4. GoGuiで対局する

学習をしていない人は、学習済みのデータファイルPyaq/pre_trainにあるmodel.ckptPyaq/にコピーしてください。

GoGuiを使ってGUIでの対局を行います。
メニュー>対局>碁盤サイズを「9」に設定した後、 メニュー>プログラム>新規プログラムから「コマンド」と「ワーキングディレクトリ」を登録します。

resister

起動したらGUIで対局することができます。 思考ログはメニュー>ツール>GTPシェルから見ることができます。

top

ライセンス

MITライセンス
Author: Yu Yamaguchi