【コンピュータオセロ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損失を大きくする意義は薄かもしれない。

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

置換表に保持する指し手の削減

 Miacisでは一つの局面に対応する置換表エントリが持つ変数として、以下のようなものを保持している。(hash_table.hppから一部抜粋し見やすく改変)

struct HashEntry {
    int32_t sum_N;         //探索回数の合計
    int32_t virtual_sum_N; //バーチャルロスの合計

    //以下vectorとなっているものは全てmovesのサイズと同じサイズになる
    std::vector<Move> moves;          //行動
    std::vector<Index> child_indices; //各行動を取った後の置換表エントリに対応するインデックス
    std::vector<int32_t> N;           //各行動を探索した回数
    std::vector<int32_t> virtual_N;   //バーチャルロス
    std::vector<FloatType> nn_policy; //ニューラルネットワークの出力方策

    ValueType value;    //価値。漸進的に更新され、常にこのノードを根とする部分木内の価値の平均となる

    bool evaled; //ニューラルネットワークによる評価が行われたかを示すフラグ

    std::mutex mutex; //排他制御用のmutex

    //ハッシュ管理用の変数
    int64_t hash;       //局面に対応するハッシュ値
    uint16_t turn_number; //手数。ハッシュ値だけでは衝突頻度が高いので
    uint16_t age;       //置換表のageと照らし合わせて現在の情報かどうかを判断する変数
};

 ここでコメントにもある通り、std::vectorの形式で保持しているものは、この局面の合法手数だけ要素を持つことになる。基本的に将棋は終盤になると(持ち駒が増えると)平均合法手数が大きくなるため、長時間の対局を行ったとき終盤でメモリが溢れそうになってしまった。

 ねね将棋では上位16手のみを保存していると聞いたので、真似してそのような機能を実装した。なお、Miacisでは詰み探索を置換表に直接書き込む都合上、ルートにおいては合法手を全て展開し、それ以降の局面のみ、ニューラルネットワークのPolicy確率が大きい順に上位N手のみを残すようにした。

対局

  • Miacis : 1手1秒
  • YaneuraOu/Kristallweizen(4Thread, 定跡オフ) : 1手0.25秒
保持する指し手 対局数 勝数 引き分け数 敗数 勝率 相対Eloレート(±1σ)
全て 1000 535 2 463 53.6% 25.11±22.73
上位16手 500 303 0 197 60.6% 74.79±33.24

 「全て」の方の結果は少し前のものなので今の実行バイナリと完全に同じものではないとは思われるが、性能的にはほぼ変わっていないはずであり、そのときの結果よりも今回上位16手に絞った場合のほうがやや勝率が高かった。誤差の範囲内かもしれないが、性能が落ちているということはなさそうなので今後も上位16手に絞ることにする。

 上位16手に絞って性能が上がる要因があるとすれば、UCB選択で合法手を全てループするのが高速化されることが考えられる。実際に10秒の探索を10回測定して平均値を出してみると、

保持する指し手 初期局面でのNPS ある中盤局面でのNPS
全て 15685.8 13977.5
上位16手 16262.9 15806.4

となった。ややNPSが上がるメリットと、N手以降に良い手があり見落とすデメリットのバランスを見てNを決めれば良さそうだ。

【コンピュータオセロ2】カテゴリカル分布の有効性

 Miacisで用いている手法の主張点は「評価値出力をスカラーではなく、各値になる確率を示すカテゴリカル分布にすることで性能が上がり、探索にも有効活用できる」というところにある。簡単な説明はWCSC30アピール文書を参照。

 そもそも着想の元ネタの一つであるCategorical DQNAtariゲームで効果を上げたものでもあり、これは基本的にゲームによらず有効であると考えられる。よってオセロでも実験することで有効性を確認する。(なぜこれを第一回でやらなかったのか)

実験

 最終層の出力を

  • スカラーの場合1ユニット
  • カテゴリカル分布の場合51ユニット

としたモデルで強化学習を実行する。

 カテゴリカル分布を適切に学習するためには \lambda \lt 1としてTD( \lambda)を行う必要がある。TD( \lambda)の説明は、信頼性の高い英語文献としてはSutton & Bartoの『Reinforcement Learning: An Introduction 2nd Edition』を引くのが正しそう。下からPDFも見れる。

 日本語の解説は、

