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

 現状では少ない計算資源の下でできるだけ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損失

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

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

AtCoder Beginner Contest 171

結果

順位   3812th / 10526
パフォーマンス   856
レーティング  1784 → 1718(-66)

 気が狂うほど何もわからない回だった。二夜連続の3桁パフォーマンスは精神に来る。先週が+49, +45で喜んでいたら今週-63,-66でひどい取り立てだ。借金取りだってもう少し良心的だぞ。

A - αlphabet

 本当はislowerとか使いたいんだけど調べる手間が惜しくて普通に判定してしまった。良くない。

 提出

B - Mix Juice

 ソートして前から K個だけaccumulate。提出した後 K \gt Nのケースがあるんじゃないかと思って一瞬ヒヤッとした(制約でそうならないことは保証されていた)。

 提出

C - One Quadrillion and One Dalmatians

 WA出しまくり、30分くらい考えて解けなかったので飛ばした。単純な26進法ではないということに気づくのにまず時間がかかったし、気づいた後も上手く処理する方法がわからなくて無理だった。文字数を見る発想は一切なかったので上手くループで処理するしか道はなかったわけだけど、ループごとに-1していけば良いとか異常発想でしょう。いやそう思えてしまうのは本質が見えていないからなのだろうけど……。

 解説ACした後もなんだか腑に落ちない感覚が強い。0に相当する記号を持たないからこんなに変なことになっているという理解でたぶん合っていると思う。普通だと01 = 1なのだけどaが0じゃないからabがbではなくて、その分のズレがどんどん生まれていくというような。難しい。難しいっす。

 提出

D - Replacing

 std::mapで数を管理しながら見ていくだけ。簡単で良かった。ここに激ムズ問題が置かれて解けなかったりしたら心臓発作で死んでいたかもしれないな。

 AtCoderの提出で見るとaddsubがハイライトされるのはなんなんだろう。予約語ではないと思うが……。

 提出

E - Red Scarf

 サンプル1をビットで見ると、各桁で1が偶数だとそのままで奇数だと反転しているということがわかるのでそう書くと通る。これも無証明なのでダメだなぁ。自分がやっていることがXORそのものだということがさっぱりわかっていない。解説PDFのような考えをしているわけではないので。ひどい。

 提出

F - Strivore

 C問題は考える気が起きなかったので戻らず、以降はずっとF問題を解いていた。が、まぁ解けなかったというわけで。何を食えばこの発想に至るのか、解説ACをした後でもわからん。 

 提出

最近木探索について考えていること

 最近、「探索の仕方自体を学習する」手法について興味が出ている。AlphaZeroの手法をニューラルネットワーク + モンテカルロ木探索として分けて見た場合、前者は学習されるが後者は固定的なアルゴリズムとなっているため、ここを学習にすることができればより性能が高まる可能性があるのではないかと感じたためだ。特に静止探索的な概念を踏まえて、「ある局面で探索を打ち切ってよいか」という判断を行うことで、評価が安定しにくい局面などで改善ができるのではないかと思っている。

 探索というものは次の3モジュールによってモデル化できるのではないかと考えている。

f:id:tokumini:20200619133856p:plain
探索のモデル

 たとえばAlphaZeroでは

