freeze_kkは何のためにあるのですか?

やねうら王のlearnコマンドのfreeze_kk/kkp/kppは何のためにあるのか、説明を書いておく。

本来、FV38(EvalList 38枚固定化)にした場合、KKはKKPに含まれるのでKK自体、要らない。どういうことかと言うと、KKPの値 = ΣBK・WK・P(BK=先手玉、WK=後手玉、Pは玉以外の駒)で38回の足し算をするのだが、ここにKKの値を1/38ずつ乗せておけば、KKの項は不要である。実際、今回(SDT5)のAperyはKKの項が無い。

KKを無くすデメリットとして駒落ちでKの位置評価がおかしくなるというのがある。例えば、4枚落ちであれば、Pは34枚であるが、1/38ずつKの位置評価(KK)がKKPに乗って来ていると、4枚落ちのときに34/38しかKの位置評価を足し合わせていないことになる。やや少ない。ただ、駒落ちは駒落ち用の評価関数を別途作るべきという気もするので、駒落ちのことはいま考えないことにする。

他のデメリットとして、学習時に出現しなかったKKPの要素の値がおかしくなるのではないかというのがある。学習時に出現しない場合、その要素はゼロのままである。ところがKKPにはKKの1/38が乗ってきていないとおかしく、本来、ゼロではまずいはずである。パラメーターの次元数が多い場合や、教師データが少ない場合にはこのことが問題となる。出現しなかった特徴因子はゼロになってしまうが、ゼロになったときに整合性が取れるようにするためにはKKがあったほうが良い。

だから、プロ棋士の棋譜から学習させていたころ(Bonanza6の時代)は、KKを最初に学習させて、そのあとKKPを学習させ、その次にKPPを学習させたほうが速く学習できた。(保木さんが数年前にそういう論文を書かれていた。) これを実現するために、やねうら王の学習コマンドではlearnコマンドにfreeze(学習させない)の指定が出来るようにしてある。

細かいことを言うと、KKはKKPだけではなくKPPにも乗ってくる。KPPは38*37/2回(=703回)出現するので、1/703ずつKの位置評価がKPPに乗って来ているとも考えられる。KKP,KPPをfreezeさせずに一気に学習させてしまうと、Kの位置評価をKPPが一番吸収してしまう。(KK,KKP,KPPのそれぞれのパラメーターが動く速度はAdaGradでは等速度であると考えられるため)

これは本来よろしくないのであるが、しかし現在のように数百億局面を用意して学習させる場合には、ほとんどの特徴因子が出現すると考えられるので、問題ないと思われる。(KKPPなど次元数がさらに増えた場合はこの限りではない。)

コメントを残す

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