FlipSight独自のオセロAIエンジン、FlipMindを紹介します
Page info
Content
FlipSightはアプリv2.0.4まで、Edax 4.5.6(okuharaさんのedax-reversi-AVX)をエンジンとして使ってきました。速さも強さも申し分のないエンジンでした。今回、アンチ、八角、10×10といった変形オセロのボットを作る中で、FlipSightの対局データから評価関数を自分で学習させて作ることになり、その経験をもとに通常のオセロでも独自のエンジンを作ってみようと考え、オセロAIエンジンFlipMindを開発しました。
FlipMindの作り方
- 評価関数は学習で自作しました。変形オセロはFlipSightの対局データで、通常のオセロはEgaroucidの学習データとFlipSightの対局データで学習しました。Egaroucidのデータは通常のオセロの評価関数を作るうえで大きな助けになりました。これほど大量のデータを公開してくださったTakuto Yamanaさんに感謝します。
- 探索部分も自分で実装しました。知られている探索手法は参考にしつつ、既存エンジンのコードは使わずにすべて自分で書きました。Logistello、Edax、Egaroucidの技術資料と、okuharaさんのedax-reversi-AVXのSSE/AVX最適化の資料がとても参考になりました。
- 結果: 評価ファイルの大きさをEdaxと同程度の約14MBに保ちながら、Edaxに対して平均勝率60%以上を記録しました。最善手を求めるBESTモードでは高性能なEdax AVX版と同程度の速さを保ち、解析画面でよく使うすべての手の評価値の計算(ALLモード)は大きく速くなりました。
- Webはネイティブアプリより計算が遅いですが、同じエンジンと評価関数を使うため、同じレベルでは強さに差はありません。
※ 学習データの引用: Yamana, Takuto. Egaroucid Free Training Data. https://www.egaroucid.nyanyan.dev/en/technology/train-data/
ベンチマーク
比較対象には、代表的なオープンソースのオセロエンジンであるEdax 4.5.6とEgaroucid 7.8.2を使いました。
速さ
次の3つの終盤問題集を2つのモードで測りました。
- Edax 16: Edaxの性能測定コマンド(bench)が使う終盤16局面です。空きマス20~23。局面の出典: Edax benchの生成コード、生成された16局面
- FFO 33~51: FFO終盤テスト局面33~51番(19局面)です。空きマス20~27。公式ファイル: fforum-20-39.obf(#33~#39)、fforum-40-59.obf(#40~#51)
- FFO 40~59: オセロエンジンの終盤性能の比較に広く使われるFFO終盤テスト局面40~59番(20局面)です。空きマス20~34で、3つの中で最も長い問題集です。すべての手の評価(ALL)は1回の測定に時間がかかりすぎるため、この問題集では測っていません。公式ファイル: fforum-40-59.obf
※ FFO終盤テスト局面は、フランスオセロ連盟(FFO)のフォーラムで公開された終盤問題集です。
- BEST: 最善手とその評価値を求めるモード(対局で使用)。ほかの手は最善手より良くないことだけを確かめ、正確な評価値は求めません。
- ALL: 打てるすべての手それぞれの正確な評価値を求めるモード(解析で使用)。
解析画面では候補手ごとに評価値を表示するため、ALLモードの速さも大切です。
表の時間を押すと、そのエンジンの局面ごとの結果と元の出力を見られます。
x86 AVX2ビルド(AMD Ryzen 5 5600X)
| 問題 | モード | FlipMind 1.0.0 AVX2 | Edax 4.5.6 公式AVX2 (x86-64-v3) | Egaroucid 7.8.2 公式SIMD AMD (AVX2) |
|---|---|---|---|---|
| Edax 16 | BEST | 2.497秒 | 2.630秒 | 2.151秒 |
| FFO 33~51 | BEST | 5.198秒 | 5.281秒 | 5.923秒 |
| FFO 40~59 | BEST | 48.869秒 | 46.027秒 | 51.836秒 |
| Edax 16 | ALL | 9.508秒 | 15.192秒 | 18.025秒 |
| FFO 33~51 | ALL | 23.856秒 | 27.711秒 | 40.458秒 |
12スレッド、エンジンごとに3回測った平均。
※ 測定結果はOS、CPU、ビルドオプションなどの環境によって変わることがあります。このCPUはSMT(ハイパースレッディング)を使う6コア12スレッドのCPUです。
ARM64ビルド(Apple M4)
FlipSightのiOS、AndroidアプリはこのARM64ビルドを使います。
| 問題 | モード | FlipMind 1.0.0 arm64 (NEON) | Edax 4.5.6 arm64 (NEON) | Egaroucid 7.8.2 arm64 Generic |
|---|---|---|---|---|
| Edax 16 | BEST | 2.841秒 | 3.316秒 | 2.370秒 |
| FFO 33~51 | BEST | 5.668秒 | 6.966秒 | 5.978秒 |
| FFO 40~59 | BEST | 60.107秒 | 66.698秒 | 60.771秒 |
| Edax 16 | ALL | 11.884秒 | 19.827秒 | 19.074秒 |
| FFO 33~51 | ALL | 22.768秒 | 33.606秒 | 41.005秒 |
MacBook (Apple M4、10コア)、10スレッド、エンジンごとに3回測った平均。macOS用の公式実行ファイルがないため、3つのエンジンとも公式ソースをこのMacでarm64向けにビルドしました。
Webビルド(WASM)
Edaxには公式のWASMビルドがないため、FlipSightで独自にビルドして使っていました。
| 問題 | モード | FlipMind 1.0.0 WASM (SIMD128) | Edax 4.5.6 WASM (独自ビルド) | 差 |
|---|---|---|---|---|
| Edax 16 | BEST | 4.568秒 | 9.893秒 | 2.17倍速い |
| FFO 33~51 | BEST | 9.552秒 | 20.542秒 | 2.15倍速い |
| FFO 40~59 | BEST | 87.612秒 | 182.874秒 | 2.09倍速い |
| Edax 16 | ALL | 16.954秒 | 51.911秒 | 3.06倍速い |
| FFO 33~51 | ALL | 44.884秒 | 154.250秒 | 3.44倍速い |
Chrome 157、両エンジンとも8スレッド、3回の平均、すべての局面で評価値が一致。同じPC(Ryzen 5 5600X)。マルチスレッドのWebビルドです。
※ EdaxにはWASM SIMD用のコードがないため、WebではSIMDなしでビルドしたEdaxを使いました。FlipMindは評価関数の計算を特定のCPU命令に縛られない汎用ベクトル型で書いているため、同じソースがAVX2(x86)、NEON(ARM)、SIMD128(Web)にそのまま使えます。
強さ
レベル1、5、10、15、20で、XOTの開始局面からレベルごとに2,000局の比較対局を行いました。同じ開始局面を黒と白で1局ずつ打ち、2局の石差を合計して1回の勝ち、引き分け、負けとして数えます(レベルごとに1,000回)。定石(ブック)は使っていません。
評価関数ファイルの大きさ: FlipMind約14MB、Edax約14MB、Egaroucid約39MB(評価38MB + 終盤の手の並べ替え用0.5MB)。
| レベル | 相手 | 回数(2局ずつ) | 勝ち / 引き分け / 負け | FlipMindの勝率 |
|---|---|---|---|---|
| 1 | Edax 4.5.6 | 1,000 | 636 / 20 / 344 | 64.6% |
| 5 | Edax 4.5.6 | 1,000 | 604 / 33 / 363 | 62.1% |
| 10 | Edax 4.5.6 | 1,000 | 583 / 68 / 349 | 61.7% |
| 15 | Edax 4.5.6 | 1,000 | 587 / 128 / 285 | 65.1% |
| 20 | Edax 4.5.6 | 1,000 | 522 / 203 / 275 | 62.4% |
| 1 | Egaroucid 7.8.2 | 1,000 | 496 / 29 / 475 | 51.1% |
| 5 | Egaroucid 7.8.2 | 1,000 | 549 / 29 / 422 | 56.4% |
| 10 | Egaroucid 7.8.2 | 1,000 | 531 / 80 / 389 | 57.1% |
| 15 | Egaroucid 7.8.2 | 1,000 | 428 / 165 / 407 | 51.1% |
| 20 | Egaroucid 7.8.2 | 1,000 | 422 / 202 / 376 | 52.3% |
※ 同じレベルでも、細かい設定はエンジンごとに少しずつ違います。レベル1、5、10は3つのエンジンとも同じ条件です。中盤はレベルと同じ深さを100%で読み、空きマス2 × レベルから完全読みをします。レベル15、20は、終盤の手前を最後まで読むときの信頼度がエンジンごとに違います。信頼度が高いほど時間はかかりますが、より正確です。
レベル15
| 空きマス | FlipMind 1.0.0 | Edax 4.5.6 | Egaroucid 7.8.2 |
|---|---|---|---|
| 28以上 | 中盤の深さ15(75%) | 中盤の深さ15(73%) | 中盤の深さ15(74%) |
| 25~27 | 最後まで85% | 最後まで87% | 最後まで98% |
| 23~24 | 最後まで98% | 最後まで98% | 最後まで99% |
| 22 | 最後まで98% | 最後まで98% | 完全読み |
| 21以下 | 完全読み | 完全読み | 完全読み |
| 1局の平均時間 | 1.17秒 | 1.96秒 | 1.95秒 |
レベル20
| 空きマス | FlipMind 1.0.0 | Edax 4.5.6 | Egaroucid 7.8.2 |
|---|---|---|---|
| 31以上 | 中盤の深さ20(75%) | 中盤の深さ20(73%) | 中盤の深さ20(74%) |
| 29~30 | 最後まで85% | 最後まで87% | 最後まで93% |
| 28 | 最後まで85% | 最後まで87% | 最後まで98% |
| 27 | 最後まで98% | 最後まで98% | 最後まで98% |
| 25~26 | 最後まで98% | 最後まで98% | 最後まで99% |
| 24以下 | 完全読み | 完全読み | 完全読み |
| 1局の平均時間 | 5.15秒 | 8.55秒 | 8.68秒 |
※ 1局の平均時間は、強さの比較対局2,000局で、エンジンごとに1局で使った探索時間を合計して平均したものです。時間はエンジン自身が報告した探索時間で、コマンド処理や入出力は含みません。複数の対局を同時に行ったため、絶対値ではなくエンジン同士の比較として見てください。
適用
- Web: 解析や評価をはじめとするFlipSightのエンジン機能には、すでにFlipMindが使われています。
- iOS、Androidアプリ: v2.0.5からFlipMindが使われます。アプリをv2.0.5以上に更新してください。
エンジンの中核が変わったため、予想していない問題があるかもしれません。おかしな点があれば、メッセージ、メール、診断の送信などでお知らせください。すぐに確認して直します。