続) 人間の棋譜を用いずに評価関数の学習

前回の続き。今回はリゼロ評価関数epoch 5,6。やねうら王のGitHubのほうには、すでにアップロードしてある。興味のある人は、使ってみて欲しい。

epoch 5

Apery(WCSC26) vs epoch 5。1スレ2秒、4秒。

T1,b2000,491 – 13 – 496(49.75% R-1.76) win black : white = 52.18% : 47.82% T1,b4000,488 – 28 – 484(50.21% R1.43) win black : white = 50.51% : 49.49%
前回からあまり伸びていない。楽観的に見てR30程度だろうか。

あと、浮かむ瀬ともやらせてみる。言うまでもなく浮かむ瀬とは半年前のSDT4(第4回 将棋電王トーナメント)で2位のソフトである。

浮かむ瀬 vs epoch 5
T1,b2000,695 – 15 – 290(70.56% R151.83) win black : white = 51.98% : 48.02% まだR150ぐらいの差があるようだが、次の目標としては良さそう。

ここまででプロの棋譜を用いずにApery(WCSC26)レベルの評価関数が作成出来ることは十分示せたと思うので、ここからは実験条件を色々変更しながら学習を続けることにする。(変更した条件については都度書いていく)

epoch 6

elmoの時代になってから棋力の計測を長い持ち時間でやらないと正確に出ないことがわかっているので長めで計測しているのだが、このため計算資源を相当に消費する。棋譜生成と学習より、この計測作業のほうが計算資源を消費するぐらいである。

だから、このへんからは教師局面を増やして学習を回したほうがトータルで早くなるはずである。

そこで今回は教師局面を20億局面生成して、学習に使う局面を5億、10億、20億と条件を変え、それぞれで差が出るかを調べた。ここでは、それぞれの評価関数をepoch 6-5 , epoch 6-10 , epoch 6-20と呼ぶことにする。

またいままでは1周だけの学習であったがepoch 6-5は4周、epoch 6-10は2周、epoch 6-20は1周回すことにした。こうしておくことでそれぞれの学習時間が同じになるし、また見かけの学習対象局面の数を揃えておくことで教師局面の多様性が棋力に及ぼす影響を純粋に計測することが出来るからである。

1スレッド1手2秒計測

浮かむ瀬 vs epoch 6-5
T1,b2000,688 – 13 – 299(69.71% R144.77) win black : white = 52.99% : 47.01%

浮かむ瀬 vs epoch 6-10
T1,b2000,670 – 20 – 310(68.37% R133.89) win black : white = 53.16% : 46.84%

浮かむ瀬 vs epoch 6-20
T1,b2000,637 – 16 – 347(64.74% R105.52) win black : white = 51.63% : 48.37%

教師局面数20億にしたものは、浮かむ瀬とR100程度の差となった。教師局面数がずいぶんと学習に影響を及ぼすこともよくわかった。

そして上のレーティングの上昇率から見ると20億局面でもまだ足りない気はしなくもない。棋力が低いうちは、5億局面程度で学習を回すのが有効であったが、このへんからは、20億局面以上を使うべきだろう。

なお、公開しているepoch 6は、上記のepoch 6-20である。

そして学習部のバグが見つかる

なんとこのタイミングで、ものすごいバグが見つかった!
玉が5筋のときのKKP、KPPの値がすべてゼロのままになっていた。Pが手駒のときも同じくゼロになっていた。

BonaPieceのミラー位置を求めるmir_piece()という関数を用意しているのだが、これの初期化のタイミングが悪かった。

修正commitがこれだ。1行入れ替えただけだ。
https://github.com/yaneurao/YaneuraOu/commit/dbe054308c03845533cd834683d6b2fe29c04f1e

よくこんな状態で浮かむ瀬とR100差のところまで来たなという感じであるな…。

ということは、このバグを修正して学習させると、この一連の記事に書いたより早いペースで強くなるということである。これは嬉しい誤算だ。

そんなわけで、とりあえず教師局面は生成せずに、epoch 6から、さきほど生成した20億局面でもう一度追加学習させてみた。(エコである)

しかし、ほとんど強くならなかった。よく考えてみると教師局面の生成のときに玉が5筋にいると評価値が0になっちゃうので教師局面の質自体に問題があるからか…。

epoch 6の棋風

