少し古いが、Leela Chess Zeroの進化をまとめたよい記事があったので、読んでいる。
Leela Chess — Test40, Test50, and beyond | by Veedrac | Medium
GitHubのissuesから拾うのもしんどいのでまとめがあるとありがたい。
Leela Chess Zeroは新しい手法をいくつも試しているので参考になる。
Test40
Test40は、それ以前のすべての実験の統合している。
Test35ゲームでシード
- Test40の訓練開始にTest35ゲームを使用した。
SENet
- Test35は、新しいニューラルネットワークアーキテクチャであるSENetを導入した。
AlphaZero論文とのマッチング
- Test30の間にAlphaZeroの論文がリリースされたため、Test40はそれからいくつかの修正を行った。
- これについては、ブログ(https://blog.lczero.org/2018/12/alphazero-paper-and-lc0-v0191.html)で説明されている。
ゲーム終了時の温度低下
- AlphaZeroは、最初の15手でのみ温度を使用する。 Test40は、温度を1.2から0.45に下げるだけ。
cpuct式の変更
- cpuct定数をAlphaZeroの式に変更
ファーストプレイの緊急度(FPU)
- UCB1は探索的すぎるため、未訪問のノードを負けとして扱う。
- FPUの利点は、論文:Exploration exploitation in Go: UCT for Monte-Carlo Goで説明されている。
確率的重み平均化
- Test30は、ネットワーク訓練にSWA(Stochastic Weight Averaging)を導入した。
- これは、グローバルミニマムを見つけるのに役立つ手法である。
- これにより、オーバーフィットが減少し、強さと訓練速度が向上する。
終盤テーブルベース
- 終盤のテーブルベースは、終盤の位置に完璧な正解を与える。
- テーブルベースは非常に大きいため、すべての貢献者にダウンロードを依頼することは実用的ではないため、セルフプレイで使用することができない。
- Test30でサーバで再スコアリングするアプローチを導入。
- Test40は、テーブルベースサイズを5から6に増やした。
Test50以降
Test50に含める可能性が高いと思われるアイデアをリストする。
ランダムプレイのシード
- AlphaZeroは、知識がゼロの偽のネットワークでゲームをランダムにプレイすることから始まる。
- ランダムにプレイすることで、ネットワークを使用するよりも初期の学習速度がわずかに向上する。
畳み込み方策ヘッド
- 方策ヘッドを単純なベクトルから、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/342、https://github.com/LeelaChessZero/lc0/issues/237
※まだ採用されていない模様
感想
結構知らないテクニックもあり参考になります。
すでにdlshogiで試している内容もいくつかありました。
終盤テーブル(将棋では詰み探索)、確実な伝播、Q学習(いわゆるelmo式)、開始局面集とか。
dlshogiは効果測定まで十分できていませんが、Leela Chess Zeroは、issuesで十分に議論を行ってから採用しているので、その過程が参考になります。
Leela Chess Zeroのブログに最新の情報もあるので、そちらも確認したいと思っています。