教師あり学習 + 強化学習

要約

 教師あり学習(300万ステップ)の後に強化学習(10万ステップ)を行うことでR+50.5、さらにもう一度強化学習(10万ステップ)を行うことでR+61.9。floodgateでレート3800ほどになった。

学習の全体

 ランダムパラメータから始めて、以下の3つをこの順に行った。

  1. AobaZeroの棋譜を用いた教師あり学習(300万ステップ)
  2. 強化学習その1(10万ステップ)
  3. 強化学習その2(10万ステップ)

各学習の設定

共通の設定

  • ミニバッチサイズは512
  • 検証データはfloodgate2015年の棋譜

教師あり学習

  • AobaZeroの棋譜11,500,000 ~ 14,300,00を使用(ちょっと古めで宣言勝ちは多めの時期だと思われる)
  • 学習率0.025開始
  • 6万ステップごとに学習率1/10
  • Weight Decay 1e-4
  • 使用GPUは2080ti x1

強化学習1

  • 探索回数は1600回
  • Weight Decayを入れ忘れた
  • 学習率減衰は8万ステップ時点で1/10
  • 学習スレッドのスリープ時間は、生成速度から自動調整して2.744秒(1ステップの間にミニバッチサイズの半分程度を生成)
  • 使用GPUは2080ti x2

 以下実際の設定ファイルを置いておく(自分があとで見る用)

折りたたみ

learn_rate              0.00025
min_learn_rate          0.000025
momentum                0.9
weight_decay            0.0
policy_loss_coeff       1.0
value_loss_coeff        1.0
lambda                  0.75
per_alpha               2.0
Q_dist_temperature      0.01
Q_dist_lambda           1.0
noise_epsilon           0.25
noise_alpha             0.15
C_PUCT                  2.5
use_fp16                0
draw_turn               320
random_turn             320
batch_size              512
thread_num_per_gpu      2
max_step_num            100000
learn_rate_decay_mode   1
learn_rate_decay_step1  80000
learn_rate_decay_step2  200000
learn_rate_decay_step3  200000
learn_rate_decay_step4  200000
learn_rate_decay_period 10000
update_interval         1000
batch_size_per_gen      2
worker_num_per_thread   64
max_stack_size          1048576
first_wait              1048576
data_augmentation       1
Q_search                0
search_limit            1600
search_batch_size       4
output_interval         1
save_interval           2500
validation_interval     2500
sleep_msec              -1
noise_mode              0
wait_sec_per_load       90
use_sam_optim           0
calibration_kifu_path   /root/data/floodgate_kifu/valid

# Shogi
init_buffer_by_kifu     0
train_rate_threshold    2800
valid_rate_threshold    3000
train_kifu_path         /root/data/floodgate_kifu/train
valid_kifu_path         /root/data/floodgate_kifu/valid

# Othello
# init_buffer_by_kifu     0
# train_rate_threshold    2200
# valid_rate_threshold    2290
# train_kifu_path         /root/othello_train_kifu
# valid_kifu_path         /root/othello_valid_kifu

強化学習その2

  • 探索回数は1600回
  • Weight DecayはOFFのまま
  • 学習率減衰はrestartなしの1周期Cosine Annealing
  • 学習スレッドのスリープ時間は、強化学習その1より長くしたかったので決め打ちで5秒
  • リプレイバッファサイズを通常の2倍(221局面)にした
  • 使用GPUは2080ti x2

折りたたみ

learn_rate              0.00025
min_learn_rate          0.0
momentum                0.9
weight_decay            0.0
policy_loss_coeff       1.0
value_loss_coeff        1.0
lambda                  0.75
per_alpha               2.0
Q_dist_temperature      0.01
Q_dist_lambda           1.0
noise_epsilon           0.25
noise_alpha             0.15
C_PUCT                  2.5
use_fp16                0
draw_turn               320
random_turn             320
batch_size              512
thread_num_per_gpu      2
max_step_num            100000
learn_rate_decay_mode   2
learn_rate_decay_step1  80000
learn_rate_decay_step2  200000
learn_rate_decay_step3  200000
learn_rate_decay_step4  200000
learn_rate_decay_period 100000
update_interval         1000
batch_size_per_gen      2
worker_num_per_thread   64
max_stack_size          2097152
first_wait              2097152
data_augmentation       1
Q_search                0
search_limit            1600
search_batch_size       4
output_interval         1
save_interval           5000
validation_interval     5000
sleep_msec              5000
noise_mode              0
wait_sec_per_load       90
use_sam_optim           0
calibration_kifu_path   /root/data/floodgate_kifu/valid

