強化学習について
September 2, 2025 · View on GitHub
TamaGoはニューラルネットワークを使用したGumbel AlphaZero方式の強化学習をサポートしています。
強化学習の前提条件
強化学習実行時にはTamaGo以外に自己対戦の対局結果を補正するためにGNUGoを利用します。
GNUGoを利用しなくても強化学習は進むため、GNUGoのインストールはオプショナルとしていますが、TamaGoの終局時の地合判定が非常に雑なため、GNUGoの使用を推奨します。
GNUGoのインストール方法はUbuntuであれば下記コマンドを実行するだけです。
apt install gnugo
強化学習で使用するハイパーパラメータの定義
強化学習で使用するハイパーパラメータはlearning_param.pyに定義してあります。
| パラメータ | 概要 | 設定値の例 | 備考 |
|---|---|---|---|
| RL_LEARNING_RATE | 強化学習で使用する学習率 | 0.01 | 学習がある程度進んだ時に小さな値に変更すると良いです。 |
| BATCH_SIZE | 学習時のミニバッチサイズ | 256 | GPUメモリが小さい場合はこの値を小さめに設定してください。 |
| MOMENTUM | 学習器のモーメンタムパラメータ | 0.9 | 基本的に変更する必要はありません。 |
| WEIGHT_DECAY | L2正則化の重み | 1e-4 (0.0001) | 基本的に変更する必要はありませんが、過学習している場合は大きめの値を設定すると解消する場合があります。 |
| DATA_SET_SIZE | npzファイル1つに格納するデータ数 | BATCH_SIZE * 4000 | メモリサイズに合わせて値を変更してください。 |
| RL_VALUE_WEIGHT | Policyのlossに対するValueのlossの重み | 1.0 | 0.0以上の値を設定してください。値を大きくし過ぎるとValueを過学習する傾向にあります。 |
| SELF_PLAY_VISITS | 自己対戦時の1手あたりの探索回数 | 16 | 2以上の値を設定してください。値を大きくすると棋譜の質は向上しますが、棋譜の生成速度は低下します。 |
| NUM_SELF_PLAY_WORKERS | 自己対戦実行ワーカ数 | 4 | CPUやメモリに合わせて数を変更してください。 |
| NUM_SELF_PLAY_GAMES | 1回の自己対戦ワーカ実行で生成する棋譜の数 | 10000 | 小さい値を設定すると過学習しやすくなります。 |
| NN_SELFPLAY_BATCH_SIZE | 自己対戦の非同期推論で用いるバッチサイズ | 64 | 大きくするとGPUの効率は上がりますが、レイテンシやメモリ使用量が増えます。 |
学習がうまく進むことを確認しているパラメータのため、試行錯誤する際は最初は設定値そのまま利用し、徐々に値を変更して学習状況を確認してください。
ニューラルネットワークの定義
ニューラルネットワークの定義は下記4ファイルを使用して定義しています。
| ファイル | 定義内容 |
|---|---|
| nn/network/dual_net.py | ニューラルネットワーク全体の定義 |
| nn/network/res_block.py | Residual Blockの定義 |
| nn/network/head/policy_head.py | Policy Headの定義 |
| nn/network/head/value_head.py | Value Headの定義 |
ネットワークの構造を試行錯誤する場合は、まずはdual_net.pyで使用するResidual Blockの個数やfilters変数の値を変更して見ることをお勧めします。
TamaGoの強化学習のプロセス
TamaGoの強化学習パイプラインは以下の順番で実行されます。
- 既存のニューラルネットワークのモデルを利用し、指定した数だけ自己対局を実行する。(selfplay_main.pyの実行)
- 自己対戦の結果をGNUGoの判定で補正する。(オプショナル)
- 自己対戦で生成した棋譜ファイルを使用してニューラルネットワークの学習を実行する。(train.pyの実行)
- 1〜3を繰り返す。
強化学習パイプラインはpipeline.shに定義しています。
自己対戦実行スクリプト(selfplay_main.py)のコマンドラインオプション
| オプション | 概要 | 設定する値の例 | デフォルト値 | 備考 |
|---|---|---|---|---|
--save-dir | 自己対戦で生成したSGFファイルを保存するディレクトリパス | save_dir | archive | |
--process | 自己対戦実行ワーカ数 | 2 | NUM_SELF_PLAY_WORKERS | |
--num-data | 1回の学習するごとに生成する棋譜の数 | 5000 | NUM_SELF_PLAY_GAMES | |
--size | 碁盤のサイズ | 9 | 9 | |
--use-gpu | GPU使用フラグ | true | true | GPUを使用して自己対戦を実行する設定のフラグ。trueかfalseで指定 |
--visits | 1手あたりの探索回数 | 100 | SELF_PLAY_VISITS | 探索回数を増やすと棋譜の質が向上しますが、生成速度は遅くなります。 |
--model | 使用するネットワークパラメータファイル | model/rl-model.bin | model/model.bin | |
--async-mode | 非同期モードで自己対戦しNN推論をバッチ化する | true | true | GPUを利用する場合に効果的です。trueかfalseで指定。 |
並列化と非同期自己対戦
自己対戦におけるMCTSを並列化し、ニューラルネットワークをバッチ推論することで、デバイスの利用効率を高めます。
-
非同期モード:
NUM_SELF_PLAY_WORKERSの数だけプロセスを立ち上げ、各プロセスはNN_SELFPLAY_BATCH_SIZE * 10程度のゲームを同時に処理します(概ねの上限。詳細は selfplay/worker.py)。- 非同期MCTS(
mcts/tree_async.py)はNN推論を共有評価器(mcts/nneval.py)へ投入します。 - バックグラウンドタスクが複数ゲームからの要求をまとめ、1回のミニバッチとしてデバイスで推論します。
- 自己対戦時のバッチサイズは mcts/constant.py の
NN_SELFPLAY_BATCH_SIZEで制御します。 selfplay_worker_asyncはasyncioで複数ゲームを同時実行します。
-
同期モード:
NUM_SELF_PLAY_WORKERSの数だけプロセスを立ち上げ、各プロセスが1ゲームずつ実行します。- 同期MCTS(
mcts/tree.py)は各ゲームでキュー処理しNN_BATCH_SIZEのバッチでNN推論を実行します。
-
使い分けの目安:
- GPUで学習用データを生成する場合は、非同期モードでGPUを効率的に利用できます。
- GTPエンジンとしての対局や軽量な検証では、同期モード(
mcts/tree.py)が有効です。
関連ファイル: mcts/tree_async.py, mcts/nneval.py, selfplay/worker.py。
強化学習実行スクリプト(train.py)のコマンドラインオプション
| オプション | 概要 | 設定する値の例 | デフォルト値 | 備考 |
|---|---|---|---|---|
--kifu-dir | 教師データとして使用するSGFファイルを格納したディレクトリパスの指定 | /home/user/sgf_files | なし | |
--size | 碁盤の大きさの指定 | 5 | 9 | 教師データとして使用するSGFファイルのSZタグの値と一致させてください |
--use-gpu | GPU使用フラグ | true | true | GPUを使用して学習する設定のフラグ。trueかfalseで指定 |
--rl | 強化学習実行フラグ | false | false | 教師あり学習を実行するときにはfalseを指定する。 |
--window-size | 強化学習時のウィンドウサイズ | 500000 | 300000 | 教師あり学習では使用しないオプション。 |