機械学習知識ゼロの囲碁キチが3か月で囲碁AIを作った話　～棋譜学習編～

## **前回まで**
[機械学習知識ゼロの囲碁キチが3か月で囲碁AIを作った話 ～概要編～](https://qiita.com/intenseG/items/2fe5f867b0afe439fc6b)

[機械学習知識ゼロの囲碁キチが3か月で囲碁AIを作った話 ～導入編～](https://qiita.com/intenseG/items/34b452cbab04817cdaef)

## **概要**
今回は、[囲碁AI「AQ」を開発してるすごい人](https://github.com/ymgaq)が作った[Pyaq](https://github.com/intenseG/Pyaq)を使って9路盤の棋譜を学習していきます。

## **手順**
1. 囲碁AI作成キット「Pyaq」をダウンロード
2. 9路盤の棋譜データを大量ダウンロード
3. 棋譜学習開始
4. 自己対戦させてみる

## **囲碁AI作成キット「Pyaq」のダウンロード**
まず、囲碁AIを作るには優れたプログラムが必要です。

え？ハードルが高すぎる？

そんなあなたに、囲碁AI作成キット「Pyaq」がおすすめです！~~通販か！~~

[囲碁AI作成キット「Pyaq」のダウンロード](https://github.com/intenseG/Pyaq)

リンク先のページに飛んだら、**Clone or download → Download ZIP**の順にクリックしてダウンロード。(git cloneでもOK)

zipファイルを解凍してフォルダが表示されたら、フォルダ名を「Pyaq」に変更しておいてください。

また、Pyaqフォルダの中に「sgf」という名前で空のフォルダを作っておきましょう。(後で使います)

Pyaqフォルダは任意の場所に移動してもらって構いません。

## **学習用の棋譜データを大量ダウンロード**
それでは次は、囲碁AIに学習させる9路盤の棋譜データを大量に集めていきましょう。

9路盤の棋譜データは、以下のリンク先ページの「4 Aya's selfplay games ...」「7 CGOS dataset」「10 Minigo dataset」からダウンロードすることができます。

[棋譜ダウンロードページ](https://github.com/yenw/computer-go-dataset)

棋譜データ数は、できれば5万以上欲しいところですが学習時間がかなり長くなってしまうため、最初は1000局分くらいでやってみるのがいいと思います。

ダウンロードした棋譜は、すべてPyaqフォルダの中に作っておいたsgfフォルダに入れます。

※一度に多くのファイルを移動しようとするとパソコンが固まる可能性があります。小分けにして移動すればそれを回避できます。

## **棋譜学習開始**
ここまで出来たら、学習に必要なものは全て揃いました！

それでは、AnacondaPromptを立ち上げてください。

立ち上がったら以下のコマンドでPyaqのフォルダに移動します。

```Console:AnacondaPrompt
$ cd <Pyaqフォルダまでのパス>\Pyaq
```

そして次のコマンドを実行することで学習が開始されます！

```Console:AnacondaPrompt
$ python pyaq.py --learn --cpu
```

GPUを使って学習させる場合はこちら

```Console:AnacondaPrompt
$ python pyaq.py --learn
```

学習が始まると、以下のように学習が0.1%進むごとにログが出力されます。

```
imported 49901 sgf files.
converting ...
learning rate=0.0003
progress: 0.10[%] 21.4[sec]
progress: 0.20[%] 20.2[sec]
progress: 0.30[%] 20.2[sec]
progress: 0.40[%] 20.3[sec]
progress: 0.50[%] 20.2[sec]
progress: 0.60[%] 20.2[sec]
progress: 0.70[%] 20.2[sec]
progress: 0.80[%] 20.2[sec]
progress: 0.90[%] 20.2[sec]
progress: 1.00[%] 20.2[sec]
progress: 1.10[%] 20.2[sec]
progress: 1.20[%] 20.2[sec]
progress: 1.30[%] 20.2[sec]
progress: 1.40[%] 20.2[sec]
progress: 1.50[%] 20.2[sec]
progress: 1.60[%] 20.2[sec]
progress: 1.70[%] 20.2[sec]
progress: 1.80[%] 20.2[sec]
progress: 1.90[%] 20.2[sec]
progress: 2.00[%] 20.2[sec]
progress: 2.10[%] 20.2[sec]
progress: 2.20[%] 20.2[sec]
progress: 2.30[%] 20.2[sec]
progress: 2.40[%] 20.2[sec]
progress: 2.50[%] 20.2[sec]
train: policy=48.87[%]  value=0.473
test : policy=48.11[%]  value=0.486
```

> 2.5%ごとにtestデータの評価を行います。 policyは棋譜の次の手とニューラルネットワークが出力する手との一致率、valueは棋譜の勝敗とネットワークが出力する評価値（-1~+1）の誤差（Mean Squared Error）を表します。 最終的に、testデータでpolicyが57%、valueが0.36程度になるようです。

学習ログの詳細についてはPyaqのGitHubページから引用させて頂きました。

学習が完了すると、あなたの囲碁AIのパラメータファイル```model.ckpt```がPyaqフォルダに保存されます。

それでは次のステップでちゃんと動くかどうかの確認を兼ねて自己対戦をさせてみます。

## **自己対戦させてみる**
AnacondaPromptで以下のコマンドを実行すれば1手3秒で対局が自動的に進行します。

```Console:AnacondaPrompt
$ python pyaq.py --self --byoyomi=3 --cpu
```

GPUを使って自己対戦させる場合はこちら

```Console:AnacondaPrompt
$ python pyaq.py --self --byoyomi=3
```

100手くらいで終局して、最後に結果が出力されればOKです！

今回はここまで。

次回は、グラフィカルな囲碁ソフトに自分の作った囲碁AIをセッティングして動かすところを解説していこうと思います！

## **次回**
[機械学習知識ゼロの囲碁キチが3か月で囲碁AIを作った話 ～GUI編～](https://qiita.com/intenseG/items/37a90b940a48acc65bd3)

## **参考リンク**
- [Pyaq](https://github.com/intenseG/Pyaq)
- [棋譜ダウンロードページ](https://github.com/yenw/computer-go-dataset)