というように解釈できるのではないかということだ。

 自分の研究を振り返ってみると、B4のときはAlphaZeroにCategorical DQNを混ぜるということをやっていて、これは上の図で言えば評価器の改善を目指したものだった。M1では先週JSAIで発表したように遷移モデルの学習について研究をしていて、これは図の中央にそのまま相当する。というわけでM2で一番上の部分を扱うとすれば統一的に解釈できるのかもしれない。まぁそのために無理やり捻り出した感もあるモデルなのだが。

 探索マネージャの学習について、知っている限りで一番近そうだと思っている論文は以下の「Learning model-based planning from scratch」というDeepMindが2017年に出したもの。(僕DeepMindの論文を後追いしているだけの人間では?)

 上の論文で記憶モジュール(LSTM)が使われているように、探索マネージャには記憶(特にワーキングメモリ)が必要であるように思われる。たとえばモンテカルロ木探索では置換表がそれまでの探索結果を記録しており、それを参照することで次に探索するべき局面を決定している。(αβ探索では置換表は絶対に必要なものではないが、再帰関数を使っているループそのものが他の行動の価値を記憶している部分と見なすことができる……?)

 ワーキングメモリとしてLSTMで十分なのか、もっとリッチなもの(Neural Turing Machineとか、それをさらに発展させたらしいDifferentiable Neural Computersとか? ちなみにこのDNCもDeepMindの論文)を使う必要があるのかはよくわからないが、木探索では感覚的には明瞭な記憶が必要な気がするのでLSTMよりは外部メモリを明示的に使う手法の方が良さそうかなと思っている。

 全体として探索自体の学習というのはかなりロマン寄りの研究テーマっぽいのでまともな形(実際にプログラムに組み込んでSOTAが達成できるということ)にはならなさそう。「次に評価するべき局面と行動」をどう指定するのかとか、評価結果をどういう形で取り込むかとか、そもそも木という制約を上手く入れないとまともな学習はできなさそうだとか、課題は多い。

 なにか似た論文の情報や質問等あればコメント欄なり@tokumini_ssなりに教えてもらえるとありがたいです。

【コンピュータオセロ8】全結合ネットワークでの学習・対局

要約

 全結合ネットワークにした場合、CNNの場合よりもレートが200ほど落ちてしまった。オセロにおいて終盤の評価が難しいのはゲームの性質による問題の可能性がある。

背景

 オセロでの対局を検証していると、終盤での状態価値推定の精度が良くないのではないかという疑念が生まれた。たとえば、以下のような局面においてNNによる推論では評価値分布は中央図のようになるが、実際のところはこれは引き分けであり、右図のような評価値が正しい。

f:id:tokumini:20200612132906p:plain

 原因の一つとしてCNNが局所的な特徴しか取れていないため全体を考慮した判断ができていない可能性を指摘いただいた。

 よって全結合NNにして実験を行った。

実験

 今までチャンネル数64の残差ブロック5(つまりおおよそ10層CNN)としてたNNを、隠れ次元数512、5層の全結合NNに変更して学習、対局を行った。

実験結果

f:id:tokumini:20200612133418p:plain

 CNNよりもレートが200以上下がってしまった。終盤の様子を見てみても、やはり価値推定の精度はあまり高くなさそうだった。

f:id:tokumini:20200612133904p:plain

考察

 オセロの終盤で価値推定精度が低いことは、ネットワーク構造の問題やプログラムのバグなどではなく、ゲームの性質に由来する本質的な問題であると思われる。(将棋の方でこういう乖離があまり起きていないのは、自己対局だと中盤の時点で差が付き、一手差争いのような終盤になっていないためである可能性が考えられる。)

 上の図のように、終盤の局面から探索が開始される場合は800回の探索中に終端に行き着くので評価が間違っていることがわかるが、800回目の探索で丁度終局の一手前などとなる場合、そこで得られるNNでの評価がめちゃくちゃであるため探索に悪影響が出ていそうだ。

 これに対処するためには、価値推定の精度を上げる工夫を入れるよりも実際に盤面を動かして勝敗判断をした方が効率が良い可能性がある。つまり、ネットワークを大きくすることなどではなく、探索中の工夫により改善を目指したいものであるように感じられる。

 一つ考えているのは静止探索的な概念を導入することだ。

