REsolve MUtationエンジンの使い方

ゼロから始める評価関数分解のやり方紹介です。

githubのドキュメントがあまりに貧弱すぎたので、幾つかの具体例を以って使い方をもう少し細かく解説したいと思います。

 

注:この関数がパクリじゃないか的な議論をするためにREMUを使うことは推奨しません。また、私自身がそういった用途での解析に協力することもありません。KPPTという同じ評価軸を使ってる以上、強い関数がある程度似るは仕方がないことですし、ちょっと数理を理解してる人ならバレないように関数をコピペすることは容易だからです。

 

本体:

Release 評価関数分解機 REsouve MUtationエンジン · qhapaq-49/qhapaq-bin · GitHub

sseバージョンも作りました

https://t.co/6I2Sypa5nC

 

1.評価関数フォルダと実行ファイルを揃える

YaneuraOuが置かれているフォルダと同じフォルダに評価関数を並べます。このとき、evalフォルダにダミーのKPPT評価関数を置くようにしてください。これをやらないと、コマンド実行直後に「open evaluation file failed」というコメントが出て計算に失敗します。

 

f:id:qhapaq:20170717001919p:plain

こんな感じ(binディレクトリの上半分しか写ってませんが、下にはYaneuraOu-by-gcc-remu.exeが居ます)

 

2.evalresolveコマンドを実行する

例えば

test evalresolve elmo_ep8_55 elmo epoch8

と打ち込んでみましょう。elmo_ep8_55はelmoとリゼロepoch8を5:5で混ぜた関数です。このコマンドはelmo_ep8_55をelmoとepoch8で分解するという意味です。

 

3.解析結果を読み解く

出力結果一例(evalフォルダにはwcsc27のqhapaqの評価関数が入ってます)

 

test evalresolve elmo_ep8_55 elmo epoch8
info string Eval Check Sum = 702fb2ee5672156 , Eval File = Qhapaq(WCSC27)
REsolve MUtation engine target = elmo_ep8_55, reference = elmo,epoch8,
prodmatrix
7.60975e+13,1.06684e+13,
1.06684e+13,2.91226e+13,
converge in 5 loop
result : elmo_ep8_55 = 0.49981 x elmo + 0.499613 x epoch8 + 0.00111753(diff ratio)

 

解析結果は最後の行です。

elmo_ep8_55 = 0.49981 x elmo + 0.499613 x epoch8 + 0.00111753(diff ratio) とは

「elmo_ep8_55の評価関数はelmoを0.49981倍したものと、epoch8を0.499613倍したものに、0.00111753 x 未知の関数(雑に言えば、学習によって生じた差分)を加えたもの」という意味です。

未知の関数の大きさ(KPPTのパラメタの2乗和)は解析元の評価関数(例の場合は、elmo_ep8_55の2乗和)に等しいです。今回はelmoとepoch8を混ぜただけの関数なのでdiff ratioは極めて小さい値になっています。やねうら王を使った単純な合成を施した関数であれば、個数や割合が未知であっても大体分解できます。分解元の評価関数に漏れがなければ、diff ratioが極めて小さい値になるかと思います。

評価関数の合成し過ぎで迷子になった時にお使いいただければ幸いです。

 

4.学習の効果を可視化する

wcsc27のqhapaqを分解してみます

test evalresolve qheval-wcsc27 elmo epoch8

qheval-wcsc27 = 0.865984 x elmo + 0.0192829 x epoch8 + 0.311523(diff ratio)

qhapaqとelmoの内積は割と大きいです。どちらも浮かむ瀬を元にしているからでしょう。

 

これにelmo絞りを加えるとこうなります(この関数は公開してないです)。

test evalresolve 0621-yz elmo epoch8

0621-yz = 0.860074 x elmo + 0.0660107 x epoch8 + 0.403802(diff ratio)

ちょっとepoch8の要素が増えるのと同時に、何らかの差分が加わっているように見えます。

リファレンスにqhapaqを加えて再分解

test evalresolve 0621-yz elmo epoch8 qheval-wcsc27

result : 0621-yz = 0.0249868 x elmo + 0.0474157 x epoch8 + 0.964326 x qheval-wcsc27 + 0.282281(diff ratio)

どうやらqhapaqに何らかのdiffが加わった形とするほうがより正確なようです(qhapaqの成分があんまり減ってなくて驚いた)。この関数のレートはelmoと同じぐらいなのですが、どうやらelmoとは別路線の関数になってるようです。

 

余談:さらなる応用

定跡ごとに雑巾を作って、どのぐらい関数の形が変わるかを見てみる、強い評価関数の組成比を見て、それに近づくように学習や合成を調整するなどの工夫ができると思います。使い方は無限大ですよ!(多分