結論MCTSの行動価値を漸進的に更新する実装で、総和を保持して平均化する実装と同程度の性能を達成できた。以前、MCTSにおいて行動価値を漸進的に更新する方法について記事を書いたが、性能が悪化してしまった。足しており、正しい探索回数になっていないためだと思われる。別に保持するように変更した。置換表エントリ各行動についてバーチャルロスを保持する変数を置換表エントリに加える。保持する必要がなくなる。結局使用メモリ量はほぼ同じとなる。置換表エントリの主要なデータは次のようになる。std::vectorで保持されているもののサイズは合法手の数と一致する。行動価値は次状態の価値を参照することで得る。次状態の価値を参照する際に、手番が変わるので反転させる必要があることに注意。バーチャルロスの和を用いてUCB値を計算する。max_index;}バックアップバックアップ時にバーチャルロスを0へと戻していく。その総和は1足すだけで良い。ここで価値を漸進的に更新する。小さく評価されてしまう。今回のようにバーチャルロスを別に保持することでこの欠点も直すことができる。86.5%誤差の範囲内かもしれないが、漸進的更新の方がやや強くなる結果となった。強くなる要因としては、同一局面へ違う進行で合流した際に良い価値を返すことができている可能性が考えられる。従来の実装では保存しておいたニューラルネットワークの出力のValueをそのままバックアップしていくことになるが、今回の実装では漸進的に更新をしているため単なるニューラルネットワークの出力値よりは良い推定値になっていると考えられる。そこまで大幅な性能向上でもなく、弱くなっていないことが確認できたことが重要となる。置換表エントリにはバーチャルロスをint32_t型で確保したが、この変数は最大でも探索バッチ数までしか増えないので4Byteも使う必要はない。1Byteでは不安だが、2Byteあれば十分だと思われる。することで従来の実装では価値の総和として4Byteの浮動小数点型を確保する必要があったのに対して多少のメモリ消費量削減となる。(個人的に)もっと重要な点は、Categorical分布を保持するときのメモリ消費量が抑えられることである。保持するために通常のAlphaZeroよりも約51倍のメモリが必要になっていた。これにより秒数制限よりも置換表のサイズ制限の方へ速く到達してしまうような状況だったのだが、今回の実装によって使用メモリ量がだいたい1/50となったため問題なくなった。今までは学習部においてもメモリ消費量の問題からActorの並列数を増やせなかったのだが、今後は並列数を増やすことで多少データ生成速度が上がるのではないかと思われる。38分51秒(1WA)で全完、103位だった。月別アーカイブはてなブログをはじめよう!tokuminiさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。