TadaoYamaokaの日記

山岡忠夫Homeで公開しているプログラムの開発ネタを中心に書いていきます。

Leela Chess Zeroウォッチ

少し古いが、Leela Chess Zeroの進化をまとめたよい記事があったので、読んでいる。
Leela Chess — Test40, Test50, and beyond - Veedrac - Medium
GitHubのissuesから拾うのもしんどいのでまとめがあるとありがたい。

Leela Chess Zeroは新しい手法をいくつも試しているので参考になる。

Test40

Test40は、それ以前のすべての実験の統合している。

Test35ゲームでシード

  • Test40の訓練開始にTest35ゲームを使用した。

SENet

AlphaZero論文とのマッチング

ゲーム終了時の温度低下
  • AlphaZeroは、最初の15手でのみ温度を使用する。 Test40は、温度を1.2から0.45に下げるだけ。
cpuct式の変更
  • cpuct定数をAlphaZeroの式に変更
ファーストプレイの緊急度(FPU)

確率的重み平均化

  • Test30は、ネットワーク訓練にSWA(Stochastic Weight Averaging)を導入した。
  • これは、グローバルミニマムを見つけるのに役立つ手法である。
  • これにより、オーバーフィットが減少し、強さと訓練速度が向上する。

終盤テーブルベース

  • 終盤のテーブルベースは、終盤の位置に完璧な正解を与える。
  • テーブルベースは非常に大きいため、すべての貢献者にダウンロードを依頼することは実用的ではないため、セルフプレイで使用することができない。
  • Test30でサーバで再スコアリングするアプローチを導入。
  • Test40は、テーブルベースサイズを5から6に増やした。

Test50以降

Test50に含める可能性が高いと思われるアイデアをリストする。

ランダムプレイのシード

  • AlphaZeroは、知識がゼロの偽のネットワークでゲームをランダムにプレイすることから始まる。
  • ランダムにプレイすることで、ネットワークを使用するよりも初期の学習速度がわずかに向上する。

実装:https://github.com/LeelaChessZero/lc0/pull/725

畳み込み方策ヘッド

  • 方策ヘッドを単純なベクトルから、8x8の位置を示すレイヤーにする。
  • 最終的な結果は明らかに良ないが、学習時間が短くなるため訓練時間が短縮される。
  • 私が知る限りではマイナス面がないので、Test50に使用されることを期待する。

ディスカッション:https://github.com/LeelaChessZero/lc0/issues/637
実装:https://github.com/LeelaChessZero/lc0/pull/712
※T60で採用された模様

Contempt and trade penalties

  • 他のエンジンを破るための探索の変更

※チェスの特有の話でよく理解できなかった。
実装:https://github.com/LeelaChessZero/lc0/pull/703
実装(旧):#702, #577, #536, #466, #550, #436

価値ヘッドで引き分けを推定

  • 価値ヘッドの出力を、Win/Draw/Lose(WDL)に分ける。
  • これによる利点:
    • 引き分けを認識できる
    • 自己対局でドローオファーを提供することで情報のないゲームを早く終わらせることができる
    • 探索時の引き分けの価値を変更することで、弱い相手との引き分けを避けることができる

実装:https://github.com/LeelaChessZero/lc0/pull/635
実装(訓練でオファーを提供):https://github.com/LeelaChessZero/lc0/pull/724

訓練におけるkldgainしきい値

  • 現在、自己対局では1手につき800回の正確なプレイアウトを実行している。
  • 定数にすることが良いかは議論がある。水平線の先の戦略が見つけられない。
  • kldgainしきい値は探索と活用のバランスをとる。
  • 探索のある時点からある時点のKLダイバージェンスからプレイアウトがどの程度有効か測る。
  • 値が大きい場合、ネットワークが現在の状況に混乱しているのでさらに探索が必要。
  • 800固定の代わりに、KLDが100を下回るまで探索する。
  • テストでは、+120 eloになった。
  • プレイアウトあたり平均766ノードしかない。
  • 複雑な局面では最大で5300ノードまで続く。

提案:https://github.com/LeelaChessZero/lc0/issues/684
実装:https://github.com/LeelaChessZero/lc0/pull/721

確実な伝播(Certainty Propagation)

  • チェックメイトによる勝ち、負けとドローをツリーに伝播する。
  • +20 eloと対局の高速化の効果と、mate-in-Nの表示ができる

実装:https://github.com/LeelaChessZero/lc0/pull/700
実装(古い、より多くの機能):https://github.com/LeelaChessZero/lc0/pull/487
※v0.23.0で採用された模様

価値の悲観化

  • 訪問が少ないノードの価値を低下させる。
  • デフォルトで0.6回の負けがあるとして計算する。
  • 効果はわずか+20 elo

実装:https://github.com/LeelaChessZero/lc0/pull/707
※まだ採用されていない模様

Q学習

  • 価値の目標にゲーム最終結果の代わりに、モンテカルロ木探索によって生成されたQ値を使う。
  • ネットワークが体系的に間違っている場合、実際の結果がわからないため混乱を解決できない可能性がある。
  • 興味深い解決策は、qとzを平均して、両方を組み合わせることである。
  • これにより方策がより学習可能になり、ランダム性が低下する。

実装(部分):https://github.com/LeelaChessZero/lc0/pull/722
※T60で採用された模様

単純なリグレットベース探索(root cpuct, SR+CR MCTS, VOI, or other)

  • MCTSが悪いという議論
  • 単純にルートのcpuctを増加させることで+100 elo改善する。
  • ルートノードで累積的な後悔ではなく単純な後悔を最適化することにより、UCTよりも優れた機能を発揮できるはず。

※論文読まないと何のことか理解できない。
論文:MCTS Based on Simple Regret, VOI-aware MCTS

ゲームの分割

  • ゲーム開始時に温度でランダムな探索を使う代わりに、ゲームの開始局面をランダム化して、温度ゼロで開始位置からプレイするとどうなるか。
  • 多くの中盤と終盤局面を学習できる。
  • これについてはまだ多くの議論がある。

実装:https://github.com/LeelaChessZero/lc0/pull/720
ディスカッション:https://github.com/LeelaChessZero/lc0/issues/342https://github.com/LeelaChessZero/lc0/issues/237
※まだ採用されていない模様

感想

結構知らないテクニックもあり参考になります。
すでにdlshogiで試している内容もいくつかありました。
終盤テーブル(将棋では詰み探索)、確実な伝播、Q学習(いわゆるelmo式)、開始局面集とか。
dlshogiは効果測定まで十分できていませんが、Leela Chess Zeroは、issuesで十分に議論を行ってから採用しているので、その過程が参考になります。

Leela Chess Zeroのブログに最新の情報もあるので、そちらも確認したいと思っています。