WCSC25 その2 開発

選手権バージョンの開発について。
http://d.hatena.ne.jp/merom686/20110526/1306385882
4年前に1ヶ月ほど開発していた。それ以前にも、どうぶつしょうぎや立体四目並べを作ったことはあったが、将棋の思考エンジンを書いたのはこのときが初めて。作りは単純なアルファベータで、評価関数は手動でとりあえず作った駒割+α。打ち歩詰めは未実装だった。
そのコードを元にして、半年前に作り始めたのがshogi686。C++に対する知識経験思いが違う過去のコードを使うのは相当面倒なところもあるが、飛び利き用のビットボードやUSI対応の動くコードが存在している安心感は大きかった。功罪は微妙だが、自分は動くコードを保ちながら開発を進めていくタイプなので、それに合っていたとは思う。最初は変数名をまともなものに一括置換して動作確認が主な作業だった。
12月ごろには、選手権に出たいなあと何となく思い始めていた。そうなると、名前を考える必要があるが、これが開発と同じくらい難しい。結局、merom686の指し手から学習するということもありそのままshogi686にした。第2候補はKasuminKawaiiで、さすがに意味がわからないかなと思い断念。floodgateにはこの名前で投入している(選手権前に指したのは4局)。
探索には既存の技術をできるだけ実装し、評価関数は機械学習するという方針。
たまたま、そこまでの半年で将棋クエスト(5分)を大量に指して棋譜を保存してあったので、「ちょうどいい」と思ってその棋譜で学習させることにした。テスト目的でも他の棋譜は使っていないが、これは本当はよくない(まずプロの棋譜で上手くいくことを確認したほうが効率がよい)。ただ、棋譜をフルに使って気軽にテストできるので、最初としては悪くない選択だったかなと思う。
探索は、これまで読んだことがあるブログを読み直したり、Chess Programming Wikiを見て、強くなりそうなものをどんどん実装していった。具体的にどういう動作をすればいいかわからないものも多く、次第に行き詰まっていった。ただ、その頃にはStockfishのソースがそこそこ読めるようになっており、実装から手法を理解するという感じで進めていった。Bonanzaのソースは、やはり読む気がしなかった(StockfishはC++的な書き方なのですごく読みやすかった)。
探索の基礎的な部分を作っていたときは、布団の中でバグを見つけることも多く、充実していた。そこから先の、高度な枝刈りや機械学習では、自分にとっては実験的にしか強くなることがわからないことが多く、なかなか本気で「考える」ことができなかった。
最終的にはStockfishの探索をできるだけ真似る方向にした。抜けはあると思うが、実装していないとわかっているものがあるうちはやり続けた。僕は「Bonafishを作って理解してようやくスタートラインに立てる」と思っており、nozomiさんと対戦したときにそういう話をした。
学習は、最初はオンライン学習から始めたが、ボナンザメソッドに切り替えた。オンライン学習は速いと聞いていたのだが、よく考えたら学習対象の棋譜が500局(当時)の片側の手番だけと少ないため、ボナメソに速度的なデメリットが全くないのだった。また、ボナメソのほうはコードがシンプルになるので、開発も楽になった。
並列化に着手したのは選手権の1週間前。Stockfishのコードで「なぜこういう書き方なのか?」と疑問に思っていた部分について、並列化を考えることでその必然性がかなりわかってきた。しかし、データ構造の改変が必要だとわかり、NPSが多少落ちることには妥協して急ピッチで開発を進めた。
PV-SplitではCPU使用率が上がらなかったが(バグなのか仕様なのか不明)、YBWCらしきものを実装したらちゃんとCPUを使ってくれるようになり、棋力も少しは上がっているようだった。これが4/29の夜。
4/30に探索を、5/1に学習を仕上げる予定だったが、PCを見つめすぎたせいか、あるいは並列化が動作して気が抜けたのか、少しだけ熱が出て、難しいことを考えるような開発はできなくなった。予定が無理すぎた。
探索に関しては、16スレッド動作だと頻繁に落ちて、4スレッドでも特定の局面でまれに落ちて原因がわからなかったので、並列化の使用は見送った。多少NPSは落ちるものの、細かい改良は加えていて差分がすぐに思い出せなかったので、最新バージョンでスレッド数1を指定して参加することにした。
学習は、並列化のための改変で動作しなくなっていたので、2週間くらい前のコードを持ってきて、探索深さ2(それまでは1でしかやっていなかった)で学習させた。宿泊先でも仕上げに少し回した。合計4〜5時間を、Twitterを見るときなどにバックグラウンドで回していた。玉から離れた駒の値をより滑らかにするなどしたかったが、本番で思ったよりいい内容の将棋を見せてくれたので、結果的には満足できるものになっていたと思う。
PGO(VS Communityさまさまである)をかけて前日のテストに臨んだ。秒読み突入も成功し2局とも最後まで指せたのでよかった。そこからは、コードの変更は一切していない(評価関数は、テスト対局後宿泊先で30分ほど仕上げの学習をした)。よほどのことがないかぎりリスクのほうが大きすぎる。秒読みマージンはGUIで設定できるようにしてあった。