竹内 聖悟,金子 知適,山口 和紀 局面の情報を利用した,静止探索中の動的手生成

 将棋でも、たとえば詰ましにいって王手をかけている途中で形勢判断をすることにはあまり意味がないと思われる。しかし現状のMCTSではそのような局面でもValueを推論し、その結果をバックアップしていくため、末端以外で評価を勘違いしていた場合など評価がおかしくなっているかもしれない。

 とはいえ、MCTSの都合上、途中でノードの評価をスキップしてしまうとPolicyが展開されず探索を進められなくなってしまうので、完全に評価しないということは難しそうであり、Valueのバックアップにおいて今回の評価値をどの程度寄与させるかを調整するなどが現実的な手段かもしれない。

【コンピュータオセロ7】優先度付き経験再生の検証

要約

 優先度付き経験再生はオフにした方が良さそう。

背景

 比較実験でAlphaZeroの学習が妙に弱いことがわかった。

 原因として優先度付き経験再生が悪さをしている可能性が考えられた。優先度付き経験再生は1年前の検証で結果が良かったので採用したのだが、実装などが大きく変わりレートも上がった現在だとかなり事情が違うかもしれない。

 優先度付き経験再生は損失を基準にやっている。N個のデータがリプレイバッファに格納されているとして、 i番目のデータ選択される確率 p_iを前回計算した損失 l_iを用いて


p_i =  \frac{l_i^{\alpha}}{\sum_j l_j^{\alpha}}

と計算する。 \alpha = 0とすると確率が \frac{1}{N}となるので通常のランダムサンプリングに一致する。

実験

 前回の結果(の一つ)は \alpha = 2のものであった。比較対象として新たに \alpha = 0で各実験をやり直した。

f:id:tokumini:20200522190603p:plain

  \alpha = 0とするとAlphaZeroにおける性能がものすごく改善され、ScalarやCategoricalでも \alpha = 0の方が性能が良かった。ScalarやCategoricalでの改善量は微差だが、全体として優先度付き経験再生はオフにした方が良いということになる。

 この点から考えてみると、 \alpha = 2でCategoricalの性能が良かったのは、Value損失の計算方法が違う影響で損失のばらつきが小さくなるなどして、優先度付き経験再生の悪影響を受けにくかったということなのかもしれない。学習中の損失を見てみると

f:id:tokumini:20200522212816p:plainf:id:tokumini:20200522212819p:plain
左:Policy損失 右:Value損失

となっており、 \alpha = 0のときはPolicy損失が改善されることがわかる。Value損失はCategoricalの場合に大きいことがわかり、これの影響である可能性は十分にある。

【コンピュータオセロ6】2つネットワークを使った強化学習

要約

 2つネットワークを用いて対局させても学習時間が長くなるばかりで学習高速化とか性能向上といった改善は見られなかった。

背景

 個人的に、今まで手元で行ったAlphaZero学習ほぼ全てについて、最終的に得られるモデルが

  • 対抗形に弱い
  • 穴熊の評価がおかしい

という性質を持つことについてずっと違和感を抱いている。

 これらは要するに探索範囲が狭い(生成する棋譜が特定の戦型に偏っている)ことが原因だと考えられ、特定できていないだけで居飛車についても悪影響が出ているのではないかと思っている(たとえば未検証だがじっくり組み合う相矢倉とかも弱いかもしれない)。

 探索範囲を広げるためには、複数のエージェントを学習させるという方法があると思われる。今回は単純に2つのネットワークを訓練しデータ生成はこれらを両方使って行うという手法について実験を行った。

実験

 全く同じアーキテクチャのネットワークを2つランダム初期化し、それらを用いてデータ生成、学習のサイクルを行っていく。

データ生成

 データ生成では実装の都合上、1回推論するごとに使うネットワークを切り替える方式で行った。1局面あたり800回探索(ネットワークでの局面評価)をするわけだが、そのうち400回はネットワークAを、残り400回はネットワークBを使う形になる。今まで1つのネットワークで自己対局していたところを交互に使うだけになるので、これによる計算量の増加はない。

 本当は手番ごとに入れ替えることが理想だとは思うのだが、GPUキューに貯まる評価要求局面は手番がバラバラになり得るので難しい。愚直に実装すればできないことはないが、生成速度が落ちてしまいそうなので見送っている。

