#最初に
コードはここには書かないのでこのリンクを参照していただきたい。
https://github.com/AokiMasataka/AlphaZero
環境
windows10
python 3.7
tensorflow 1.12
keras 2.2.4
CPU i7 7700
メモリ 16GB
GPU GTX1070
モンテカルロやデュアルネットワークなどは、探索回数や畳み込みフィルターの枚数を減らして実装していたり、その他諸々省いていたりしているが悪しからず。
参考:
https://www.amazon.co.jp/AlphaZero-深層学習・強化学習・探索-人工知能プログラミング実践入門-布留川-英一/dp/4862464505
https://www.amazon.co.jp/最強囲碁AI-アルファ碁-アルファ碁ゼロ対応-深層学習、モンテカルロ木探索、強化学習から見たその仕組み-TECHNOLOGY/dp/4798157775/ref=pd_lpo_14_t_2/356-1858719-2898113?_encoding=UTF8&pd_rd_i=4798157775&pd_rd_r=1f8e06c7-6fac-4a9c-8129-208fc49fcc60&pd_rd_w=AKVsz&pd_rd_wg=BcevS&pf_rd_p=4b55d259-ebf0-4306-905a-7762d1b93740&pf_rd_r=NEM5B7FTTXX3G5G8SBJN&psc=1&refRID=NEM5B7FTTXX3G5G8SBJN
#実装
##model.py
このファイルにはデュアルネットワークのインスタンスを生成するModelクラスを入れている。
デュアルネットは、3層畳み込みレイヤーのボトルネック型のレズデュアルブロックを8層重ねPolicy、Valueの二つの出力へ続けている。
ブロックの数とフィルターの枚数はconfig.pyで変更できるのでPCスペックに応じて調整していただきたい。
##game.py
今回は6x6オセロで実装しているが、将棋やチェスなどのボードゲームでもニューラルネットの入出力サイズを変更するだけで動くはず。多分…
##game_c.pyx
実行速度を上げるためにcythonバージョンで書いてあり、コンパイルしてMCTS.py, main.py, self_play.pyのimportを
from game_c import Game
に書き換えることで自己対戦の速度を1.2倍くらいにできる。
##config.py
アルゴリズムに影響する各種パラメーターを記述している。
学習速度が遅いと感じたら、SARCH_NUMを160から80くらいに減らすと学習がスムーズになる。
##self_play.py
自己対戦によるデータ生成とモデルの評価などを行う。
なるべく同じような局面にならないように、最初の数手は完全にランダムな手を打つようにしている。
##MCTS.py
選択可能なアクションなど現在の盤面の状態を入れるNodeクラスと、
そのNodeを広げて探索を行うMCTSクラスが入っている。
デュアルネットワークを使用したモンテカルロ探索の具体的な解説はhttps://postd.cc/alphago-zero-how-and-why-it-works/
こちらがわかりやすく説明してある。
##main.py
Mainクラスでは学習を進めるtrainメソッドがあり、その際生成した学習データをdataフォルダに、モデルをmodelフォルダに保存する。
##play.py
学習したAIと対戦することができる。playインスタンスを生成するときの引数で対戦するAIの世代の選択が可能。
GUIを練習がてら実装したが、バグが大量にあり尚且つかなり使いにくくなってしまった。
修正する予定はないです。MACで起動するとtkinterライブラリのせいで落ちてしまうので悪しからず
#学習結果、学習したAIと戦った感想
自己対戦による学習データ生成→対戦データの学習→一つ前の世代との対戦(評価)の流れを一つのサイクルとし、最終的に14世代まで学習を進め、そのAIと実際に対局し評価した。
結果として5世代目で完全に歯が立たなくなり、それ以降は自分自身の実力では勝率0%なので、AIの評価ができなっかた。一応世代を進めるには一つ前の世代に52%の勝率を出さないといけないので、確実に強くはなっているはずである。
当初は、AIを実装するにあたって「自分と同じくらいの実力程度になればいいか」ぐらいに思っていたので、正直その成長速度には驚かされた。