今回は、やっと将棋所のデータで学習できたのでまとめておこうと思う。
floodgateの棋譜をダウンロードして使わせていただいていたが、
①優秀なソフトも利用できるので、対戦させてその棋譜で学習する。
②強化学習でどんどん強くする
ということをやってみたいということでやってみました。
やったこと
・棋譜をcsav2.2からv2に変更する
・Toryoで終了した棋譜のみにする
・学習する
・自己対戦で新たな棋譜を生成し学習する
・棋譜をcsav2.2からv2に変更する
まず、CSA標準棋譜というv2.2の標準棋譜が以下にある。
CSA標準棋譜ファイル形式
一方、以前のもの(v2)は以下のとおり
CSA標準棋譜ファイル形式
実際の将棋所の棋譜とFloodgateの棋譜を比較します。
V2.2
N+Gikou 2 (v2.0.2)
N-policy_player
P1-KY-KE-GI-KI-OU-KI-GI-KE-KY
P2 * -HI * * * * * -KA *
P3-FU-FU-FU-FU-FU-FU-FU-FU-FU
P4 * * * * * * * * *
P5 * * * * * * * * *
P6 * * * * * * * * *
P7+FU+FU+FU+FU+FU+FU+FU+FU+FU
P8 * +KA * * * * * +HI *
P9+KY+KE+GI+KI+OU+KI+GI+KE+KY
P+
P-
+
+6978KI,T1
-3334FU,T1
+2726FU,T1
-3142GI,T1
+3948GI,T1
...
-0082KA,T1
+7181UM,T1
%TORYO,T1
V2
N+3Aeval-Ryzen5-1600
N-sinbo-elmo
'Max_Moves:256
'Least_Time_Per_Move:0
'Increment:10
$EVENT:wdoor+floodgate-300-10F+3Aeval-Ryzen5-1600+sinbo-elmo+20171208180004
$START_TIME:2017/12/08 18:00:01
P1-KY-KE-GI-KI-OU-KI-GI-KE-KY
P2 * -HI * * * * * -KA *
P3-FU-FU-FU-FU-FU-FU-FU-FU-FU
P4 * * * * * * * * *
P5 * * * * * * * * *
P6 * * * * * * * * *
P7+FU+FU+FU+FU+FU+FU+FU+FU+FU
P8 * +KA * * * * * +HI *
P9+KY+KE+GI+KI+OU+KI+GI+KE+KY
+
'rating:3Aeval-Ryzen5-1600+65b01fc0c3f1f281715ac70adea53388:sinbo-elmo+b08e315e662fb441f32bee7d0f4966e7
'black_rate:3Aeval-Ryzen5-1600+65b01fc0c3f1f281715ac70adea53388:3977.0
'white_rate:sinbo-elmo+b08e315e662fb441f32bee7d0f4966e7:3582.0
+7776FU
T0
'** 0
-3334FU
T0
'** 0 +2726FU
+2726FU
T0
'** 0
-8384FU
T0
'** 0 +2625FU
+2625FU
T0
'** 0
-8485FU
T0
...
'** 100000 +0075KI
+0075KI
T0
'** 100000
%TORYO
'P1 * +GI-KA * * * -GI * -KY
'P2+KI * +NG * * * * * *
'P3 * -FU-KE-FU * * * * -FU
'P4-FU-OU * * * * +UM-FU *
'P5 * * +KI * -KE * * +FU *
'P6+FU * +KI * * +FU * * +FU
'P7 * +OU+KE * +FU * -TO * *
'P8 * * * +GI * * -RY * *
'P9+KY * * * * * * * +KY
'P+00FU00FU00FU00KI00KY
'P-00FU00FU00FU00FU00HI00KE
'-
'summary:toryo:3Aeval-Ryzen5-1600 win:sinbo-elmo lose
'$END_TIME:2017/12/08 18:23:52
v2.2からのv2への変換
上記の仕様と上記のそれぞれの内容を比較すると、v2.2からv2への変換は以下二つのことをすればよいことがわかる。
①v2にはP+,P-がない
②v2.2は+6978KI,T1と,区切りだが、v2では\nで改行されている
③'** 0 +2726FUのように’で始まるコメント行は無視されるので特に追加しない
つまり、上の①と②だけ変換すればよい
コード例は以下のとおり
dlShogi-kai/Data/convert2222.py
・Toryoで終了した棋譜のみにする
上記で変換はできるが、実は時々あのencoding errorが発生する。
それは時間切れで終了したり、300手で引き分けになった場合、%時間切れや%持将棋などが発生してこれがs-jis記載でencoding errorをだす。
ということで、そもそも%TORYOで終了したものを学習したいので、%TORYO以外の棋譜を削除した。
コード例は以下のとおり
dlShogi-kai/Data/filter_csa_toryo.py
・学習する
GikouD9, GikouD10で500回対戦(2min/battle)させて、またmctsで作成したものの棋譜などを1000個集めてtrain_policy_value.pyで学習させてみました。
結果は以下のとおり、
一見学習できているようにも見えますが、。。。
lossは減少してますし、policyは0.3辺りまで学習できていますが、valueが0.5のままで全く学習できていません。
この原因がどこにあるのかは今のところ全く不明です。
・自己対戦で新たな棋譜を生成し学習する
こっちはもっと悲惨です。
まだPlocyしか学習していませんが、Policyだと指し手が一意なのでバリエーションが全くでません。特に自己対戦では全く同じ手ばかりなので、これは学習のしようがないということです。ということで、一定の乱数要素を入れてMCTSで自己学習をやってみようと思います。
まとめ
・将棋所のデータで学習してみた
・今の方法では強化学習が成功する可能性が低い
・棋譜が読めるようになったので、将棋所(dlshogi)で詰将棋も出来そうな気がする