学習

 学習はリプレイバッファは共通、サンプリングは別で行った。学習ステップで2つネットワークの重み更新を行うので、学習部分は計算量が2倍になるが、基本的にAlphaZero型の学習は「学習の計算時間 <<<< データ生成の計算量」となるので学習が2倍になっても総学習時間にはあまり影響がない。これは

で主張されているのと同じ。

実験結果

f:id:tokumini:20200521102233p:plain

 学習速度、性能などほとんど変化はなかった。オセロで探索範囲が狭い挙動が出ているかどうかは確認していないので、ゲームに依存する可能性ももちろんあるが、2つネットワークを使うことが一般に性能向上に繋がるわけではなさそう。

 学習時間はほとんど増加しないと思っていたが、実際はオセロだとデータ生成部分が軽いからかかなり差が出て、ネットワーク1つだと18時間45分、2つだと27時間29分であり、約1.47倍となった。冷静に考えると教師あり学習でも0.5Mステップ回そうとするとそれなりに時間はかかるので、無視できるような量ではないか。

余談

 以下余談。穴熊や、そもそも振り飛車みたいな居飛車とは大きく異なるような指し方を発見するためには、一つ一つの指し手レベルでのランダム性ではなく方針レベルでのランダム性が探索において重要そうな気がしている。それを実現する上でマルチエージェント的にやっていくというのは自然な方向に思われるが、今回みたいに雑にやって上手くいくというわけではなさそうか。もちろんオセロだったから変わらなかっただけという可能性も十分にあるが……。

 マルチエージェント的なやり方をするにしても複数のネットワークを(同程度の棋力を持ちつつ)性質の異なるものとして学習させる必要がありそうだとは思っていて、全体を見て制御する主体が必要になりそう。そうなるとほぼ階層的強化学習そのものなのでは? という気もするが、良い定式化の方法を知っているわけでもない。

 そもそも問題意識自体が合っているのかどうかもやや不安になるところ。AobaZeroとかは普通に後手四間飛車を指すらしいし、Miacisが振り飛車を指さないのは単にハイパーパラメータのちょっとした違いが原因だったりするのかもしれない。データ生成量が少ないまま学習を繰り返すので最初に発見した良いやり方(それは飛車先を突いていく場合が多そう)にすぐ適合してしまい、振り飛車が切り捨てられるのが早すぎるという可能性もありそうなところ。むつかしい。

【コンピュータオセロ5】比較実験

 前回、余計な探索の工夫を入れようとしなければカテゴリカルモデルがやや性能向上に寄与していそうだという結果が得られた。今回はより詳細に実験を行い、差がありそうかどうかを検証した。

実験

 次の3手法についてAlphaZeroと同様の強化学習を実行して、Edax(Level 6)と対局し性能を測定した。

手法 学習 探索
Categorical TD(0.75) 分布から期待値を計算しAlphaZeroと同様のMCTS
Scalar TD(0.75) AlphaZeroと同様のMCTS
AlphaZero TD(1) AlphaZeroと同様のMCTS

 ※カテゴリカルモデルモデルではTD(1)で学習することはできない(しても良いが、どうせ1,0,-1の3値しか使われないので意味がないと判断している)(いや、実はそれでも意味がある可能性が?)

 学習、対局に使用したマシンはGTX 1080が2枚搭載されているマシンであり、各手法2回ずつ実験を行った。対局は800回の探索を探索バッチサイズ4で行った。

実験結果

f:id:tokumini:20200519174921p:plain

 結果としては

  • カテゴリカルモデルにすることでレート+40程度
  • TD(\lambda)のパラメータを1から0.75にすることでレート+260程度

