強化学習について

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学習時のミニバッチサイズ256GPUメモリが小さい場合はこの値を小さめに設定してください。
MOMENTUM学習器のモーメンタムパラメータ0.9基本的に変更する必要はありません。
WEIGHT_DECAYL2正則化の重み1e-4 (0.0001)基本的に変更する必要はありませんが、過学習している場合は大きめの値を設定すると解消する場合があります。
DATA_SET_SIZEnpzファイル1つに格納するデータ数BATCH_SIZE * 4000メモリサイズに合わせて値を変更してください。
RL_VALUE_WEIGHTPolicyのlossに対するValueのlossの重み1.00.0以上の値を設定してください。値を大きくし過ぎるとValueを過学習する傾向にあります。
SELF_PLAY_VISITS自己対戦時の1手あたりの探索回数162以上の値を設定してください。値を大きくすると棋譜の質は向上しますが、棋譜の生成速度は低下します。
NUM_SELF_PLAY_WORKERS自己対戦実行ワーカ数4CPUやメモリに合わせて数を変更してください。
NUM_SELF_PLAY_GAMES1回の自己対戦ワーカ実行で生成する棋譜の数10000小さい値を設定すると過学習しやすくなります。
NN_SELFPLAY_BATCH_SIZE自己対戦の非同期推論で用いるバッチサイズ64大きくするとGPUの効率は上がりますが、レイテンシやメモリ使用量が増えます。

学習がうまく進むことを確認しているパラメータのため、試行錯誤する際は最初は設定値そのまま利用し、徐々に値を変更して学習状況を確認してください。

ニューラルネットワークの定義

ニューラルネットワークの定義は下記4ファイルを使用して定義しています。

ファイル定義内容
nn/network/dual_net.pyニューラルネットワーク全体の定義
nn/network/res_block.pyResidual Blockの定義
nn/network/head/policy_head.pyPolicy Headの定義
nn/network/head/value_head.pyValue Headの定義

ネットワークの構造を試行錯誤する場合は、まずはdual_net.pyで使用するResidual Blockの個数やfilters変数の値を変更して見ることをお勧めします。

TamaGoの強化学習のプロセス

TamaGoの強化学習パイプラインは以下の順番で実行されます。

  1. 既存のニューラルネットワークのモデルを利用し、指定した数だけ自己対局を実行する。(selfplay_main.pyの実行)
  2. 自己対戦の結果をGNUGoの判定で補正する。(オプショナル)
  3. 自己対戦で生成した棋譜ファイルを使用してニューラルネットワークの学習を実行する。(train.pyの実行)
  4. 1〜3を繰り返す。

強化学習パイプラインはpipeline.shに定義しています。

自己対戦実行スクリプト(selfplay_main.py)のコマンドラインオプション

オプション概要設定する値の例デフォルト値備考
--save-dir自己対戦で生成したSGFファイルを保存するディレクトリパスsave_dirarchive
--process自己対戦実行ワーカ数2NUM_SELF_PLAY_WORKERS
--num-data1回の学習するごとに生成する棋譜の数5000NUM_SELF_PLAY_GAMES
--size碁盤のサイズ99
--use-gpuGPU使用フラグtruetrueGPUを使用して自己対戦を実行する設定のフラグ。trueかfalseで指定
--visits1手あたりの探索回数100SELF_PLAY_VISITS探索回数を増やすと棋譜の質が向上しますが、生成速度は遅くなります。
--model使用するネットワークパラメータファイルmodel/rl-model.binmodel/model.bin
--async-mode非同期モードで自己対戦しNN推論をバッチ化するtruetrueGPUを利用する場合に効果的です。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.pyNN_SELFPLAY_BATCH_SIZE で制御します。
    • selfplay_worker_asyncasyncio で複数ゲームを同時実行します。
  • 同期モード:

    • 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碁盤の大きさの指定59教師データとして使用するSGFファイルのSZタグの値と一致させてください
--use-gpuGPU使用フラグtruetrueGPUを使用して学習する設定のフラグ。trueかfalseで指定
--rl強化学習実行フラグfalsefalse教師あり学習を実行するときにはfalseを指定する。
--window-size強化学習時のウィンドウサイズ500000300000教師あり学習では使用しないオプション。