たどり来て、未だ山麓

過去記事で機械学習をやっているわけですが、

 ▶将棋を「ディープラーニング」してみた
 ▶藤井聡太 七段っぽい評価関数が出来た
 ▶AIは人間に近づけるか

いよいよ見たこともない新手が出てきたようです。

結果から言えばすさまじく強くなりました。

2018-06-28_083901.png


現在トップレートの「Godwhale5.0.5/QQR」
6コア3.5秒のuuunuuunさん基準として100局
中、終盤はNNUEのほうが強すぎるので「投了値600」

勝率77%なのでレーティング+210となります。

先月トップレートを更新した相手に
いきなりぶっ飛んだ勝率が出ました。

棋譜を掲載しようと思いましたが、
下記のように新手がかなり見られるので、
諸事情により未掲載とさせて頂きます。


【横歩取り青野流への後手対策】

評価値グラフを見て頂ければわかるように、
先手QQRがプラス評価でやってきましたが、
こちらはほぼ後手良しの評価値で押し切っています。

2018-06-28_203659.png

2018-06-28_203933.png


【角換わり、腰掛け銀同型】

評価値グラフを見て頂くと
千日手も見えてくる人気の戦型なのに、
一方的に倒していることがわかると思います。

2018-06-28_204202.png

2018-06-28_204338.png


代わりにこの評価関数を作成した学習方法を書いておきます。

教師局面生成


前回「不足していた教師局面」があるとして、
その学習方法を書いたがその補足。

「大駒が相手陣へ突破する局面」が学習出来ていないとして、
以下コマンドで教師局面を生成した。

depth 10
random_move_count 0
write_minply 9
write_maxply 160
eval_limit 3000


1)depth 10
depth 8だとブレが4%程度あるのに対して、
depth 10はブレが2%程度と精度が高いから。

2)write_minply 9
トップレートであるQQRがレーティング計測の
1手1500万局面程度(uuunuuunさん基準)の場合に、
先手で「横歩取り青野流」を多用して勝率を稼いでくるので、
序盤を学習対象にした。
(序盤を学習すると勝率は高くなるが、局面のばらつきが悪くなるので本当は学習対象にしたくない※学習せずに定跡で制御すべきだと考えている)

3)eval_limit 3000
「大駒が相手陣へ突破することが良いことだ」とAIが学習するには、
相手陣で飛車+角の成駒が暴れまわっている局面が必要と考え、
調べると評価値1000~3000の局面が良いことがわかったから。

4)write_maxply 160
「depth 10」+「eval_limit 3000」の場合は、
160手引き分け程度が「勝敗項」が上手く付くことがわかったから。

NNUE学習の問題点


ここに書いているのは、現在私が取り組んでいる学習上の問題と思われるヶ所。

1)理屈はわからないが重複局面を弾かない
 KPPT型の「やねうら王学習部」では上記のように教師局面を生成した場合、
約30%程度重複局面が発生するが、学習時に弾いてくれる。
(depth 10で指し手が狭くなってくる+random_move_count 0)
これに対してNNUE型の学習部は、たぶんデフォルトの16手目までは弾くが
重複局面をほぼそのまま学習対象としてしまっている。

※たぶんKPPT型と同じ感覚で学習してると過学習しまくって失敗すると思う

NNUEの学習


NNUE学習の問題点に対するアプローチ

1)nn_batch_size を大きくとる
2)互角局面等を使って教師生成する
3)ランダムムーブを使う
4)生成した教師局面を全部使わずに運にまかせる

実際私がやったのは「4」です。

自前PCの物理メモリ的に「nn_batch_size」を大きく出来なかった。
ランダムムーブは使いたくなかった。
互角局面等よりも、レートが上がった「depth 10」でやってみたかった。

これらの理由から
30%程度に重複局面があるなら、生成した40%程度ずつ学習するを選択しました。


【以下手順】

1億局面の教師局面を生成した。

4000万局面ずつ学習した。

1回の学習で8個の評価関数を作成し、
トーナメント方式で競わせ、優勝したものをepoch2とする。
これを3セット繰り返した。


実際やったことはこれだけなので、
みなさまも挑戦してみてはいかがでしょうか。

この記事へのコメント

スポンサーリンク