TadaoYamaokaの開発日記

個人開発しているスマホアプリや将棋AIの開発ネタを中心に書いていきます。

Gumbel AlphaZero

Gumbel dlshogiを作る その12(途中経過)

1サイクル100万局面生成して106サイクルまで学習できたので、途中経過を報告する。 学習スケジューラ 前回、記載した通り、サイクル数を閾値にして、以下の通りハイパーパラメータを変更している。 パラメータ 0~9 10~99 100~999 シミュレーション回数 16…

Gumbel dlshogiを作る その11(ハイパーパラメータスケジューラ)

前回、自己対局と訓練のサイクルの自動化を行った。今回は、ハイパーパラメータスケジューラを実装して、本格的な学習を開始したので、途中経過を報告する。 ハイパーパラメータスケジューラ 論文では、シミュレーション回数は固定で実験しているが、WCSC34…

Gumbel dlshogiを作る その10(訓練サイクル自動化)

前回までは手動で行っていた、自己対局と訓練のサイクルを自動化することを検討する。 処理方式 WindowsでもLinuxでも実行できるようにOSのシェルは使わずに、Pythonで実装する。 自己対局と、訓練処理のメイン処理は関数にしているので、自動化処理からPyth…

Gumbel dlshogiを作る その9(3手詰め)

前回、初期値のモデルから自己対局と学習を繰り返すと、入玉宣言の割合が増え過ぎる問題の対策として、最大手数で終局した対局を除くことを検証した。 詰みで終局する割合が増えることを期待したが、効果は薄かった。今回は、3手詰めを導入し、3手以内の詰み…

Gumbel dlshogiを作る その8(最大手数で終局した対局を除外)

初期値のモデルから自己対局と学習を繰り返すと、入玉宣言の棋譜が増え過ぎる問題が起きたので、最大手数で終局した対局を除外することを検討する。 最大手数の対局を除外することで、相対的に詰ます棋譜が増えるので、詰みを覚えることを期待する。 学習方…

Gumbel dlshogiを作る その7(初期値から学習)

自己対局と訓練の処理が実装できたので、初期値のモデルから自己対局と学習を繰り返して、モデル精度が上がるか検証する。 学習方法 初期値のモデルから自己対局を開始する 1回の自己対局で、100万局面生成する 自己対局で生成した訓練データを1エポックだけ…

Gumbel dlshogiを作る その6(終局判定のバグ修正)

その4で、学習結果の価値の正解率が低かったのでバグの可能性がありそうと書いたが、やはりバグがあった。初期値からの学習のために、自己対局時の平均手数や終局理由を出力するようにしたことで、Drawでないのに数手終わる対局があることに気づいた。 原因…

Gumbel dlshogiを作る その5(マルチプロセス対応)

前回、自己対局で10万局面生成するのに、1時間14分かかったので、マルチプロセス化して高速化することを検討した。 マルチプロセス化 シングルプロセスで実行してた自己対局の処理をそのままマルチプロセスで実行する。 GPUの推論は競合すると速度低下するた…

Gumbel dlshogiを作る その4(データローダと訓練の実装)

前回までで、Gumbel AlphaZeroの自己対局で訓練データを生成できるようになったので、今回は学習処理を実装する。 訓練データ 自己対局で、以下のようなNumpyの構造体の配列をバイナリファイルとして出力する。 ランダムアクセスが可能なように固定長にして…

Gumbel dlshogiを作る その3(バックアップ処理修正)

前回までで、Gumbel AlphaZeroのアルゴリズムで自己対局して、訓練データ出力するところまで実装できた。動作確認のため、python-dlshogi2の学習済みモデルをTorch Scriptにエクスポートして、生成される棋譜を確認した。 Torch Scriptにエクスポートする処…

Gumbel dlshogiを作る その2(訓練データ出力処理)

前回の記事で、Gumbel AlphaZeroの自己対局処理の実装を完了した。今回は、その続きとして、訓練データ出力処理を実装した。 訓練データの形式 AlphaZeroでは探索した手のみの訪問回数に応じた分布を学習する。 一方、Gumbel AlphaZeroでは、改善されたポリ…

Gumbel dlshogiを作る

前回書いた通り、Gumbel AlphaZeroの論文と公式実装を確認して、仕組みがほぼ理解できたので、PyTorchで簡単なサンプルプログラムを実装してゼロからの強化学習を試してみるつもりである。 まずは、簡易なゲームで試すつもりだったが、最終的にはdlshogiの強…

Gumbel AlphaZeroの論文を読む その13(Sequential Halvingの訪問計画の実装)

