AI🤖さん、こんにちは。

Python, Chainer, Dockerを使って、将棋AIのサンプルを動かしてみました。

Chainerとは、日本で生まれたディープラーニング向けのフレームワークです。Preferred Network社が開発しています。

今回、参考にした本は「将棋AIで学ぶディープラーニング」(マイナビ出版)になります。リンクは最後に貼りました。

インストール環境になります。

CPUx64命令互換64ビットCPU
GPUNVIDIA Geforce GTX 1060
OSHost: CentOS 7, Guest: Ubuntu16, 将棋所: Windows 10 Pro
インストール環境

ソフトウェアのバージョンです。

ソフトウェア名バージョン
AnacondaAnaconda3.8.3.0(64bit)
Python3.8.3
Cupy7.7.0
Chainer7.7.0
Docker19.03.12
ソフトウェアのバージョン

今回は方策ネットワーク(policy network)というニューラルネットワークを使って、ディープラーニングを行いました。

ポイントはDocker上にあるゲストのUbuntuからホストのGPUに接続する所でした。以下はゲストのUbuntuでホストのGPUの動作を確認した所になります。GPUを使うと学習時間が短縮できます。

$ nvidia-smi
Mon Aug 10 01:39:27 2020       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 450.57       Driver Version: 450.57       CUDA Version: 11.0     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  GeForce GTX 106...  Off  | 00000000:01:00.0  On |                  N/A |
|  0%   52C    P8    12W / 120W |    505MiB /  3016MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|    0   N/A  N/A      1562      G   /usr/bin/X                        227MiB |
|    0   N/A  N/A      2155      G   /usr/bin/gnome-shell               87MiB |
|    0   N/A  N/A      2924      G   ...AAAAAAAAA= --shared-files      184MiB |
+-----------------------------------------------------------------------------+

GPUが使えることを確認後、実際にChainerを使って、棋譜を学習させました。最初に訓練データの棋譜を1000件と、テストデータの棋譜を100件で作成した学習データです。

2020/08/11 12:35:33	INFO	read kifu start
2020/08/11 12:35:34	INFO	load train pickle
2020/08/11 12:35:34	INFO	load test pickle
2020/08/11 12:35:34	INFO	read kifu end
2020/08/11 12:35:34	INFO	train position num = 139865
2020/08/11 12:35:34	INFO	test position num = 14217
2020/08/11 12:35:34	INFO	start training
2020/08/11 12:35:38	INFO	epoch = 1, iteration = 100, loss = 7.650593, accuracy = 0.015625
2020/08/11 12:35:41	INFO	epoch = 1, iteration = 200, loss = 7.2174034, accuracy = 0.01171875
2020/08/11 12:35:44	INFO	epoch = 1, iteration = 300, loss = 6.744217, accuracy = 0.001953125
2020/08/11 12:35:47	INFO	epoch = 1, iteration = 400, loss = 6.6463594, accuracy = 0.005859375
2020/08/11 12:35:50	INFO	epoch = 1, iteration = 500, loss = 6.5667987, accuracy = 0.025390625
2020/08/11 12:35:53	INFO	epoch = 1, iteration = 600, loss = 6.5046926, accuracy = 0.0078125
2020/08/11 12:35:56	INFO	epoch = 1, iteration = 700, loss = 6.4815917, accuracy = 0.013671875
2020/08/11 12:35:59	INFO	epoch = 1, iteration = 800, loss = 6.450376, accuracy = 0.04296875
2020/08/11 12:36:02	INFO	epoch = 1, iteration = 900, loss = 6.433092, accuracy = 0.01171875
                       :

結果をグラフにしました。lossは損失、accuracyはテストデータとの一致率を示します。lossが下降して、accuracyが上昇しています。

訓練用棋譜データ1000件+テストデータ100件

次に2016年の80,141件の棋譜データから訓練用データとテストデータを作成して、学習した結果です。

2020/08/11 12:44:43	INFO	read kifu start
2020/08/11 12:45:17	INFO	load train pickle
2020/08/11 12:45:19	INFO	load test pickle
2020/08/11 12:45:19	INFO	read kifu end
2020/08/11 12:45:19	INFO	train position num = 3712656
2020/08/11 12:45:19	INFO	test position num = 413188
2020/08/11 12:45:19	INFO	start training
2020/08/11 12:45:27	INFO	epoch = 1, iteration = 100, loss = 7.6596613, accuracy = 0.013671875
2020/08/11 12:45:30	INFO	epoch = 1, iteration = 200, loss = 7.4310913, accuracy = 0.0078125
2020/08/11 12:45:33	INFO	epoch = 1, iteration = 300, loss = 6.857481, accuracy = 0.0078125
2020/08/11 12:45:36	INFO	epoch = 1, iteration = 400, loss = 6.6683636, accuracy = 0.013671875
2020/08/11 12:45:39	INFO	epoch = 1, iteration = 500, loss = 6.6142497, accuracy = 0.009765625
2020/08/11 12:45:42	INFO	epoch = 1, iteration = 600, loss = 6.5848265, accuracy = 0.029296875
2020/08/11 12:45:45	INFO	epoch = 1, iteration = 700, loss = 6.5157375, accuracy = 0.017578125
2020/08/11 12:45:48	INFO	epoch = 1, iteration = 800, loss = 6.528902, accuracy = 0.0234375
2020/08/11 12:45:51	INFO	epoch = 1, iteration = 900, loss = 6.433339, accuracy = 0.013671875
                       :

同じようにグラフにしました。

棋譜80,141件の棋譜データから訓練用データとテストデータを作成

学習した方策ネットワークを将棋所のソフトに組み込みます。

今日はここまでとなります。今後は、方策ネットワーク、価値ネットワーク、モンテカルロ木探索などのディープラーニングを使って、どの方法が強いか試してみたいと思います。

ゆくゆくは、「ラジコン DE 自動運転」の制御に応用できれば良いなぁと思っています!