など。

 同じ条件で実験するため、スカラーの場合もカテゴリカル分布の場合も同じ \lambda(今回は0.75)を使う。(これによりスカラー≠AlphaZeroである。AlphaZeroは教師信号として常に最終結果を使うので \lambda = 1の場合と同値)

実験結果

f:id:tokumini:20200501162240p:plain

 あ、あれ、スカラーの方が強い……!? しかも単に運が良かったという以上に明確な差がありそう……。学部の卒論時点では3層の小さい全結合ネットワークを使い、そのときはオセロでも効果があったのだが、今回将棋と同じように残差ブロックを基本とした畳み込みニューラルネットワークにしたところ逆転してしまった。今回の手法は将棋に限っただけの性能向上なのかもしれない……。

 そもそも将棋でも本当に効果があるのか自信がなくなってきた。冒頭に挙げたスライドに載っている結果はちょっと古いものであり、対戦相手がGikou2 (depth 9)と、やや弱い段階での実験となっている。さらに言えば、このスライドの結果はできるだけAlphaZeroに従ったものであり、つまり \lambda = 1とした結果なので、実は性能向上の寄与はTD( \lambda)の \lambda \lt 1としたところが大きいのかもしれない。こんな単純なことを確認し忘れていたとは……。慌てて将棋の方でもスカラー(TD(0.75))学習を回し始めたが、結果が出るのは2週間後。この手法で論文を書くのは難しそうな雰囲気がしてきたなぁ……。

【コンピュータオセロ1】指し手選択の温度について

背景1

 手法の有効性がゲーム依存ではないことを主張するため、そして実験サイクルを高速に回せるという利点があるため、オセロでも実験をしていく。

 オセロは将棋より簡単だろうと勝手に判断してやや小さめのネットワークで学習をさせている。具体的にはチャンネル数を128→64、ブロック数を10→5にしている。さらに盤面の拡張も左右反転だけでなく盤面の回転も導入しているため、生成速度が非常に速い。0.5Mステップの学習が18時間ちょいで終わる。対戦による評価も含めておおよそ1回の実験が1日で終わるため、様々な条件を探索しやすい。

背景2

 将棋の方では、そこそこ強いパラメータが得られているものの、穴熊を学習できず弱いという問題が発生している。

 実際、学習データ生成における自己対局で穴熊のような局面は一切現れていない。

 これは強化学習における探索が不足している問題だと思われる。もっと実践的に言えば、指し手のランダム性が低すぎるということになる。

 ランダム性の入れ方として、AlphaZeroでは30手までについて探索回数を正規化した割合で行動選択をしている。しかし、この方法では何度か探索した結果悪いと判明した手についてもある程度の確率が生じてしまう点が気になる。

 Miacisでは、ターン数の制限は入れず、探索した結果得られた各行動の価値にソフトマックス関数をかけた値を確率として行動選択をしている。このとき、ソフトマックス関数には温度を導入している。

 ある局面を(800回)探索し、行動 iの価値が Q_iであるとする。このとき行動 iを選ぶ確率を、温度 tを用いて


p_i = \frac{\exp{(Q_i / t)}}{\sum_{j} \exp{(Q_j / t)}}

とする。 tは大きくすればランダム性が上がり、小さくすれば最大価値を持つ行動を選ぶ確率が高くなる。今まで将棋では t = 0.01で行っていたが、今回はこれについて調査してみる。

背景:補足

 将棋における調査

学習

 AlphaZeroと同様の強化学習を行う。学習のコードはほぼ将棋と共通となっている。温度を t = 0.01, 0.025, 0.05, 0.1の4通りで試した。

対戦相手

 オセロでの対戦相手としてはEdaxを用いる。

 対局条件を揃えるためにMiacis側でダウンロードスクリプト対局スクリプトを書いている。

学習結果

f:id:tokumini:20200430145233p:plain

 オセロと将棋では事情が違うかもしれないが、温度が t = 0.025, 0.5の方が今までの t = 0.01より良い結果となった。将棋でももう少し大きい温度で実験し直してみるべきかもしれない。

