WCSC25 その7 技術的なこと(学習)

アピール文書は「とりあえず事実は伝えた」という感じでゴチャゴチャした感じになってしまったので、ここで具体的な実装や最終的な仕様を書く。
今回は評価関数の学習について。
ボナンザメソッドを使っている。何だかんだいってシグモイド関数はよい。38要素化の考えを取り入れ、シンプルな2駒関係(と駒割)だけの評価関数となっている(玉を特別扱いしないので40要素化みたいな感じ)。
ボナンザメソッドについては、「酷い評価をしてる探索の末端局面を何とかしてくれる」というイメージがあり、やってみたいと思っていた。また、何か少しは変わったことをやりたいと思っていて、ちょうど自分が将棋クエスト(5分)で指した500局あまりの棋譜があったので、その棋譜で学習することにした。
最初はオンライン学習を試していたが、棋譜が少ないと速度的なメリットがないことに気づき、普通のボナンザメソッドに切り替えた。自分にとっては、「末端局面を何とかしてくれる」ものなら何でもよかった。
ペナルティは、2駒関係の値の絶対値の対数に比例してかけるようにしている(Bonanza6.0は固定値)。つまり、exp(abs(勾配))くらいの大きさの値が付いてほしいということ。自分(将棋クエスト2級)が指した棋譜で学習するため、「棋譜が少ない」「棋譜が信頼できない」という2つの問題があり、出現頻度の低い特徴にも無難に小さい値は付いてほしいということでこのようなペナルティにした。
Bonanzaは、金と同じ動きをする駒を(fv.binでは)同一視しているが、最終的にはこれを真似た。次元下げの要領で、最初は同一視して追加で各駒の学習をしようかとも思っていたが、棋譜が少ないのにそれをやっても棋力は上がらないと思い後回しになり結局やらなかった。
馬や竜に関しても、大駒を取られるリスクというデメリットはあるものの金と同じくらいの価値はあるだろうということで、金と同等以上の値は付くようにしている。正確ではないかもしれないが、馬や竜は出現頻度が低いのでこれをしないと弱くなる。生の飛角で攻める展開に関しては、今でも弱点の一つである。
学習に使った棋譜は642局だが、ネット将棋なだけあって2手目投了のような棋譜も多い。自分の指し手だけを抜き出し、その局の最後の指し手(王手放置もあるので…)を除くと、全部で26070局面。そこから重複(局面も指し手も同じ)を除いた23389局面を学習に使用した。簡単な詰みなどは学習に使わないので、それも除くと22970局面程度になる(大した差じゃないので除外しなかった)。
さて、これで普通に学習すると、まばらにしか値が付かない。例えば、▲88玉▲28金の2駒関係に-100点という値が付いていたとして、▲88玉▲18金は0点だったりする。いやいやどう考えても-100点以下でしょ、と思うのだが普通のボナメソでは棋譜が足りないとこうなってしまう。そこで、(玉の周囲25升以外では)玉から遠くなるほど駒の価値が低くなるという縛りを入れることにした。
具体的な方法は難しい。玉側の隣の値を見て、それより小さい値に強制的に書き換えつつ学習していくことで、とりあえず棋力は大幅に上がった。ただ、隣と言っても縦横斜めがあり、どこまで参照するかは難しい。また、▲88玉△38金の隣は▲88玉△48金と▲78玉△38金の2つがあって面倒くさい。周囲8升の値の平均を基準にペナルティをかけることもしているが、それだけではあまり値が滑らかになってくれない(ていうか隣は2つあるから16升じゃねーか)。
玉を含まない2駒関係については、遠くの値は明らかに過学習なので、周囲25升以外はすっぱりゼロにしている。評価関数で大事なのは、間違いが少ないことだ。ゼロなら間違いはない。桂馬や香車は利きが前方に偏っているので、この25升の判定を手動でずらしている。
次元下げは、2駒相対のみ(2駒相対では、持ち駒は自分自身との関係のみにする)。段や筋でもやりたかった。L2のペナルティは、以前試したときの経験から大きな値が付かなくなる不安があり、相対を学習してから絶対を学習するというのは有力そうだが時間がかかって嫌だと思っていたので、手抜きでいっぺんに学習した。単に2駒相対の勾配と2駒絶対の勾配を足すだけ。そこそこ強くなってくれた。でも明らかに最善ではないので、もっとよく考えて、短時間でそこそこ強い評価関数ができる方法を追究したい。
各要素の更新幅を記録しておき、連続して同じ方向へ値が動いたら更新幅を増やすということもしているが、これは本当に有効なのかよくわからない。評価関数のデータはものすごい次元のベクトルなので、空間の様子が全く把握できない。
序盤が過学習気味ではないかと思ったとき、学習の探索ウィンドウを狭めて「同じ手番の駒同士の関係では教師より悪いと(正しく)評価した手を学習に使わない」ようにしてみたことがあった。序盤は確かにいい感じになった気がしたのだが、終盤に丸裸で平気でいるので、総合的にはかなり弱くなった。激指のオンライン学習で終盤の局面ではマージンを大きくする(ギリギリ正しく評価した手も学習に使う)というのはこういうことなのか?
個人的に焦ったのは、末端局面を得る方法がネット上になかったこと(Bonanza読めよ)。Triangular PV-Tableというのを見つけたので、これの四角形版(簡単)を作って対応した。よく考えると、長い手順をコピーするのは読みの浅い場所だけで、探索のほとんどは末端近くなので、速度はそんなに気にする必要がなかった(そもそも1〜2手+静止探索でしか学習してなかったし)。最近では、NPSが落ちる改変に心理的抵抗がなくなってきた(笑)。