選手権に向けて

久しぶりの更新だと思ったら、昨年の選手権の自戦記以来でした…


今年の選手権の参加申し込みをした後、仕事の都合でキャンセルの危機もあったのですが、最終的には何とかなって、無事参加できる見込みです。


プログラムの方は、昨年からの変更点は、主にバグ修正で、他には小さな機能追加と変更をいくつか入れています。

ここで少し機能追加の話をしますと、
通常探索の方は、探索延長や枝刈りの細かいところをいじった程度です。
一時、Aspiration Searchの導入を試みて、いろいろやってみたものの、ym将棋の実装とは相性がよくないようでした。
結局原因はわからなかったのですが、探索ノード数がかえって増加してしまい、逆効果だということで今は外しています。

モンテカルロ探索(UCT)の方は、比較的大きな変更を入れています。

1つ目は、playoutの打ち切りを評価関数で行うようにしたこと。
(詳細はアピール文書で)
原論文にあるように、この仕組みは評価関数が「当てになる」ことが前提なのですが、今のym将棋の評価関数ではちょっと無理があるようで、
確かに高速でplayoutが終わることは終わるものの、終局しないよりまし、という程度の効果のようです。
もちろんこれは、ym将棋に限った話なので、ちゃんとした評価関数を使えばもっと効果が出るのだと思います。
本来は、ランダム部分の指し手選択をもっと改善して、終局までplayoutを続けるべきなのだと思います。
これは来年の課題ということで。

2つ目は、playout時に通常探索のハッシュテーブルの最善手を参照するようにしたことです。
これは、アピール文書を提出してから入れた機能なので、そちらには書いてないのですが、ym将棋特有だと思います。
内部ノード(UCBで指し手を決めるノード)では、progressive wideningを利用している場合、一度も選択されたことのない指し手は、何らかの基準で「仮の」UCB値を決め、それによって指し手を決めます。
「仮の」UCB値を一定にせず、指し手ごとに差をつけることで、有望でなさそうな手は選択しない、緩やかな*1枝刈りを実現しています。
このときの「何らかの基準」には、王手、駒得をする手といった、指し手の性質が反映されているわけですが、その中に、「通常探索のハッシュの最善手」という条件を加えています。
また、一度でも選択された指し手は、勝率と選択回数からUCBを算出しますが、このときにも、ハッシュの最善手はUCB値にボーナスを与え、選択されやすいようにしています。*2
指し手の仮評価だけでは、駒損する手などはどうしても選びにくいのですが、読みを入れた結果、後でよくなると分かれば、playoutでも選んであげようというものです。


実は、この1年で一番力を入れたのは、何といってもバグ修正です。
昨年、一昨年と、選手権前に実戦練習ができなかったので、本番でバグのために痛い目にあいました。
今年はその轍を踏まぬよう、家のPCで持ち時間15分の対局を繰り返して、地道にバグ潰しを行っています。

それと並行して、評価関数の学習を進めています。
アピール文書にも書いたとおり、TreeStrapを使っているのですが、どうやら、横着して駒割を固定にしたのは良くなかったようです。
要するに、駒得重視の評価関数になってしまうようなのです。
強いプログラムと対戦すると、駒得しながら陣形をバラバラにされて、機を見て一気に潰されるというパターンが目に付きます。
まあ、たまには、駒得したまま逃げ切るというパターンもありますが。

本来は、駒割も初期値から学習を始めるべきなので、来年向けの課題として。

ということで、参加者の皆さま、大会関係者の皆さま、よろしくお願いいたします。

*1:playoutを無限回実行すれば、いずれは選択される

*2:ym将棋の実装では、選択回数にマイナスの補正を与えている。説明は割愛するが、選択回数が小さいとUCB値は大きくなる