ひよこカルロ将棋が駒得Bonanzaの背中に追いついたようです

評価関数が駒得だけだと700点ぐらい弱くなる?  投稿者:山下 投稿日:2010年 9月 7日(火)23時13分31秒

floodgateで bonakoma_1c というBonanza Felizの評価関数を駒の損得だけ、
にしたものを走らせてるのですが、通常に比べて700点〜800点ほど
弱くなるようです。(定跡はあり)
YSSも駒得だけにすると同じくらいのレーティングで、やはり
通常に比べて600点ほど弱くなるようです。

1778 bonakoma_1c AthlonX2 2.3GHz 1core 1手10秒固定
1803 YssKoma_1c AthlonX2 2.3GHz 1core
2530 YssL980X_1c 980X 3.3GHz 1core
2606 Bonanza Opteron250 2.4GHz 2core


コンピュータ将棋や囲碁掲示
http://www.yss-aya.com/bbs_log/bk2010-3.html#bbs171

定跡ありですとずいぶん有利だと思います。定跡を抜けた局面から指せればひよこカルロ将棋は現時点でR2000以上であるのは圧倒的劣勢からの逆転棋譜の数々を見る限り確実です。

定跡あり + 駒得のみの評価関数のBonanza 1c = R1778
定跡なし + 駒得のみの評価関数のひよこカルロ将棋 1c = R1800

おそらく現時点でひよこカルロ将棋は駒得Bonanzaは超えています。


そしてひよこカルロ将棋は今月中にR2000の大台突破を目指します。あ。あと3日しかありません。無理です。並列探索実装しますから誰かひよこカルロ将棋を8コアぐらいのマシンでfloodgateに参戦させてもらえませんか。(←そこまでして勝ちたいのか)

ひよこカルロ将棋のnpsについて

ひよこカルロ将棋v0.08のnpsは平均的には2Mnps程度です。前のバージョンまでは5Mnps程度出ていました。

しかしv0.08になったときに静止探索の手前で枝刈りをするようにしました。

静止探索とは手番を活かして、駒の取り合いによっていま以上の評価値になる手があるかどうかを探す探索でして、つまり、手番を持っている側が現在の評価値以下になることはない(と仮定している)わけです。(この現在の評価値のことをstandpatと呼びます。)

すなわち、静止評価を呼び出すその1手前でif (次のstandpat <= alpha) であれば、この指し手がalpha値を更新しないことは確かです。駒得だけの評価関数ですので次のstandpatとは、現局面の評価値+捕獲する駒の価値×2(交換値)です。

このような枝刈りを入れることにしました。これは枝刈りしないときとまったく等価な探索結果になる安全な枝刈りです。

そうして、この枝刈りをしたときはノードをひとつ調べた扱いにして、探索したnode数を記録しておくカウンターに1足すコードを書きました。そうするとさっきと同じ局面で5.5Mnps程度出ていることがわかりました。10%程度npsが上がったことになります。

しかし、この枝刈りしたノードをカウントするのはずるいような気もして、ここでnodeをカウントするのはやめることにしました。そうすると見かけ上はnpsは2Mnps程度になりました。しかし実際はその2,3倍の数字が出ております。

futility pruningなんかについてもきっと同様で、実際に調べたことに相当するnode数の半分とか1/3ぐらいの数値になってしまうのだと思います。

ひよこカルロ将棋に関しても同様でして「npsが下がっている = 探索量が減った」ではないということをここに書き残しておきます。

改善すると弱くなる?!

枝刈りを進めると1回のiteraion時間が減るのですが、そうすると「今回の思考時間はこれだけ」と決めた時間を忠実に守れるようになってきます。当初、忠実に守れなかったので、少し多めの時間を割り当てていました。次のiterationを回すと与えられた思考時間を超えそうならそこで指し手をUSIクラスに返す作りになっていました。

私が枝刈りの処理を頑張って実装 → 1回のiteration時間が減る → 思考時間を忠実に守れる → 序盤で時間を使いすぎてしまう → 終盤の時間が減る → 終盤でiterationが回らない → 弱くなる → あれ〜?

という流れで、私が枝刈りを頑張れば頑張るほど弱くなるという負のスパイラルが発生していました。これでは勝てるものも勝てません。ひよこカルロ将棋v0.12で終盤の時間割り当てを増やしました。

モンテカルロシミュレーションのこと

やはりdraw(規定手数内に決着がつかない場合)でも評価関数は呼ぶべきではないようです。というのもdrawのときに評価関数(駒得のみ)を呼び出して駒得ならば加点していたのですが、これが案外よろしくなかったです。もう少し精緻な評価関数ではまた事情が違うと思いますが、駒得のみの評価関数では全然駄目です。(まあdrawしたときにそんな評価関数を呼びだそうって人も居ないでしょうけども)

あと、モンテカルロシミュレーションの回数が少なすぎて精度が悪かったです。これについては、モンテカルロシミュレーションで相手を詰ませた場合、探索ルートから20手以内の自分の指し手を加点するようにしました。(ひよこカルロ将棋v0.12にて)

これはコンピューター囲碁で使われているRAVEに近いものです。ただ20手以降まで加点するとノイズが入ってくるのでコンピューター将棋ではあまり探索ルートから離れた手までは加点しないほうがいいのかなぁと思っているのですが、厳密にテストをしているわけではないのであまりこの話は信用しないでください。