読者です 読者をやめる 読者になる 読者になる

Aestetica

コンピュータ将棋Selene(セレネ)を作っています。名前は西海枝昌彦(さいかいし まさひこ)と読みます。

Stockfishの評価関数を読む

手品が好き。


Stockfishの評価関数のことをコメントに書いたので、また気になって見てみました。

うーん。これは・・。
まずは駒割と1駒絶対。1駒絶対というのは、将棋でいうと「飛車が28にいるのが良い」みたいに、他の駒とも関連させずに位置だけを評価するもの。これは、この特徴を軸にして、他のやつをくっつけるパターンですね。
私もお試し段階の最初の頃よくやってました。別に絶対位置じゃなくてもくっつけることができたりしますが。

あとはポーンに関するものが多いんだけど、本当にいろいろあって、いかにチェスにおいてポーンが重要かということなんだけど、実は相対位置で表現できるものも多く、キングとポーンの2駒相対、ポーンとポーンの2駒相対で代用可能。
しかし、利きを見ていたりして、例えば利きのあるところにポーンが行っちゃいけない。とか。

この場合、利きというのは、もちろんどの駒でも良いので、汎用性は高まります。なので2駒相対とあまり変わらない。
ナイトの利きだったらポーンとナイトだったり、ビショップの利きだったらポーンとビショップの相対位置と一緒ということ。

AWAKEの場合は利きを判定しているにも関わらず、特徴としては利きを持っていなくて、3駒絶対でやっているのでそこに当てはめていく方式なのですが、Stockfishの場合は普通です。特徴に利きを入れてます。こうすると、特徴の次元をものすごく減らすことができます。というか、普通に考えるとAWAKE方式のほうがやたら次元数が多いということです。その代わり、他の特徴と一緒に計算できる。

で、他のも見ると、kpだったり、間接的にpp、もしくはpppを見ていたりするけど、どれも利きでやっているので汎用性が高い。
あとは玉のまわりの利きをつけている駒、利き数をしつこく見ています。

これだと、特徴としては技巧の「2駒と利き+玉の堅さ」に加えて、pppじゃないと見れないようなものまで見てますね。
それらを利きにまとめているので、全体のパラメータ数は非常に少ないです。そしてパラメータを数えてないです。みんなそれぞれ数えよう。
いろいろと工夫するとだいぶ高速化できるような気がしないでもないけど、これでも速いんでしょうね。動かしてないけど。

学習方法はどうしているのかというと、パラメータ毎の標準偏差取って、正規分布のどこを取ってくるのかは不明だけど、デルタ値を設定して、プラスとマイナスのもので対戦。勝った方向に微量増加させて数万局やる。
なるほどー、勝率をパラメータに乗っけているので、とりあえず数をやれば理想的な値になるのね。

これはヤバイです。なんかできちゃいそう。
なにができるかというと、強化学習も使用せず、棋譜なしでマスターレベルのプログラムが作成できちゃいそうということです。

あとは余談ですが、探索中のパラメータ調整の場合、値にランダム性を持たせると行けるやつと行けないやつがあるのですが、測定値を取ってきて、それを元にパラメータの更新をやらないといけないものもあり、そちらのほうが面倒です。

それでまあ、Stockfishを延々と見たわけですがー。
もういいや、ベースにするのやめよう。一時期は勝ってたんだから、できるできる。ただまあライフワークとして20年後を目標として・・。
などと弱気なことを言わず、今までの経験と知識を元に、初めから「これでいこう」というものを作ってみよう。

それで、盤面と指し手生成のとこは、やねうら王に寄生して、テストコードを書いて、やねうら王と盤面と指し手が一致するかどうかで判断しよう。これは良いアイデア
それと、やねうら王の場合は、弱いものから順々に最新のStockfishまでの複数の探索コードが含まれているので、仮想Stocksifhとして順番に戦える。
あとは開発時間だなあ。一日が300那由他時間くらいあればいいのに。