と言える。後者の方が寄与が大きく、前者は誤差程度に感じられる。また、AlphaZero(TD(1))はまだ伸びている傾向があり、学習が遅いだけでここから逆転することもひょっとしたらあり得るかもしれない。

 個人的にはTD(\lambda)のパラメータだけでここまで変わることにやや違和感はあり、AlphaZeroの学習がなにかおかしいのではないかと心配になる。実装は本当にパラメータを一つ変えているだけなのでバグということはないかもしれないが、勝手に入れている優先度付き経験再生との組み合わせが悪いという可能性はあり得るか。初期局面にもValueの教師信号が1 or -1で来ると損失としては大きい値になり、優先的に再生されそうなので。

 TD(\lambda)部分に新規性はほぼ無いため、この結果ではなぁと思うところ。そもそも探索に有効活用できるという売りも吹っ飛んでいるわけで。一応論文をちゃんと書く作業は進めてみたいが、まともな形になる気はあまりしない。

【コンピュータオセロ4】期待値をもちいた探索

要約

 オセロに関しては分布の形状を利用した探索ではなく分布から期待値を出して通常のMCTSを行う方が性能が高い。

背景

 前回など、カテゴリカルモデルがスカラーモデルよりも性能が悪い問題について、以下のような指摘をもらった。

 特にカテゴリカルモデルで、自分なりの探索手法を入れているとこの「終局までの手数」を見る傾向が強まっているように思う。

 今行っている探索手法は、分布から現状の価値を超える確率を計算し、それをUCB計算においてボーナス項として利用するものである。こうすると、期待値が同じでも分布が両端に割れるほど優先的に探索されるため、擬似的に進行度をもとにした探索を行っていると考えられる。

 将棋ではこれが有効である結果が多い(と思っている)のだが、ゲーム性に依存する可能性は高い。よって今回は分布から期待値を出して通常のMCTSを行う方式にして、学習及びEdaxとの対局を行った。

実験結果

 baselineが今までの探索手法での学習・検証、exp_searchが分布から期待値を取って通常のMCTSをやる探索での学習・検証として、Edaxとの性能を比較すると次のようになった。

f:id:tokumini:20200513100132p:plain

 exp_searchの方が高い性能となった。やはりオセロにおいては分布の形状を利用した探索が有効ではないと考えられる。

 スカラーモデルと比較すると

f:id:tokumini:20200513101102p:plain

となり、やや学習が速い、最高性能が高いという可能性はありそうだ。そこまで明確な差でもなさそうだが、もう少し検証を重ねてみたい。

教師あり学習での実験いろいろ

要約

  • cosine annealing : 学習率一定よりは良さそうだが、適切なタイミングで1/10する場合よりも良いかというと微妙そう。しかし適切なタイミングを調べるのも大変なので、その手間を省くという意味では有用か
  • dropout : Value損失は改善するがPolicy損失は悪化する
  • weight decay : 少し小さめの学習率、あるいはcosine annealingと組み合わせると効果がありそう

実験

 強化学習を回すのは時間がかかるので、ネットワーク自体の改良は教師あり学習で検証することにしている。今回は次のものを試した。

  • cosine annealing : 20Kステップ周期で学習率を0.025から0.0025までcos関数の0~πに従って下げていく。下げ終わったら0.025からまたリスタート。
  • dropout : PolicyとValueに分岐する直前の層についてだけ確率0.5でdropoutする
  • weight decay : 係数1e-4の重み減衰をかける

 どの実験も基本的にバッチサイズ512で400Kステップ回した。OptimizerはMomentum付きSGD

 学習データはいつも通りfloodgate2015年の棋譜を検証データ、2016年~2019年の棋譜を学習データとして、どちらも両対局者のレートが2800以上のもののみを使用した。学習データについては左右反転のデータ拡張もありで計31,001,064局面、検証データはデータ拡張せず3,192,805局面。

 各設定で1回しか実験を回していないので、特にbaselineでたまたま悪い結果を引いていたりすると結論が変わりそうだが、目をつぶっていただく方向で……。個人的な印象としてはそこまで結果がブレることはないと思っているのだが。

