Bonanzaを改良するすべての人のために

■ Bonanzaを改良するすべての人のために


Bonanzaを少し改良して、Bonanzaよりわずかに強いものを作るのはそう難しいことではない。


しかし、例えば利きを追加して、それに従い評価関数を利きを利用するものに書き換えようとした場合、二つの問題に直面する。


1. Bonanzaメソッドでどのように学習させるべきか?


実際、Bonanzaがどの棋譜からどうやって学習させたのか詳細は知られていない。Bonanzaに付属のfv.bin(学習データ)と同等の性能をもつ評価関数パラメータの学習に成功した人は、現時点では一人もいないと言われている。


fv.binと同等のデータを学習するのに1ヶ月以上かかるとも言われており、ハードルも高い。


これについては別途詳しい記事を書く予定なのでご期待いただきたい。


2. 本家Bonanzaのバイナリはどのようにコンパイルされたものか?


少しBonanzaを改良したところで、コンパイラによる最適化が甘ければ、結局本家Bonanzaのバイナリよりnpsは低下して本家Bonanzaより弱くなってしまう。せっかく改良したのに弱くなるのでは、改良するモチベーションが保てない。


Visual C++ 2008 Team System(以下VC++と略す)でコンパイルしたところ、本家バイナリより15%ほどnpsが低下した。(Core 2 Duo 2.8GHzにて実測)


Bonanzaのソースフォルダにはmakefileがあり、Visual C++ 2008(以下VC++)でコンパイルすることは容易である。コンパイルオプションは以下のようになっている。日本語の注釈は私が追記した。

# Compile Options
#
# -DNDEBUG (DEBUG) builds release (debug) version of Bonanza.

NDEBUG : リリースバージョンでビルドする。
DEBUG : デバッグバージョンでビルドする

# -DMINIMUM disables some auxiliary functions that are not necessary to
# play a game, e.g., book composition and optimization of
# evaluation function.
最小限でのビルド
# -DTLP enables thread-level parallel search.
並行探索を有効にする
# -DMPV enables multi-PV search.
multi PV探索を有効にする
# -DCSA_LAN enables bonanza to talk CSA Shogi TCP/IP protcol.
CSA将棋プロトコルを有効にする
# -DNO_LOGGING suppresses dumping log files.
ログファイルへの出力を抑制する

例)
OPT =-DNDEBUG -DTLP -DMINIMUM -DCSA_LAN
リリースバージョン、並列探索有効、最小限、CSA将棋プロトコル内蔵

例) Windows
FLAG = /DNDEBUG /DMINIMUM /DTLP /DCSASHOGI /DNO_LOGGING

VC++なら等価なオプションとして
/D "NDEBUG" /D"TLP" /D"MINIMUM" /D"TLP" /D"CSASHOGI" /D"NO_LOGGING"
を指定する。


/MT : コード生成→ランタイムライブラリ→マルチスレッド
/W4 : 全般→警告レベル4
/nologo : 全般→著作権情報の非表示
/O2 : 最適化→実行速度
/Ob2 : 拡張可能な関数すべて
/Gr : 詳細→呼び出し規約→__fastcall
/GS- : コード生成→バッファセキュリティチェック→いいえ

新規でC++のプロジェクトを作成して、Bonanzaのソースをまるごとプロジェクトに追加して、コンパイル時のシンボル定義として上記のように設定すればコンパイル出来る。


参考として以下のページを挙げておく。


ボナンザのコンパイルと起動
http://d.hatena.ne.jp/mclh46/20090926


また、PGO(Profile-Guided Optimization : プロファイルにガイドされた最適化)有りでコンパイルすれば、常識的には15%ほど実行速度の向上が期待できるはずなので、ひょっとすると本家のバイナリはVC++のPGO有りでコンパイルされたものかも知れない。


しかし、Bonanza 4.1.2のmakefileには、以前のバージョンのBonanzamakefileにあったPGO有りでコンパイルするための記述がごっそり削除されている。


何故、これがごっそり削除されたのかは私にはわからない。もし、これがうっかり削除してしまったという類のものではなく、故意によるものならば、是非その理由を教えてもらいたい。


また、同じ動作環境にて、Intel C++ Compiler 11 for x86(以下ICC)でコンパイルすれば、本家Bonanzaと同程度のnpsが出ることは確認した。ICCでPGOを有効にすればこれまた常識的には10%〜15%の高速化が見込めるはずなので、本家バイナリより高速になることが期待できる。


BonanzaのPGO有りでのコンパイルは私はまだ調査中なので、機を改めて記事を書く。


■ まとめ


Bonanzaを改良していく上で、本家のfv.binと同等のパラメータを自分で学習させられることと、本家Bonanzaのバイナリと同等のnpsの出るものを自分でコンパイル出来ることは最低条件だと思う。そこが改造を始めるスタートラインだと思うのだが、そのスタートラインに立つことはそう容易ではないということを説明した。


本家バイナリはどうやってコンパイルされているのかについて情報が何も公開されておらず、どうやれば本家のバイナリとidentical(同一)なバイナリが得られるのかについて何の情報もない。


これではせっかくソースが配布されていても、バイナリのほうにはウイルス入っていることだってあるので、是非とも本家バイナリとidenticalなバイナリを生成するためのコンパイル手順を公開してもらいたいと思う。


もちろん、保木さんが悪意を持ってウイルス入りのバイナリを配布するような人には到底思えないが、上に書いたように、本家バイナリと同等のnpsを出すのはそう簡単なことではないので、コンパイル手順に関する情報を保木さんはきちんと公開すべきだと思う。