TadaoYamaokaの開発日記

個人開発しているスマホアプリや将棋AIの開発ネタを中心に書いていきます。

将棋でディープラーニングする その16(対局できるようにする)

教師ありで方策ネットワークを学習できたので、次に強化学習を試す予定であるが、強化学習を行うには自己対戦ができる必要がある。

そこで、動作確認も兼ねてUSIエンジンとして動かせるようにした。

USIエンジン化

GUIとして将棋所を使用しようとしたが、USIエンジンを登録する際にプログラムのパスを指定するが起動引数を渡せない。
これではPythonスクリプトが実行できない。
仕方ないので、中継用のC++のプログラムを作成し、C++からPythonのランタイムを動かすようにした。

対局

将棋所を使って動かしたところ、終局まで全て合法手を指したので驚いた。
人間(自分)との対戦では、見事に詰まされてしまった。
といっても自分の棋力は小学生並み(一応小学生で将棋クラブだった)なので、強いかの判断にはならない。

将棋プログラムとの対局

そこで、将棋プログラムの「やねうら王」と対戦させてみた。
f:id:TadaoYamaoka:20170515221313p:plain

評価値は「やねうら王」によるものを表示している。
27手目までは互角(やや優勢)に進んだが、そこから大崩れして負けてしまった。
学習しているのはfloodgateの2,116,546局面で、中盤以降の学習局面が圧倒的に不足しているので、局面を増やして学習が必要そうだ。

最後に詰みになる手を指して反則になったが、それまでは方策ネットワークの遷移確率が一番目の手が全て合法手であった。
合法手は入力特徴に入れていないが、うまく合法手を指すようになっているようだ。

終局判定

強化学習で自己対戦をするには、終局の判定をする必要があるが、探索が一切ないため、詰みかどうかは方策ネットワークでは判定できない。
また、形勢に大差がついた状態で学習を進めると善手であってもマイナスの報酬を学習してしまう。
そのため、対局途中の形勢を判断して大差がついた時点で勝敗を判定した方が良い。

USIエンジンを補助的に使う

そこで、従来型の将棋プログラムを補助的に使い、探索と評価関数で形勢を判断させるようにした。(上記の画面キャプチャでも「やねうら王」から評価値を取得している。)
一から将棋プログラムの探索部と評価関数を作るのは大変なので、バックグラウンドでUSIエンジンを動かして他の将棋プログラムに形勢判断をさせるようにする。

USIエンジンとの通信は、標準入力と標準出力をパイプでつなぎ、USIプロトコルでやり取りすることでできる。
局面の思考開始時に、position→goを指示してから、並行で方策ネットワークで推論を行い結果がでたら、USIエンジンの結果を取得する。

評価値がinfoコマンドで随時送られてきているので、標準出力から取り出し、最後のinfoコマンドの評価値を局面の評価値とする。

閾値判定

評価値が閾値を超えたら勝敗を判定する。
評価値と勝率の関係は、
https://twitter.com/issei_y/status/589642166818877440
によると
\displaystyle
\frac{1}{1 + \exp(\frac{-a}{600})}
で近似できるようなので、評価値aと勝率rの関係は、
\displaystyle
a = -600 \log(\frac{1}{r} - 1)
となるなので、勝率99%だと2757点、勝率90%だと1318点となる。
また、この勝率を報酬の割引率として使用するとよさそうだ。

次回は、AlphaGoの手法で自己対戦を行い強化学習を試す予定。

GitHubでソースを公開しています。
github.com

2017/5/16 追記

やねうら王に詰みの判定をさせて、詰みが見つかったらそれ以降はやねうら王に任せるようして、ちゃんと終局できるようにしました。
将棋所に付属のLesserkaiと対局させたところ、現状では五分五分の強さみたいです。
f:id:TadaoYamaoka:20170516222430p:plain
いつも序盤の形勢は上回っていて、負けるときは中盤以降で大駒を捨てて負けています。