その10で、Sequential Halvingの訪問計画の実装を確認したが、その7で解説した各フェーズのシミュレーション回数の理論値がmより小さい場合の処理について理解が曖昧だったので、実際に実行して確認した。 気になる点 論文の囲碁の設定でm=16で、n=32のと…

Gumbel AlphaZeroの論文を読む その12(方策の学習の実装)

その9で解説した、方策の学習について、公式の実装を確認する。 完成されたQ値(Completed Q-values)による方策学習の実装 Gumbel AlphaZeroでは、探索で得られたQ値を最大限活用するため、「完成されたQ値(Completed Q-values)」という概念を導入し、こ…

Gumbel AlphaZeroの論文を読む その11(内部ノードでの行動選択の実装)

その8で解説した、ルートノードでの行動選択について、公式の実装を確認する。 内部ノードの行動選択(gumbel_muzero_interior_action_selection) ここでは、Gumbel MuZero探索における内部ノード(ルート以外のノード)の行動選択関数 gumbel_muzero_inte…

Gumbel AlphaZeroの論文を読む その10(ルートノードでの行動選択の実装)

その6とその7で解説した、ルートノードでの行動選択について、公式の実装を確認する。 ルートノードの行動選択 その5で解説したgumbel_muzero_root_action_selectionを再掲する。 def gumbel_muzero_root_action_selection( rng_key: chex.PRNGKey, tree:…

Gumbel AlphaZeroの論文を読む その9(方策の学習)

前回は、内部ノードの行動選択について解説した。 今回は、方策の学習方法について解説する。AlphaZeroは、探索後のルートアクションの「訪問回数」に基づいて方策ネットワークを更新する。 しかし、この方法は、特にシミュレーション回数が少ない場合には方…

Gumbel AlphaZeroの論文を読む その8(内部ノードの行動選択)

前回はルートノードの行動選択に使用されている逐次的半減法(Sequential Halving)について解説した。 今回は、内部ノード(非ルートノード)の行動選択について解説する。AlphaZeroでは、内部ノード(非ルートノード)でも、ルートノードと同じPUCTアルゴリズ…

Gumbel AlphaZeroの論文を読む その7(逐次的半減法(Sequential Halving))

AlphaZeroの探索は、MCTSで、行動選択にはPUCTが使用されている。 PUCTのベースとなるUCB1は、累積後悔を最小化するように設計されている。一方、Gumbel AlphaZeroでは、行動選択に逐次的半減法(Sequential Halving)が使用される。 逐次的半減法は、最終的…

Gumbel AlphaZeroの論文を読む その6(Gumbel-Top-kトリック)

従来のAlphaZeroの行動選択は、訪問回数の分布にディリクレノイズを加えることで、探索を促していたが、これには方策改善の理論的な保証がなかった。 また、学習がたまたまサンプリングされた行動のみに依存しており、報酬のランダム性と掛け合わせて、大き…

Gumbel AlphaZeroの論文を読む その5(行動選択)

前回からだいぶ時間が空いたが、Gumbel AlphaZeroの解説を再開する。 今回は、行動選択について解説する。 行動選択は、ルートノードと内部ノード(非ルートノード)で異なる方法を使用する。 ルートノードでは、Gumbel-Top-kトリックを用いて、方策改善を行…

Gumbel AlphaZeroの論文を読む その4

前回の続き 探索の内部処理 探索の処理は、searchに書かれている。 引数 params: ルートおよび再帰関数に渡されるパラメータ。 rng_key: 乱数生成器の状態。 root: ルートノードの初期状態で、事前確率、価値、埋め込みを含む。 recurrent_fn: 葉ノードおよ…

Gumbel AlphaZeroの論文を読む その3

前回に続き、examples/visualization_demo.py のソースを解説する。 探索 探索の処理は、gumbel_muzero_policyに書かれている。引数は、以下の通り。 params: ルートおよび再帰関数に渡されるパラメータ。 rng_key: 乱数生成器の状態。 root: (prior_logits,…

Gumbel AlphaZeroの論文を読む その2

前回、Gumbel AlphaZeroの論文の概要と、公式実装の環境構築について記載した。今回は、公式実装のサンプルプログラム examples/visualization_demo.py のソースを調べながらGumbel AlphaZeroのアルゴリズムを理解する。 visualization_demo.pyの概要 visual…

Gumbel AlphaZeroの論文を読む

dlshogiにGumbel AlphaZeroの強化学習を導入したいと思って、Gumbel AlphaZeroの論文を読んでいるが、理論がなかなか難しいため公式実装を確認しながら理解する。 Gumbel AlphaZero AlphaZeroの強化学習は、自己対局でUCTで探索した際の訪問回数を目標の確率…