バッチサイズとステップあたりの学習速度の関係〜強化学習編〜

結論

 強化学習でもバッチサイズとステップあたりの学習速度は比例しそうだ。あるデータ生成速度に対して学習可能な範囲でバッチサイズを上げていくことが学習の高速化に繋がるかもしれない。

前書き

 前回教師あり学習において、バッチサイズとステップあたりの学習速度には比例関係があるのではないかという結果を得た。今回は強化学習でもこの関係が成り立つかどうかを検証していく。

実験

実験設定

 Miacis(categorical)でAlphaZero方式の学習を行った。

項目 内容
バッチサイズ 32と64の二通り
ステップ数 200,000
リプレイバッファサイズ 2^{20}局面
学習率の初期値 0.01
学習率の減衰 100,000ステップ後に1/10
データ生成速度 1ステップあたり約30局面

実験結果

 floodgate2016年の棋譜を用いて計算した検証損失のグラフを次に示す。

f:id:tokumini:20190516152716p:plain

 今までの結果から損失はあまり棋力に相関しないと思われるが、このグラフにおいてもバッチサイズが大きいと学習が速いことがわかる。

 バッチサイズ32,64で学習されたパラメータを用いて技巧2Depth1と1手1秒で200局対局を行い、性能を評価した。

パラメータ 技巧2(D1)に対する勝率 相対Eloレート
バッチサイズ32 200kステップ時点 52.5% +17.4
バッチサイズ64 100kステップ時点 49.0% -6.9
バッチサイズ64 200kステップ時点 79.0% +230.2

 バッチサイズ32で200kステップ学習したパラメータの方がバッチサイズ64で100kステップ学習したパラメータよりやや強かったが、ほぼ同等と言える性能であった。そしてバッチサイズ64で200kステップ学習したパラメータの方がより高い性能となった。やはりバッチサイズが大きい方がステップあたりの学習速度が上がっているように思われる。

考察

 前回、計算時間がバッチサイズによらない条件として次の三つを導入した。

  1. Actorの数を\frac{1}{n}倍するならば、バッチサイズを\frac{1}{n}倍しなければならない
  2. バッチサイズを\frac{1}{n}倍するならば、ステップ数をn倍しなければならない
  3. バッチサイズによらず1ステップあたりにかかる時間は一定

 Learnerを1ステップごとにスリープさせている都合上(3)はほぼ成り立ってしまい、前回および今回の実験結果から(2)も成り立ちそうだが、(1)は多少制限が緩い可能性がある。

 まずAlphaZeroの1ステップあたりのデータ生成量を計算すると、以前山岡さんのブログで34285.71 ゲーム/チェックポイントと計算されていた。チェックポイントは1000ステップごとなので34.28571 ゲーム/ステップであり、AlphaZeroは早期に投了するようにしていることから1ゲーム平均112.5手(根拠の詳細は後述)とすると3857 局面/ステップとなる。個人的には、この値がバッチサイズ4096となかなか近い値であると判断できるのではないかと感じる。つまりだいたい1ステップあたりの生成量≒バッチサイズを目安として、バッチサイズあるいはスリープ時間を決定するのが良いのではないか。

 そして今回の実験では30局面/ステップほどの生成速度のままバッチサイズを64にしても(レートにして-25ほどの悪影響はあったかもしれないが)ほぼ問題なく学習できている。以前同じ設定でバッチサイズ4096にした場合上手く学習できなかったのでいくらでも大きくできるということはないと思われるが、できるだけ大きくすることで多少学習速度を上げることができる可能性はある。

補足:AlphaZeroの1ゲームあたりの平均手数

 AlphaZeroの論文のSupplementary MaterialsにあるTable S3に生成した総ゲーム数と1局面あたりの思考時間が記載されている。

f:id:tokumini:20190516155854p:plain

 24,000,000ゲームを5000基、12時間、1局面の思考時間約0.08秒で生成したことから1ゲームの平均手数は

\displaystyle 5000 \times 12 \times 3600 \div 0.08 \div 24000000 = 112.5

と求まる。