学習スレッドのスリープ時間と学習速度の関係

 現状では少ない計算資源の下でできるだけAlphaZeroの設定に近づけるために、学習スレッドは1ステップごとに定数時間のスリープ時間を入れて、学習量に対して生成量が十分になるように調整している。スリープ時間をどの程度にすれば良いのかを決めるため、今回は3つの設定で学習を行った。

  • 256gen_0.5M : 1ステップあたり256局面を生成するのにかかる時間だけスリープし、計0.5Mステップ学習する
  • 128gen_1M : 1ステップあたり128局面を生成するのにかかる時間だけスリープし、計1Mステップ学習する
  • 64gen_2M : 1ステップあたり64局面を生成するのにかかる時間だけスリープし、計2Mステップ学習する

 スリープ時間が短いものではその分学習ステップ数を多くするようにして、どれも最終的な学習時間(生成量)はほぼ変わらないように設定した。

実験結果

 対局まで行う余裕はなかったので検証損失のみで判断した。概ね棋力と損失値には相関がありそうなのでそこまで間違った判断ではないと思われる。

 横軸に実学習時間、縦軸に損失値を取ってプロットすると次のようになった。

f:id:tokumini:20200629133341p:plainf:id:tokumini:20200629133344p:plain
左:Policy損失 右:Value損失

 だいたいどれも変わらない。つまり結局生成する量が同じくらいであるならば、それを細かく刻んで2Mステップ学習しようがゆっくり刻んで0.5Mステップ学習しようがあまり変わらないということになる。

 横軸に学習ステップを取ってプロットすると次のようになった。

f:id:tokumini:20200629133357p:plainf:id:tokumini:20200629133400p:plain
左:Policy損失 右:Value損失

 同じデータなので結論自体は変わらない。生成量自体が本質的に重要なところであり、学習間隔はわりとどうでも良いということになる。同じ性能であるならば学習ステップ数は少ない方が学習にかかる時間がほんの少しだけ削減できるので良いと思われる。

 これも含め学習率減衰とかもいろいろ試していたが、わりと空振りという感じで残念。やはりそういう非本質的な改善では一歩先には届かなそう。