# Shogi
init_buffer_by_kifu     0
train_rate_threshold    2800
valid_rate_threshold    3000
train_kifu_path         /root/data/floodgate_kifu/train
valid_kifu_path         /root/data/floodgate_kifu/valid

# Othello
# init_buffer_by_kifu     0
# train_rate_threshold    2200
# valid_rate_threshold    2290
# train_kifu_path         /root/othello_train_kifu
# valid_kifu_path         /root/othello_valid_kifu

損失推移

教師あり学習

f:id:tokumini:20210325102430p:plainf:id:tokumini:20210325102437p:plain
左:Policy損失 右:Value損失

 特に言うこともなく、今まで何度も目にしてきたようなグラフが得られた。

強化学習その1

f:id:tokumini:20210325103814p:plainf:id:tokumini:20210325103817p:plain
左:Policy損失 右:Value損失

f:id:tokumini:20210325102934p:plainf:id:tokumini:20210325102937p:plain
検証損失のみ拡大(左:Policy損失 右:Value損失)

 特徴的なグラフになった。学習序盤の動きが激しい理由としては、

  1. 教師あり学習で得たValueは-1, 0, 1の3領域のみを使うものだが、強化学習のTD(λ)によってそれら以外の領域も使うようになり、その修正で大きく変わっていくため
  2. 設定ミスでWeight Decayを入れ忘れたため

の2通りが考えられるか。その他ちょこちょこ回してみた結果だと(2)の説が強めかもしれない。

強化学習その2

f:id:tokumini:20210325104322p:plainf:id:tokumini:20210325104325p:plain
左:Policy損失 右:Value損失

f:id:tokumini:20210325104354p:plainf:id:tokumini:20210325104357p:plain
検証損失のみ拡大(左:Policy損失 右:Value損失)

  • 損失の急激な上昇や低下は見られなかった
  • Policyの検証損失はやや増加傾向
  • Valueの検証損失はやや減少傾向

具体的な数値

学習方法 Policy損失 Value損失
教師あり学習終了時 1.917 0.561
強化学習その1終了時 1.791 0.605
強化学習その2終了時 1.774 0.597

学習時間

学習方法 hh:mm:ss
教師あり学習終了時 175:55:07(≒7.3日)
強化学習その1終了時 091:39:56(≒3.8日)
強化学習その2終了時 153:22:36(≒6.3日)
合計 420:57:39(≒17.5日)

 強化学習は2080tiを2枚搭載したマシンで行ったものであり、強化学習の学習時間はほぼGPUの枚数に比例するので、1枚のマシンで行うと約2倍、つまりその1とその2合計で20日程度になるかと思われる。教師あり学習と合わせて28日、約一ヶ月でおそらく再現できると思う。

対局

 YaneuraOu(評価関数パラメータはKristallweizen)との対局を行った。Miacis側1手0.5秒、YaneuraOu側はNodesLimit=800000。

学習方法 勝数 引分数 負数 勝率 相対Eloレート
教師あり学習終了時 479 208 313 58.3% +58.2
強化学習その1終了時 642 19 339 65.1% +108.7
強化学習その2終了時 720 15 265 72.8% +170.6

という結果になった。損失があまり改善されていないことからすると意外に強くなっている。

 強化学習その2後のパラメータでfloodgateに数日放流した結果、レート3840となった。

f:id:tokumini:20210325112523p:plain

 ただし、対戦相手を見るとKristallweizenが多く、単にKristallweizenに対して相性が良いというだけの可能性も捨てきれない。

所感

  • 強化学習を2回に分けているのは本質的じゃないので、上手く設定を見つけて1回にまとめたい
  • Weight Decayを入れるかどうかというのが結構大きく影響してきていそうな印象を受ける。教師あり学習直後の強化学習では勾配クリッピングとかも入れてみた方が良いのかもしれない
  • 1周期Cosine Annealingが雑に使ってそこそこ性能出る印象がある。学習率のスケジュールに悩みたくないのでしばらくはこれでやってみたいか
  • 学習時間もわりと現実的な範囲で、3090x2みたいなマシンが手に入れば結構試行錯誤できるんじゃないか