Miacis WCSOC2020版

 世界コンピュータ将棋選手権のオンライン大会(WCSOC)に向けて、これ以上レートが伸びそうにないのでここで結果をまとめておきます。

実行ファイル

 Windows向け実行ファイルをGitHubで公開しています。

 CPU版

 GPU

 CPU版はNPS50くらいしか出ないのでほぼお試し用です。GPU版もWindowsではなぜかNPSが低く、手元では3,000くらいしか出ませんでした(コンパイル時に最適化を上手くかけられていない気がします)。Ubuntu 18.04では16,000くらい出るのでUbuntu推奨です。Ubuntuでの実行ファイルは……自分でビルドしていただく方針で(README.md参照)。

最終的に行った実験

学習

 ランダムに初期化したパラメータからAlphaZeroと同様の形式で強化学習

項目
バッチサイズ 512
学習ステップ数 2,000,000
データ生成速度 112.2 局面 / 秒
1ステップあたりの生成量 128 局面
学習率 0.025(1Mステップ時点で1/10、1.5Mステップ時点でさらに1/10)
リプレイバッファサイズ  2^{20} 局面
1局面の探索回数 800
マシン 2080ti × 2搭載
学習時間 672時間32分 (=28日)

学習結果

 検証損失として、floodgate2015年の棋譜からレート2800以上同士の対局者による棋譜のみを抽出し、Policyでは指し手に対する交差エントロピーValueでは勝敗を1,-1として自乗誤差を計算

f:id:tokumini:20200427131800p:plainf:id:tokumini:20200427131809p:plain
左:Policy損失 右:Value損失

対局

 CPU:Intel i7-6700K @4.00GHz, GPU RTX 2080ti

 Miacis側は1手1秒、YaneuraOu/Kristallweizen(4Thread, 定跡オフ)は1手0.2秒で対局。引き分け、入玉などのルールはWCSC30のルールに準拠。

f:id:tokumini:20200427131204p:plain

 こうしてみると1Mステップ時点でもまだ伸びているので学習率を減衰させるのが早すぎたかもしれない。

 YaneuraOu/Kristallweizen(4Thread, 定跡オフ)側も1手1秒にして500局対局した場合

対局数 勝数 引き分け数 敗数 勝率 相対Eloレート
500 94 0 406 18.8% -254.2

教師データ生成時(800探索)の性能

要約

 教師データ生成時のレートはfloodgate換算で

  • Miacis:2700程度
  • やねうら王:2800〜2900程度?
  • AobaZero:3000程度

 また探索バッチサイズはできれば1で生成するべきだとわかった。

背景

 AobaZeroが800回の探索でKrist_483_473stb_16t_100mに勝ったという話が出ている。

 800回の探索というのは教師データ生成における設定であり、これが強ければ強いほど質の高いデータを生成できるので最終的な性能も上がると考えられる。

 Miacisは128ch、10ブロックというやや小さめのネットワークを使っており、その分学習が早く終わったりNPSが高くなることに利点を見出している。しかし800回の探索については性能が低めになっていると思われるため、今回はその性能を測定した。

実験1

 対戦相手にはYaneuraOu/Kristallweizen(1スレッド 100Kノード)を用いた。細かい条件は違うかもしれないが、おおむねfloodgateのKrist_483_473stb_100k(レート2787(2020/04/11時点))と同じと考えて良いのではないかと思われる。

 対局結果は次のようになった。

対局回数 勝数 引き分け数 敗数 勝率 相対Eloレート
1000 413 7 580 41.65% -58.6

 つまりMiacisの教師データ生成時のレートは2700程度と考えられる。

 NNUE系のプログラムが一般的にどの程度の探索量で教師データを生成しているのかは知らないのだが、たとえばやねうら王公式サイトでは

depth 18 + 100kだとかdepth 18 + 200kだとか打ち切りノード数は探索部に合わせて現実的な時間に収まるように調整している。

 とあるので、Krist_483_473stb_100kのレート2787と同じくらいか、200kつまり2倍なのでレート+100程度と思われる(depth18はもっと強いのかもしれない?)。

 またAobaZeroのp800は

とおおむねレート3000近くある。

 こうして比較してみるとやはりMiacisの教師データ生成時のレートは低めであり、もう少し改善するべきだと考えれる。