epoch 6と技巧1と対局させてみたが、いまどきの(コンピューター将棋としては)普通の将棋っぽい気がする。epoch 1とか2のときのような異国情緒あふれる将棋とは違っていて(笑)、なんだか残念な気もする。

結局、KPPT型評価関数の表現限界から来る制約により、強くしていこうと思うと自ずと他のソフトと同じような形を好むようになるのかも知れない。だとすれば、elmoにしてもプロ棋士の棋譜の残滓など、元々何も残っていなかったという可能性もある。この仮説が正しいかどうかはこのあとの結果が教えてくれるだろう。

To Be Continued..

続) 人間の棋譜を用いずに評価関数の学習” への10件のコメント

  1. 技巧の2駒評価関数の限界が技巧2で、KPPT型評価関数の限界がelmoだとした場合両者の差はR200くらいになると思うのですが、この程度の差しか出ないものなのでしょうか?

  2. 教師局面とレートの関係。長年の疑問だったのでデータ大変ありがたいです。5億では足りない説は本当にありがたくないですが……

    良ければ教えて欲しいことがひとつあります。20億と5億とでは最終的な誤差の大きさに違いはありますか?

    もし違いある、かつ、特定の場所で急激に誤差が減るなら鞍点に引っ掛かってる可能性があります。その場合はadagradをadamにする、勾配にランダムノイズを足すなどが解決策になり得ると思います。

    • > 20億と5億とでは最終的な誤差の大きさに違いはありますか?

      学習時には
      tce(train cross entropy : test dataに対するcross entropy)
      lce(learn cross entropy : 学習データに対するcross entropy)
      のみ計測してます。

      最終的なtceは、綺麗に20億 < 10億 < 5億 の関係があって20億局面が最も下がっています。また、tce、lceともにいずれのケースもそこそこ綺麗に減衰しています。ただし、10億局面を2周回す場合は、lceのほうはノコギリみたいな山が2つありますし、5億局面4周する場合はlceのほうはノコギリみたいな山が4つありますが、tceはほとんど振幅はないですね。鞍点に引っかかっている可能性はないと思っています。次元数がこんなにあればそう簡単に鞍点は存在できないのではないかと思っています。ちなみに教師局面データは、完全シャッフルしてます。これ何気に重要です。なぜなら、文字数

  3. コメントありがとうございます。先の話題と少し変わりますが、もうひとつ質問です。

    局面生成のとき、depthをランダムにできる仕様(gensfenのdepth2オプション)になっていますが、現状だと局面ごとにdepthがランダムになるようになってますが、対局の勝率をみる上では対局単位では固定した方がよいと思います。そうしないと終盤で深く読むかが響きすぎると思います(rtimeの時に同じことを議論してたような)

  4. 個人的に今年の内は将棋AIで遊べないので、自分のアイデアをもしよかったら試していただけたら嬉しいです。実装してみる価値がありそうかだけ意見を聞けたら嬉しいです。

    ①スライド絞り
    置換絞りは、天才やねさんがやめたというので、スライド絞りは更に効果が薄いかもしれませんが…
    でも、メリットはちゃんとあります。
    1.学習用局面を大量に生成出来る
    2.似たような局面の僅かな違いに敏感になる(かもしれない)
    方法は簡単。教師局面から一部の駒をスライドしてelmo絞りするだけ

    もう1つ学習用アイデアがあります。

    ②メタ駒関係
    ある駒関係が存在する時、別のある駒関係があるかどうかが勝率にどの程度影響するかを使って絞ります。
    駒関係の評価の後に、メタ駒関係によって学習させた関係相性を使って評価値を補正します。
    四駒関係より手軽。

    実験結果がリセットになったということは、つまりまだまだ伸びる余地があるということですね。期待が膨らみます。
    三駒関係の限界が近づいてきて似たような将棋になってしまっているのだとしたら少し残念な気もしますけれど、この先の成果を楽しみに待たせていただきます。

    • > ①スライド絞り

      駒をスライドさせた局面が現実的に出現しうる確率の多寡が問題になるのでは。実現可能性が高い局面において、その特徴因子が出現したときの勝率の予測がしたいわけで…。

      > ②メタ駒関係
      > ある駒関係が存在する時、別のある駒関係があるかどうかが勝率にどの程度影響するかを使って絞ります。

      それどうやって検出するんでしょう?KPP × KPPって単純にやると5駒関係のように聞こえるんですけども…。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です