「たこっと」は,電王戦を見てコンピュータ将棋に興味を持った筆者らが, フルスクラッチで実装した (している) 将棋プログラムです。 Web 上の解説記事や論文,Stockfish, Apery, やねうら王, tanuki- (wcsc28 版), Bonanza 6.0 のソースコードを参考にしています。
以前のたこっとから引き継いでいる特徴については過去のアピール文書を参照してください。
他者作成のプログラムのソースコードは利用していません。
評価関数 (ニューラルネットワーク) の初回学習用教師データを作成するために Apery の評価関数バイナリを利用しました。 この評価関数バイナリはたこっと形式に変換し、たこっとの評価関数の計算ルーチンで利用しました。 以降の強化学習では自己学習を繰り返すためこの評価関数バイナリは使用していません。
Apery の平岡様には感謝いたします。
昨年の大会 (世界コンピュータ将棋オンライン大会) までは WCSC29 で考案したニューラルネットワークのモデル (KKP 3 駒) を評価関数にしていました。
この方式は評価関数の計算に時間がかかるため,教師データを作成するのに時間がかかります。 また,学習時に大量のメモリ (64GB 以上) を消費するという課題もありました。 本年は KP 2 駒 (tanuki- で考案された NNUE 方式) を採用することにしました。
教師データの作成や学習にかかる時間を大幅に短縮することができ,いろんなことをお試しできるようになりました。
チャレンジされているチームの方はご存知だと思いますが,ランダムに初期化されたモデルから学習を収束させるのはそれなりに苦労します。
ニューラルネットワークで用いられることが多い最適化手法の 1 つ Momentum では収束しきらなかったり,発散したりします。 また,ニューラルネットワークではない KPP 3 駒のモデルで用いられていた AdaGrad では学習が進まなくなったりします。
これは以下のような理由によると考えられます。
学習に使う教師データは将棋の 1 局面です。局面は KP 2 駒の場合,約 25 万の特徴 (81 * 1534 * 2,非合法な特徴 (駒の重なりやルール上許されない配置) を含む) で表現します。そして,この特徴を one-hot で入力層に与えます。このとき hot になるのは 76 の特徴だけで他は 0 です。 そのため,1 局面を学習するとき,入力層と中間層のリンクの重み (図の赤い破線) の大半は更新されません。 このようなスパースな特徴を学習する場合の最適化手法は AdaGrad が適しています。
一方,中間層以降は数 10 ユニットしかなく,各ユニットがそれなりに発火するのであれば,リンクの重み (図の青い破線) の大半が更新されることになります。 このような場合の最適化手法に AdaGrad を用いると学習順が後の局面からは何も学習しなくなってしまうため,Momentum の方が適していると考えられます。
つまり AdaGrad であっても Momentum であってもどちらも一長一短があり,学習率の調整だけでモデルの学習をコントロールするのは困難です。
そこで入力層は AdaGrad,入力層以外は Momentum で学習させるようにしました。 各々の学習率を調整する必要はありますが,モデルの学習を収束させることが容易になりました。