第 30 回世界コンピュータ将棋選手権アピール文書

概要

「たこっと」は,電王戦を見てコンピュータ将棋に興味を持った筆者らが, フルスクラッチで実装した (している) 将棋プログラムです。 Web 上の解説記事や論文,Stockfish, Apery, やねうら王, tanuki- (wcsc28 版), Bonanza 6.0 のソースコードを参考にしています。

特徴

以前のたこっとから引き継いでいる特徴については過去のアピール文書を参照してください。

他者作成のプログラムの利用について

他者作成のプログラムのソースコードは利用していません。

評価関数 (ニューラルネットワーク) の初回学習用教師データを作成するために Apery の評価関数バイナリを利用しました。 この評価関数バイナリはたこっと形式に変換し、たこっとの評価関数の計算ルーチンで利用しました。 以降の強化学習では自己学習を繰り返すためこの評価関数バイナリは使用していません。

Apery の平岡様には感謝いたします。


評価関数

WCSC29 で考案したニューラルネットワークのモデル は KKP 3 駒を入力特徴としていました。 今年度はニューラルネットワークの入力特徴を KKP 以外の他の特徴にすると強さがどう変わるのかを試してみました。

全て同じ教師データでランダムな初期状態から学習させたところ KKP より強くすることはできませんでした。

他にも教師データ数を 25 億から 50 億に増やしてみたり,最適化手法をいろいろ変えたりと試行錯誤を繰り替えしましたが 昨年のモデルより目に見えるほど強くすることはできませんでした。

というわけで強化学習を繰り返して強くするしかないという結論にいたりました。


強化学習

2019 年末くらいから強化学習を始めました。 自宅 PC より 5 倍近く早いマシンを使用しても 1 分当たりの教師データ生成量が約 23000 個でした。 1 ヶ月で約 10 億個 (= 23000 * 60 * 24 * 30) です。

ヤバイ...

ニューラルネットワークの計算が従来の KPPT 3 駒よりだいぶ重く,探索深さをある程度深くすると生産量が全然増えません。 20 億弱貯まったところで 1 度強化学習したところ,多少は強くなったようです。 このペースでは話にならないので GCP で仮想マシン (VM) を投入することにしました。

計 3 台の VM を投入しました。 1 分当たりの教師データ生成量は約 35000 個です。

VM って思ったより低スペックなのね...

と N2 のコスパが良いことがわかったため Google 様に上限の増加申請を行いました。 しかし,何度申請しても 25 コア以上は却下されます。
涙しか出ません。


開発環境

コストダウンのために GCP のプリエンプティブタイプの VM を使用しています。 起動後 24 時間以内に停止させられる (プリエンプトされる) ため,教師データを自動生成するための環境を構築しました。

Google Cloud Storage (GCS) に以下の動作をする起動スクリプトを配置し,VM 起動時に実行するように設定しました。

  1. GCS のバケットをファイルシステムとしてマウントする
  2. 生成した教師データをローカルの永続ストレージから GCS のバケットへ同期する
  3. 生成した教師データをローカルの永続ストレージから削除
  4. 教師データの生成を開始

これで VM を起動するだけで教師データが GCS のバケットに貯まるようになりました。 GCS に教師データを同期しているのはデータがあちこちのストレージに分散することを回避し, ローカルの永続ストレージサイズを小さくしてコストを抑えるためです。

しかし,これだけでは寝ている間や仕事中にプリエンプトされると教師データ生成を再開できません。 そこで,最小の VM を 1 台常時稼働させ cron で定期的に教師データ生成用 VM を起動させるように設定してあります。

スーパーマリオの無限 1UP 状態です。
若い人は知らんか...

また,GCS のバケットには教師データ生成プログラムや評価関数バイナリ,教師データ生成のための設定ファイルなどが配置してあり, このファイルを差し替えるだけで全ての VM の教師データ生成条件を変更できるようにしてあります。

WSL 上に gcloud ツールをインストールして GCS のバケットと自分の PC のディレクトリ同期させるスクリプトも作成しました。 PC 上でファイルを編集して,このスクリプトを実行すれば,教師データ生成条件や評価関数バイナリを簡単に差し替えられます。

最近何の開発してるのかわからなくなってきました...