学習中に生成した棋譜の分析

要約

 生成している学習データの質が悪い可能性がある。質を高めていくために(1)価値を考慮した行動選択 (2)c_{puct}の調整 (3)リプレイバッファサイズの調整 などを考えていきたい。

実験

 前回1Mステップの学習を行ったが、まだ収束していないようにも思えたので2Mステップの学習をランダム初期化した(前回とは異なる)パラメータから行った。

 検証損失推移

f:id:tokumini:20190712100644p:plain

 技巧2(深さ8)と1手0.25秒で500局対局を行った結果

f:id:tokumini:20190714104648p:plain

 1Mステップ時点でR2600前後という結果は前回得られた結果とほぼ同等である。今まで実験していた結果からしても、試行による最終的な棋力のバラつきはあまりないように感じられる。これはScience版AlphaZero論文でも似たようなことが主張されている。

f:id:tokumini:20190712101139p:plain

 ここから本題として、上記の学習を行う際に、生成した対局を500局に1局の間隔で保存した。学習データの質を確認するため、保存された棋譜4611局について簡単な分析を行った。

手数の統計情報

項目
平均 75.5
中央値 74
最小値 317
最小値 14

 全対局詰みまで指しているにも関わらず平均手数は短い。また512手に到達した場合は引き分けとしているのだがそこまで到達する対局が存在していない点も気にかかる。千日手による引き分けは実装していない(ノイズによって同一局面でも指し手がバラつくと考えている)のだが、ここまで長手数にならないものか。

 一番気になる14手で終わった対局は次のようなものであった。

f:id:tokumini:20190711202014p:plain

 他にも30手以内で終わっているものを何局か見たところ、どうも上と同じように▲6八玉▲7七角▲7八銀の形で△7七角成と取られた場合に▲7九玉と逃げて頓死するパターンがあるようだった。12手目△7七角成とした局面について2Mステップ時点のパラメータを用いて800回の探索をさせたところ

指し手 ニューラルネットの出力方策 探索回数による方策 行動価値
▲同銀 91.7% 98.6% +0.047
▲同桂 1.7% 0.2% -0.200
▲同玉 1.4% 0.2% -0.156
▲5八玉 3.6% 0.6% -0.960
▲7九玉 1.7% 0.6% -0.977

となった。▲5八玉と▲7九玉を合わせた1.2%の確率でまともな将棋にならないと考えるとなかなかなものである。ディリクレノイズがない状態でこれなので実際はもう少し高い確率でダメになっていてもおかしくはない。

 他の状況での角交換に対しては角を取り返す手で100%占められる場合が多かったが、場合によっては角を取り返さない手にも探索が割り当てられる場合もあった。

f:id:tokumini:20190714120155p:plain
検討欄左から2列目がニューラルネットの出力方策、3列目が探索結果の方策。▲6九玉に0.1%の確率が生じている

 これは右辺の形が多少異なっていても同様であった。興味深い点としては▲6八銀と上がっている場合には▲同銀が100%となるようだった。

f:id:tokumini:20190714121234p:plain

 王手であるかどうかによって合法手の数が大きく変わることが影響しているのかもしれない。感覚的には合法手が少ないほうが学習しやすいのではないかと思われるのだが、合法手が少ないと悪手も探索され教師分布にずっと確率が残ってしまうのだろうか。

 原因はともかく、あまりにも行動価値が低い手は選択しない方が良いと考えられる。そのような方法としては

  1. 最良の行動価値より一定以上価値が低い行動の選択確率を0にする
  2. 行動選択に利用する分布を行動価値にソフトマックス関数を適用したものにする

などが考えられる。「方策=行動価値にソフトマックス関数をかけたもの」とすることは、たとえば芝浦将棋Softmaxが行っている。また、行動価値ではなくアドバンテージ(状態価値と行動価値の差分)についてはよくわかってはいないが理論的などうのこうのがあるらしい。

Evaluation Curve

 上の結果から悪手が混じっている割合が多く、評価値と最終的な勝率が乖離してしまっているのではないかと考えた。よってevaluation curve(各評価値における先手から見た最終的な勝率)を描画してみることにした。評価値は[-1,1]を1000倍した[-1000, 1000]で出力しており、それを50ごとに40区間へ分割して各区間での最終的な勝率を集計した結果が次のようになる。

f:id:tokumini:20190712102225p:plain

 状態価値(つまり収益の期待値であり、適切に線形変換すれば勝率になる)として学習をしているため線形のようになることは正常であり、特に変ではないと思われる。

評価値差分の絶対値

 統計的には評価値通りの勝率になっているが、評価値がなだらかに推移していない可能性があると考えた。1手先の評価値との差分の絶対値について50間隔で分類して出現割合をプロットした。

f:id:tokumini:20190712172703p:plain

 グラフの推移からすると750から1000あたりの割合がやや多めに思える。先に挙げた頓死のように0付近から-1000付近へ遷移する悪手が多いのかもしれない。比較対象がないのでこれがまずい数なのかがよくわからないが、雑に読み取ると0.1%ほどの確率で1000点以上の変動が起きると考えられる。1000手に1手、つまり13局に1回ほどの割合で大悪手が発生しているとなると多いようにも感じられる。

各段階での指し手の傾向

 趣向を変えて指し手の傾向についての推移を調べた。4611局を学習の進行に応じて40段階(各115局)に分けてそれぞれで初手の割合をプロットしたものが次となる。

f:id:tokumini:20190712140047p:plain

 早い段階で▲2六歩や▲7八金などが多くなっており、居飛車っぽい将棋をすぐ学習しているのではないかと思われる。一方で全体的にどれか一つに指し手が偏っているように見える。偏る指し手は変わっているのでノイズが小さいということでもなく、どちらかといえばc_{puct}が小さすぎるということなのだろうか。根拠のない勘としては、もう少しなだらかに指し手の割合が変化していった方が良いのではないかと感じられる。リプレイバッファが小さすぎて同じようなデータばかり学習している可能性もあるかもしれない。

 他にも行った方が面白そうな解析案があれば教えていただけると気分次第でやったりやらなかったりします。