バッチサイズと性能の関係

前書き

 AlphaZeroが4096という大きなバッチサイズで学習しているのに対して、Miacisは64という小さいバッチサイズでの学習を行っている。AlphaZeroに比べて使える計算資源が少ないためデータの生成速度が小さく、バッチサイズが大きいと同じデータを何度も学習することになってしまい学習が上手く進まないのではないかと予想しているからである。今回はバッチサイズの違いによる性能の変化を実験により確かめてみた。

実験

 バッチサイズと学習率以外の条件は全て揃えて、カテゴリカル分布を出力するモデルについて200kステップの学習を行った。学習率はバッチサイズが4096のとき0.2(AlphaZeroの設定)、64のとき0.01とした。これは以前の実験から良いと考えられた値である。記事内の「バッチサイズに比例させるのが良い」という説から計算できる値0.2 \times \frac{64}{4096} = 0.003125よりは大きい値で設定している。その他パラメータ、実験設定も先の記事に準ずる。

 実験結果を次の表に示す。

バッチサイズ Policy損失 Value損失 技巧2(深さ1)に対する勝率 総学習時間 生成局数
4096 3.81 0.829 12% 62.4時間 125,600
64 3.01 0.781 63% 86.6時間 173,400

 バッチサイズが大きいと損失が大きいままになっており、実際に対局を行っても性能は悪化していることがわかる。バッチサイズを大きくすると学習に時間がかかるため、その間にActorが動く時間も増え、全体として生成される局数自体は増えている。それにも関わらず性能が悪化していることから、バッチサイズを大きくすることが悪影響を及ぼしていると考えられる。

今後の展望

リプレイバッファサイズとの関係

 本来はバッチサイズを大きくした分、リプレイバッファのサイズも大きくしなければならないのかもしれない。メモリ量の問題もあるためバッチサイズに比例するだけ大きくできるわけではないが、検証してみるべき要素ではあると思う。

 リプレイバッファサイズはバッチサイズとの関係を抜きにしても様々な検証をする価値があるパラメータである。Oracle Developersの記事では徐々に大きくしていく方式が取られており、そのような工夫も一考の余地がある。

小さいバッチサイズでの学習

 バッチサイズを64よりももっと小さくすることで小規模な計算資源しかない環境でも良い学習ができる可能性がある。その際に問題になるのはニューラルネットワーク内部で使われているバッチ正則化であり、バッチ正則化はバッチサイズが小さくなると性能が悪化することが知られている。それを改善する手法としてBatch Renormalization(日本語解説スライド)やWeight Standardization

という手法がある。これらの手法を採用することでバッチサイズを小さくしつつ上手く学習を進めることができるかもしれない。