評価関数のキメラ化コマンド公開しました

『Shivoray』(全自動雑巾絞り機)以降、誰でも評価関数を自分で育成することが出来るようになった。教師局面の生成に用いる定跡を変えることで異なった進化を遂げることも徐々に明らかになってきた。今回はこの流れを加速すべく、キメラ化コマンドを公開することにした。

実はコマンド自体はずっと以前からある。こんなもの何の役に立つものかと思い、一般公開していなかっただけである。

(YaneuraOu-2017-early.exeをダブルクリックして実行したのちに使うコマンド。このコマンドを使うためにはEVAL_LEARNをdefineしてコンパイルした実行ファイルでなければならない。トーナメントモード用はNG。それ以外ならOk.)
test evalmerge [EVAL_DIR1] [EVAL_DIR2] [OUTPUT_DIR] [パーセント]

というコマンドで、評価関数を2つ用意して、EVAL_DIR1フォルダとEVAL_DIR2フォルダにぶち込む。そうするとOUTPUT_DIRにその2つの評価関数が合成されたものが書き出される。このときにパーセントを指定できる。20と指定すると、各パラメーターがEVAL_DIR1が20%、EVAL_DIR2が80%というように按分されてOUTPUT_DIRに書き出される。わかりやすく言うとそれぞれの血筋をどれくらいずつ受け継ぐかがこのパラメーターである。

このキメラ化コマンドにより、親の2つの評価関数の特徴を兼ね備えた新しい評価関数が一発で出来る…はずである。ただ、本当にそうなるのか、それともこれは机上の空論なのかは私も調べていないので知らない。

そもそも以前はそんなに棋風の異なる評価関数ファイルが手元になかったし、棋風が評価関数ファイルでここまで変わるというのが証明されたのは、リゼロ以降ではないかと思う。様々な棋風の評価関数ファイルが誕生したいまこそ、キメラ化コマンドが真価を発揮するのだ。(と信じている)

一つだけ面白いテクニックを紹介しておくと、ここで指定するパーセントは、0〜100のみならず、-10とか110とかを指定できるわけである。あまり極端な値にするとオーバーフローするし、パーセントの範囲チェックをしてないだけとも言えるが、一応は意図した動作である。

数学の用語で前者を内挿、後者を外挿と呼ぶ。二つの評価関数から外挿を用いて新しい評価関数を生成したときにどういう挙動の評価関数が出来るであろうか?例えば、この値に200(200%の意味)を指定すると、前者の評価関数が好きだった戦型はさらに好きになり(値が2倍になるので)、後者の評価関数が好きだった戦型はかなり嫌いになる(値を-1倍して足す = 値を引いていることになるので)、みたいな作用があるはずだ。本当にそうなるかは知らんが…。コメント欄でレポートなどお待ちしております。


評価関数のキメラ化コマンド公開しました” への11件のコメント

  1. 例えば、epoch 7と8の差分を取って、その半分とか5分の1だけ8に加えるにはどうすれば…

    出来上がり状態から逆にたどれば2回の操作で可能ですかね。
    レイトン教授の○リットルの水を入れなさい問題より簡単か…

  2. 3億局面でelmoと互角になった手法「無限絞り」を報告します。

    4つの定跡を用いてランダムムーブ無しの教師局面を生成しました。
    ①最も勝率の高い定跡局面25%
    ②広い局面の定跡局面25%
    ③相掛かり定跡局面25%
    ④横歩取り定跡局面15%
    残りの10%は各定跡のConsiderBookMoveCountを切って、類似局面の採用率の低い将棋ソフトが間違いやすい局面を任意で生成。

    これらをシャッフル後にepoch0で学習すると、シャッフルによってエントロピーロスが結構違うことを発見。
    ロスが大きい評価関数と小さい評価関数のどっちが強いか実験中に「同じ教師局面なのにこれだけ性質が違うなら何回も使える?」
    1回目絞る→強くなった評価関数→同じ教師局面シャッフル→2回目絞る→強くなった評価関数→同じ教師局面シャッフル→3回目絞る→強くなった評価関数→同じ教師局面シャッフル→4回目絞る→満足行くまでループ。

    とりあえず一番時間がかかっていた教師局面生成部の計算リソースの大幅な削減が出来るのではないでしょうか?
    おそらく大別する4種類の違う性質を持つ教師局面の勝ちと負けの8種類の組み合わせを、シャッフルの偶然的確率で様々な訓練データ(ミニバッチ)に変質出来たことで同じ教師局面が再利用が出来たのだと思います。

    私は定跡を駆使しましたが、性質の違う教師局面を用意出来れば多少なり効果が見込めると思うので、
    rezero=1億局面
    tanuki-wcsc27=1億局面
    Qhapaq-wcsc27=1億局面
    Yomita-wcsc27=1億局面
    こんな組み合わせでも出来るのではないでしょうか?

    さらにrezero+tanuki-+Qhapaq+Yomitaをキメラしたものから絞れば効率的では?

    やね氏が寝る前にボタン1つでループ学習してくれる全自動学習機を作成してくれるでしょう。
    ※なんとなくですが、シャッフルした教師局面をさらにシャッフルすると混ざりが良くなりすぎる気がしたので、最初に生成した教師局面を毎回シャッフル使用しました
    ※lambdaもいろいろ変えてみましたが、0.33が安定していました(変えるとあきらかに弱くなったこともあるので、逆に良くなることもあるかも)
    ※batchsizeはいろいろ変えました
    ※私は出来ませんが、最後は出来た評価関数から多くの教師局面でその評価関数の高い勝率に固めて仕上げすることが望ましいと思います。

      • uuunuuun氏にレート計測を依頼してみました。

        私がelmoと対局させた棋譜を見た感想ですが、、
        ①駒割がすごくおかしくて、駒交換が起きる局面だとかなり不利
        ②定跡学習したからか、定跡抜けるとelmoと常に評価値300くらいの差がある(自分が良いと言っている。勝敗ボーナスが大きく付いた?)
        ③桂馬をあまり使わない(歩に余裕があると歩を打って3筋と7筋を閉じてしまう。相掛かり比率が高かったので角道を閉じた局面を学習しすぎた?)
        ④elmoに反省させられると逆転出来ない(教師局面数が少ないからかelmo比で粘りが無い。自分が不利になるとすぐあきらめる子供のようだ)
        ⑤終盤力が低い(教師局面数が少ないからか、とんでもない読み抜けをすることがある)

        いろいろ問題山積みな評価関数ですが、自己対局ではelmoに半分くらい勝ってます。
        単純にまだ先がある感じです。

          • 将棋ソフト開発者にとっては、すごい大発見をしました。
            一般の人には関係ない発見なので、TwitterのDMに詳細は送りますね。
            私の定跡配布しているGitに私が作った評価関数とelmo評価関数の対局した棋譜をいくつか添付してますので、それ見てから読んで頂けたらと思います。

  3. ちょうど、評価関数4つでmedian(中央値)したら面白そうだなと思っていたところです。

コメントを残す

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