やねうら王に1ヶ月ほど前につけたlambda混合絞りについて、なんとかちゃんねるで盛り上がっているようなのでこの機能について簡単に解説しときます。
elmo式のlambdaは、評価関数の強さによって調整するほうが速くKPPTの限界に近づくことはわかっています。
例えば、評価関数をゼロから学習させる場合、最初のうちはゲームのプレイアウト時の勝敗のほうが、探索の結果より優れた教師であるため、lambdaを小さめ(勝敗項を勝率項より大きめ)にしたほうが速く強い評価関数となります。
ところがある強さぐらいになってくるとプレイアウトの質はさほど変わらず(まあ、depth 6や8程度では結構いい加減で)、その場合、lambdaを少し大きめにしたほうが教師として優れています。
逆に言うとelmo(WCSC27)の瀧澤さんが、WCSC27出場前にelmoより強く出来なかったのは、教師生成時のdepthを上げなかったのと、lambda値を調整しなかったからです。
特にelmoは短時間(depth 6)では浮かむ瀬よりおそらく弱く、弱くなった教師でのプレイアウトを調べていたことになるので、浮かむ瀬で生成した50億局面より、教師の質が下がっていたのではないかと思います。
このへんがelmoがWCSC27出場前に強く出来なかった原因ではないかと思います。
次に、ゼロから学習させ弱い評価関数においてもう少し効率的に強くする手段がないかを考えてみます。
プレイアウトの質に関して、いくらdepth 6とは言え、終盤だと逆転しにくいので、終盤においては勝敗項が信用できます。逆に序盤においては、相対的に勝敗項よりは勝率項を信用したほうが良さそうです。
※ 「勝敗項」「勝率項」の定義は、こちらの記事を参照のこと。
そこで、序盤のlambdaは大きめにして、終盤のlambdaは小さめにすると良さそうであり、これが私が考えた「lambda混合絞り」です。
やねうら王のlearnコマンドで指定できるlambda2,lambda_limitがこれです。教師の探索のスコアがlambda_limit以上のとき、lambdaではなくlambda2を適用するという仕組みです。
このlambda混合絞りを用いるとゼロから学習する場合にやや早く強くなることは確認しています。ただ、elmo+R100ぐらいの評価関数だと、どうパラメーターを調整しても有意な差は出ないようです。まあ、KPPTの表現の限界もありますしね…。
このlambda混合絞り、機能としてはつけたものの、まあいま作っている評価関数が強くなるわけでもないのでまあいいかと解説もろくに書かずに放置していたのですが、なんとかちゃんねるで「この機能を使って強くなった」みたいな話題で盛り上がっていたようなので、私の知っている情報を提供しておく次第です。
このようにすると、lambda混合絞りができません。
YaneuraOuV471learn.exe threads 4 , hash 1024 , evaldir eval_zero_epoch0 , evalsavedir new_eval , evalshare false , learn save_only_once batchsize 300000 eta 30 lambda 0.33 lambda2 0.5, lambda2,lambda_limit shuffled_sfen.bin , quit
> lambda2 0.5, lambda2,lambda_limit shuffled_sfen.bin
正)
lambda2 0.5 lambda2 xxx lambda_limit yyy shuffled_sfen.bin
※ xxxとyyyに適切な数値を指定します。
詳しくは docsフォルダにある説明などをご覧を…。
lambda_limitはどのぐらいにすればいいでしょうか。
おすすめを教えてください。
特にお勧めはないです。色々変えてみて、その評価関数に合った値に調整していただくしか…。