実験2

 また、Miacisではデータ生成を高速化するために、学習時の探索についてもバッチサイズを4にして学習している。(32局を並列で対局するので、GPUが一度に計算する最大の局面数は128)

 バッチサイズを1より大きくすることが性能に悪影響を与えるのかどうかについても検証した。実験1と同様の対戦相手に対して探索バッチサイズのみを変えてそれぞれ1000局対局を行った。

f:id:tokumini:20200411100312p:plain

 探索バッチサイズを大きくするほど性能が落ちている。バッチサイズが大きいときにはバーチャルロスなどの関係で最善読み筋以外にも探索が割り当てられやすく、最善読み筋が伸びきる前に800回へ達してしまうためだと考えられる。

 探索バッチサイズを32などにすれば大きく性能が落ちるだろうとは思っていたが、4でもレートが25ほど落ちてしまうとは意外だった。

 並列対局数を4倍にすれば探索バッチサイズ1でも同じ生成速度になるはずだが、並列対局数を増やすとその分だけ置換表を保持する必要があるのでより多くのCPUメモリが必要になる。

余談

 現在、大学は立入禁止になっているため、パソコンが落ちると再起動させる手段がない。使用メモリ量を増やしてパソコンが固まるなどすると困るので正直いじりたくない。レート-25には目をつぶるか……。

損失と棋力の関係

動機

 Miacisでは強化学習の最中にも定期的にfloodgateの棋譜を用いて検証損失の計測をしている。対局には計算コストがかかるため、検証損失の値から大雑把にでも性能が把握できると嬉しい。よって今回はこれらの関係を調査した。

使用した結果

 基本的にはこの記事の設定通り。

 上の結果そのものではなくバッチサイズを256として学習し直したもの。

  • Eloレート
    • Miacis0.5秒、YaneuraOU/Kristallweizen(1スレッド)0.1秒による計測
  • 検証損失 : floodgate2015年の棋譜、レート2800以上の対局のみについて計測

 Eloレート、Policy損失、Value損失の順番に並べると次のようになる。

f:id:tokumini:20200403095031p:plainf:id:tokumini:20200403095043p:plainf:id:tokumini:20200403095051p:plain

 だいたいグラフの概形が同じなのでおおむね相関がありそうということはわかる。

 横軸へ損失、縦軸にEloレートを取ってグラフを描いてみる。左がPolicy損失、右がValue損失を横軸にしたもの。

f:id:tokumini:20200403095924p:plainf:id:tokumini:20200403100029p:plain

 直線で近似していいものかよくわからないが、とりあえずそれぞれGoogle スプレッドシートの機能で直線を書き込んでみた。係数はPolicy:-2135、Value:-8649ということになり、Policy損失が0.01小さくなればレートが21上がる、あるいはValue損失が0.01小さくなればレートが86上がるということを意味していると思われる。

 ついでに横軸にPolicy損失、縦軸にValue損失を取ってみると次のようになり

f:id:tokumini:20200403100356p:plain

だいたい4倍の比になる。これが上の0.01あたりのレートの上昇分の比と同じくらいということになる(まぁ同じデータをプロットしているので当然のことだが)

結論

 まとめると、少なくとも今回の試行については

  • Value損失が0.01下がる
  • Policy損失が0.04下がる
  • Eloレートが86上がる

のような関係があると思われる。

 たとえばネットワークを大きくすることを考えると、表現力が上がることにより性能が上がるメリットと、計算が重くなりNPSが落ちるデメリットのトレードオフがある。NPSが1/2になると以前の調査から

だいたいレートが100落ちると考えられる。つまり今回の結果から考えると、NPSが1/2になるような巨大ネットワークを使う場合、もとのネットワークに比べてValue損失が0.01、Policy損失が0.04小さくなる程度では全体としての性能は上がらないと予想できる。

 正直Value損失を0.01も下げるのは結構大変な気がするうえに、NPSが落ちるということは学習時間も大きくなるということなので、実験サイクルが回るのも遅くなる。本当に性能だけを目指すなら巨大ネットワークを使った方が良いのかもしれないが、比較実験をすることを考えると今以上に大きなネットワークはあまり使いたくない。