baseline

 まずは基準となる今までどおりのネットワーク。学習率を0.025から開始し、50%、75%地点である200K、300Kステップ目で学習率を1/10にする。

f:id:tokumini:20200509192459p:plainf:id:tokumini:20200509192505p:plain
左:Policy損失 右:Value損失

 学習を続けているとPolicy損失の方は順調に下がるが、Valueの検証損失はわりと早い段階で下げ止まる。Valueについては過学習気味だと判断できると思う。

1要素だけ導入

cosine annealing

f:id:tokumini:20200510102407p:plainf:id:tokumini:20200510102411p:plain

 以下基本的に緑線赤線を下回ると嬉しい、そうでなければ悲しいという見方ができる。

 200Kまではcosine annealingの方が小さい損失になっているが、200Kでbaseline側が学習率1/10になって急激に下がるのでそこで逆転される。Value過学習もきっちり起こっているので微妙そう。

 しかし強化学習だと、学習の立ち上がりが早ければ、良いデータが生成されるタイミングが早くなるので良い可能性もある。また適切な学習率減衰タイミングを見定めるのが大変なので、何も考えず1回Validationを行うタイミングを周期としてcosine annealingをするというのはありかもしれない。個人的にbaselineのような学習率減衰方法だと検証損失のグラフに段ができるのが好きではないという事情もある。

weight decay

f:id:tokumini:20200510102839p:plainf:id:tokumini:20200510102842p:plain

 200Kまでの性能は重み減衰ありの方が悪いのだが、学習率減衰が起こったタイミングで逆転する。重み減衰をかけると重みパラメータが基本的に小さくなるので、相対的に見て学習率が大きくなると考えられる。重み減衰なしの場合より学習率を小さめにした方が良いのかもしれない。

 Value損失もやや改善されていそうだが、検証損失だけでなく学習損失も改善されているので、過学習の抑制ではなさそう?

dropout

f:id:tokumini:20200510103217p:plainf:id:tokumini:20200510103221p:plain

 Valueの検証損失は結構大きく改善された。一方で学習損失は悪化しているので、お手本のような過学習抑制という印象を受ける。しかしPolicy損失はやや悪化しているのが気になるところ。

cosine annealing and weight decay

f:id:tokumini:20200510103719p:plainf:id:tokumini:20200510103723p:plain

 重み減衰が小さい学習率で有効そうだったので、cosine annealingと組み合わせるとどうかという実験をした。検証損失についてPolicy損失はほとんど変わらず、Value損失はやや改善された。

全部入れ

 cosine annealing、dropout、weight decay

手違いで2回学習を回してしまった。

1回目

f:id:tokumini:20200510104442p:plainf:id:tokumini:20200510104445p:plain

2回目

f:id:tokumini:20200510104411p:plainf:id:tokumini:20200510104414p:plain

 Value損失は改善、Policy損失はやや悪化という感じ。もう少し回せばPolicy損失も同水準まで来るかもしれない?

全部比較(検証損失)

f:id:tokumini:20200510105420p:plainf:id:tokumini:20200510105423p:plain

 Policy損失についてbaselineを下回ったのは

  • weight_decayのみ
  • cosine_annealing_and_weight_decay

 Value損失についてbaselineを下回ったのは「cosine_annealingのみ」以外全て。

 バランスとして見るとcosine_annealing_and_weight_decayが一番良さそう。dropoutを入れた場合は「Value損失は改善するがPolicy損失は悪化する」という傾向がはっきり出る。どちらの損失が重要なのかは不明。

  1. Policy損失は学習損失と検証損失の差が小さいが、Value損失では差が大きい
  2. dropoutを入れた場合にValue損失は改善するがPolicy損失は悪化する

