初期値のモデルから自己対局と学習を繰り返すと、入玉宣言の棋譜が増え過ぎる問題が起きたので、最大手数で終局した対局を除外することを検討する。 最大手数の対局を除外することで、相対的に詰ます棋譜が増えるので、詰みを覚えることを期待する。 学習方…
自己対局と訓練の処理が実装できたので、初期値のモデルから自己対局と学習を繰り返して、モデル精度が上がるか検証する。 学習方法 初期値のモデルから自己対局を開始する 1回の自己対局で、100万局面生成する 自己対局で生成した訓練データを1エポックだけ…
その4で、学習結果の価値の正解率が低かったのでバグの可能性がありそうと書いたが、やはりバグがあった。初期値からの学習のために、自己対局時の平均手数や終局理由を出力するようにしたことで、Drawでないのに数手終わる対局があることに気づいた。 原因…
前回、自己対局で10万局面生成するのに、1時間14分かかったので、マルチプロセス化して高速化することを検討した。 マルチプロセス化 シングルプロセスで実行してた自己対局の処理をそのままマルチプロセスで実行する。 GPUの推論は競合すると速度低下するた…
前回までで、Gumbel AlphaZeroの自己対局で訓練データを生成できるようになったので、今回は学習処理を実装する。 訓練データ 自己対局で、以下のようなNumpyの構造体の配列をバイナリファイルとして出力する。 ランダムアクセスが可能なように固定長にして…
前回までで、Gumbel AlphaZeroのアルゴリズムで自己対局して、訓練データ出力するところまで実装できた。動作確認のため、python-dlshogi2の学習済みモデルをTorch Scriptにエクスポートして、生成される棋譜を確認した。 Torch Scriptにエクスポートする処…
前回の記事で、Gumbel AlphaZeroの自己対局処理の実装を完了した。今回は、その続きとして、訓練データ出力処理を実装した。 訓練データの形式 AlphaZeroでは探索した手のみの訪問回数に応じた分布を学習する。 一方、Gumbel AlphaZeroでは、改善されたポリ…
前回書いた通り、Gumbel AlphaZeroの論文と公式実装を確認して、仕組みがほぼ理解できたので、PyTorchで簡単なサンプルプログラムを実装してゼロからの強化学習を試してみるつもりである。 まずは、簡易なゲームで試すつもりだったが、最終的にはdlshogiの強…
その10で、Sequential Halvingの訪問計画の実装を確認したが、その7で解説した各フェーズのシミュレーション回数の理論値がmより小さい場合の処理について理解が曖昧だったので、実際に実行して確認した。 気になる点 論文の囲碁の設定でm=16で、n=32のと…
その9で解説した、方策の学習について、公式の実装を確認する。 完成されたQ値(Completed Q-values)による方策学習の実装 Gumbel AlphaZeroでは、探索で得られたQ値を最大限活用するため、「完成されたQ値(Completed Q-values)」という概念を導入し、こ…
その8で解説した、ルートノードでの行動選択について、公式の実装を確認する。 内部ノードの行動選択(gumbel_muzero_interior_action_selection) ここでは、Gumbel MuZero探索における内部ノード(ルート以外のノード)の行動選択関数 gumbel_muzero_inte…
今週末の6/28に開催された第6回電竜戦TSEC指定局面と香落ち戦に参加しました。 今大会は、指定局面戦と、香落ち戦の2部構成となっていました。 前年までは、賞金も少なく将棋AI開発者のお祭り的なイベントでしたが、今回大会は賞金が上がり、本戦と同じくら…
その6とその7で解説した、ルートノードでの行動選択について、公式の実装を確認する。 ルートノードの行動選択 その5で解説したgumbel_muzero_root_action_selectionを再掲する。 def gumbel_muzero_root_action_selection( rng_key: chex.PRNGKey, tree:…
前回は、内部ノードの行動選択について解説した。 今回は、方策の学習方法について解説する。AlphaZeroは、探索後のルートアクションの「訪問回数」に基づいて方策ネットワークを更新する。 しかし、この方法は、特にシミュレーション回数が少ない場合には方…
前回はルートノードの行動選択に使用されている逐次的半減法(Sequential Halving)について解説した。 今回は、内部ノード(非ルートノード)の行動選択について解説する。AlphaZeroでは、内部ノード(非ルートノード)でも、ルートノードと同じPUCTアルゴリズ…
AlphaZeroの探索は、MCTSで、行動選択にはPUCTが使用されている。 PUCTのベースとなるUCB1は、累積後悔を最小化するように設計されている。一方、Gumbel AlphaZeroでは、行動選択に逐次的半減法(Sequential Halving)が使用される。 逐次的半減法は、最終的…
従来のAlphaZeroの行動選択は、訪問回数の分布にディリクレノイズを加えることで、探索を促していたが、これには方策改善の理論的な保証がなかった。 また、学習がたまたまサンプリングされた行動のみに依存しており、報酬のランダム性と掛け合わせて、大き…
前回からだいぶ時間が空いたが、Gumbel AlphaZeroの解説を再開する。 今回は、行動選択について解説する。 行動選択は、ルートノードと内部ノード(非ルートノード)で異なる方法を使用する。 ルートノードでは、Gumbel-Top-kトリックを用いて、方策改善を行…
5/3~5/5に開催された第35回世界コンピュータ将棋選手権にHEROZチームとして、「dlshogi with HEROZ」というプログラム名で参加しました。 大会の概要 今回は、51チームが参加しました。 第1予選、第2予選を通過した上位8チームで総当たりのリーグ戦で決勝戦…
ユーザがマウスとキーボードを使用して操作していたソフトウェアは、今後、徐々にAIエージェントに移行していくのではないか思っている。 人間が複雑な操作を覚えて、すべてを一つ一つ指示していくやり方は、AIができることが増えるにつれて不要になってくる…
最近はGitHub Copilotでバイブコーディングすることが多く、コードを直接書くことが減ってきている。先日、「電卓アプリを作るのは難しい?」という記事を書いたが、その際に言及した、かなり前に作ったAndroidの電卓アプリが最新のAndroidにはインストール…
「型システム入門 −プログラミング言語と型の理論」を読んだので内容をまとめる。 以下の内容は、ほとんどGemini 2.5 Pro (experimental)を使用して作成している。 本書はプログラミング言語の型システム理論に関する包括的な入門書である。型無し計算から単…
以前に、2024年11月時点のdlshogiの40ブロック512フィルタのモデルで、方策のみで指した場合の、floodgateでのレーティングを測定した。 その時点では、レーティングが2750という結果だった。今回、50ブロック640フィルタのモデルを学習したので、同様に方策…
ちょっと前に将棋AI開発者のDiscordチャンネルで、電卓アプリを作るのは難しいという話題があった。話のネタはこの記事: 電卓アプリを作るのはなぜ難しいのか、Androidの「電卓」に施された工夫とは? - GIGAZINEDecimal使えば簡単でしょと思ったのでチャン…
GPS将棋(OpenShogiLib)のdf-pnのソースの全体像を調べた。 df-pnアルゴリズムの概要 df-pn(Depth-First Proof-Number Search)とは、将棋の詰将棋問題において「詰むか否か」を効率的に証明するための探索アルゴリズムである。 各局面において証明数(Proof…
dlshogiは、詰み探索にdf-pnを実装しているが、ループ局面が正しく判定できない場合があり、解けない問題がある。 実戦では、ほぼ現れないので、実用上は問題になっていない。 実戦では、35手くらいまでの詰みは数秒で解ける。 それ以上長い詰みは、時間がか…
前回、軽量価値ネットワークの推論をStockfishの探索に組み込んで、モデルサイズ相当のNPSで探索できることを確認した。前回は、36,819,741局面を8エポック学習しただけで、Lesserkaiに勝てるがGPSFishには勝てなかった。今回は、dlshogiの学習で使用した約3…
AndroidとiOSでリリースしている「Vocal Pitch Monitor」では、自己相関関数と決定木のアルゴリズムで基本周波数(ピッチ)の測定を行っている。Vocal Pitch Monitor - Apps on Google Play「VocalPitchMonitor」をApp Storeで自己相関関数は、ノイズに強く比…
前回、軽量価値ネットワークのモデル全体の推論をC++でSIMDを使用して実装した。 今回は、推論を探索に組み込む。 ネットワーク構成見直し 推論を組み込む前にネットワーク構成で気になる箇所があったので見直した。埋め込み層を実装した際に、permuteを忘れ…
前回までで、軽量価値ネットワークの推論のビルディングブロックがすべてそろったので、それらを組み合わせてモデル全体の推論処理を実装する。 実装 以下の通りモデル全体の推論処理を実装した。 処理を順番に呼び出すだけなので、特に工夫点はない。複数ス…