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

Aestetica

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

技巧のソースを読む

これ面白い。でない順TOEIC
https://twitter.com/nise_toeic?lang=ja


技巧のソースが公開されました。floodgateでも技巧がでてますね。
出村さんというと、最初の選手権のときに殺人と正当防衛の違いについて聞きまくった記憶が。コンピュータ将棋の話をしろよ。ということなんですけど(笑)

中身を読んでみると探索部分はStockfish(の、ひとつかふたつ古いもの)。ということは、上位プログラムでStockfishクローンでないのは、大将軍(どうかな?)、激指、習甦あたりでしょうか。さしあたって大将軍がヤバイ。マジか。

で、評価関数のところ。
評価関数や学習部分で見るところはこんな感じです。

1.特徴は何を使用している?
2.棋譜を読み込んだ後の、点のつけ方。何点足せばいいの?
3.足すべき点はわかったものの、どの局面に対して足せばいいのか?

では順番に。

◆1.特徴は何を使用している?

簡単に言うと、ずいぶん前の将棋、またはチェスプログラムのスタンダードな特徴と同じとなっています。
全体から見ると、駒位置だけでなんとかしようとするBonanza型のほうが、異質というか、機械学習の精度で押し切っている感じがします。そこがすごいとこなんですけども。

チェスの場合だと、Stockfishでも、おそらくkomodoでも、
①駒割
②駒の位置
③玉の守り(king safety)
④浮き駒、質駒
⑤駒の自由度(Mobility)
⑥進行度(チェスでは二段階しか評価しない)
⑦手番
⑧そしてポーン関係いろいろ。チェスでは超絶必須。将棋では不要。

という特徴になっていますが、技巧もほぼ一緒です。
ただし、これらは多分、部分的には激指や習甦など、Bonanza型の特徴としていないプログラムはごく普通に入っているでしょう。
Bonanza型の特徴のプログラム(大多数)では、①と②だけです。

最初に技巧のアピール文書を見たときに、この並びだと駒の自由度も入ってるんじゃないかなー。と、思っていましたが、後でAWAKE方式で埋め込めることもあってか、かなり細かく見てますね。

◆2.棋譜を読み込んだ後の、点のつけ方。何点足せばいいの?

3段階で点をつけています。

棋譜と一致するか?(ここでは激指の手法と同一)
②勝ったプレイヤーにプラス。(習甦の手法)
③探索した局面と、その親局面との誤差をなくすように点をつける。(習甦の手法)

意味合い的には、ほぼすべての将棋プログラムでは①だけを行っていて(ただし、激指の手法ではなくBonanzaメソッド)、強化学習のプログラムは②だけをやっています(方法はいろいろ)。
③は、こちらも少し異なりますがNDFでも行っています(いろいろあるけど、だいたいこんな感じ)。

ちなみに、WCSC24Seleneは①とほぼ一緒。①だけをやっている感じ。
電王トーナメントでのTD-leaf(λ)版Seleneでは、だいたい②と同じようなこと。学習率についても、Seleneは0.0018、技巧は1/600なので0.001666…7。ただし、点をつける局面がいろいろ異なります。③についても、間接的にやっている。という、伝わりづらい感じ。

習甦は①②③のすべてを行っていて、特徴も3駒+盤面の利き全部+玉の守りなので、技巧とほぼ同じ(おそらく。最新のものはわかりません)。
(技巧は2駒。学習に必要な棋譜の数が減る?)

◆3.足すべき点はわかったものの、どの局面に対して足せばいいのか?

こちらはAWAKEと同じく、利きについての局面全部に点をつけています。

といったことで、ざっくり言うと探索はStockfish、特徴・学習方式は習甦+AWAKE方式(ただし習甦は非線形回帰)。
なんだけど、問題となるのは特徴の細かい選び方で、利きまわりのこと、玉の守り関係、相対位置への反映の仕方や、持ち駒、穴熊の考慮など、多数の実験のもとにできた内容なのでしょう。このへんはひたすら試さないと、どうしてもできない部分。

あと、個人的には歩の評価値を固定にしているところが「おお!」と思いましたけどどうでしょうか。
棋譜と一致させる際に、激指型の学習だと0と1のためか駒割の変動がなぜかうまくいかず、倍率を変えてから元に戻したりとアレコレやって苦労した思い出がありますが、他の加点方式も取り入れているからこれでうまくいくのか。なるほどねー。と、大変勉強になりました。

それと実現確率探索のところですね。
多クラスロジスティック回帰で確率を求めていますが、これって評価関数自体も多クラス分類でやってみなかったのかなあ。
とかなんとか(自分で試せ?おっしゃる通りでございます)。