という2点から、Policyの方は学習データと検証データの分布にあまり違いがなく、Valueの方は違いが大きいと解釈できそう。なのでdropoutはValue側の全結合層にだけ入れたりした方がよいかもしれない? しかし強化学習でやる場合はPolicyの分布も大きく異なるかもしれない。結局強化学習でも試してみるしかないというようなところはある。

余談

 こういう線の色だけで区別させるグラフは色覚異常の人がわかりにくいのでやめろとよく言われるが、自分用としては見やすいのでこうしてしまう。論文とかで発表する場合はともかく、ブログ記事でどこまでちゃんとやるかは難しいところ……。

【コンピュータオセロ3】Valueの損失を定数倍することの効果

要約

 オセロにおける強化学習で、損失関数のValue側のみ2倍,4倍とすることでは性能は上がらなかった。

背景

 数日前に読んだ論文で、AlphaZero形式の学習について計算量の増加を抑えつつハイパーパラメータを上手く探索する手法が提案されていた。

 この手法により調整された結果として、損失関数におけるValue側の値のみ定数倍することでPolicy側とのバランスを整えるパラメータが3~5ほどに落ち着いていた(Figure 5)。

 Policy損失とValue損失を1:1で合計することが良いことなのかどうかは以前から疑問に思っており、たとえば以前の調査ではPolicy損失とValue損失ではEloレートに対する相関の程度が異なっていると思われた。

 このような背景から、今回はValue損失の係数を大きくする実験をオセロを題材にして行った。

実験

 AlphaZero式の強化学習において、損失関数は L = L_{\mathrm{policy}} + k L_{\mathrm{value}}として表すことができ、通常k = 1である。今回は k = 1, 2, 4の3つの値について実験を行った。

 500Kステップまで学習を行い、50Kステップごとに保存したパラメータについて800回の探索でEdax(Level 5)と対局することを、スカラーモデル、カテゴリカルモデルの両方で行った。

スカラーモデルでの結果

f:id:tokumini:20200508104617p:plain

 Value1倍が最も性能が良かった。

 あまり意味がない値であると思われるので今までほとんど示してこなかったが、学習損失推移は次のようになった。

f:id:tokumini:20200508104945p:plainf:id:tokumini:20200508104953p:plain
左:Policy損失 右:Value損失

 MiacisではValueの学習についてTD( \lambda)を用いており、次局面のValueは現局面のValueと近いことが予測されるので、最終結果から学習しているAlphaZeroに比べて損失の値は小さめである。グラフを見ると、Policy損失が1.6程度であるのに対して、Value損失は0.06あたりとなる。そのためValue損失の係数を大きくすることが有効かと思ったのだが、そうではなさそうだ。

 もともとの学習率がかなり限界まで大きくしたものであるため、Valueを大きくした結果学習の進みが悪くなったという可能性も考えられる。また優先度付き経験再生部分についてはこの係数を利用していないのでそこも関係あるかもしれない。実験の信頼性についてはやや疑わしいかもしれない。

カテゴリカルモデルでの結果

f:id:tokumini:20200508105612p:plain

 カテゴリカルモデルでは一応Value2倍が最も良い性能となったが、Value1倍とほとんど変わらず、Value4倍は性能が低かった。

f:id:tokumini:20200508105624p:plainf:id:tokumini:20200508105630p:plain
左:Policy損失 右:Value損失

 損失で見てもValue4倍がPolicy,Valueともに悪く、やはりValue損失の係数を調整することでの性能向上は見られなかった。

 カテゴリカルモデルではValueに相当する部分の計算方法がスカラーモデルと異なるため、Value損失の値が大きい。50Kステップ以降では基本的にPolicy損失 < Value損失となっているので、そういう意味でもカテゴリカルモデルでもValue損失を大きくする意義は薄かもしれない。

 余談だが、この実験でもやはりスカラーモデルに比べてカテゴリカルモデルの方が性能が悪く、提案手法がダメであることが明らかになりつつある。