教師あり学習について
April 13, 2023 · View on GitHub
TamaGoはニューラルネットワークを使用した教師あり学習をサポートしています。
使用するファイルの前提条件
TamaGoが読み込めるファイルはSGF (Smart Game Format) 形式のファイルのみになります。SGFの詳細についてはこちらを参照してください。
また他にも下記前提条件があります。
- 着手に分岐がないこと (TamaGoのSGFファイル読み込み機能に分岐を判別する機能がないため)
- 着手に対応するBタグ、Wタグがあること (Policyを学習する際に使用する教師データに利用するため)
- REタグに勝敗が記入されていること (Valueを学習する際に使用する教師データに利用するため)
- 文字コードがUTF-8, またはASCII
SGFファイルに日本語が入っていない場合は文字コードはASCIIとして読み込まれますが、日本語が入っている場合は文字コードがUTF-8であるか注意してください。
学習で使用するハイパーパラメータの定義
学習で使用するハイパーパラメータはlearning_param.pyに定義してあります。
| パラメータ | 概要 | 設定値の例 | 備考 |
|---|---|---|---|
| SL_LEARNING_RATE | 学習率の初期値 | 0.01 | |
| BATCH_SIZE | 学習時のミニバッチサイズ | 256 | GPUメモリが小さい場合はこの値を小さめに設定してください。 |
| MOMENTUM | 学習器のモーメンタムパラメータ | 0.9 | 基本的に変更する必要はありません。 |
| WEIGHT_DECAY | L2正則化の重み | 1e-4 (0.0001) | 基本的に変更する必要はありませんが、過学習している場合は大きめの値を設定すると解消する場合があります。 |
| EPOCHS | 学習するエポック数 | 15 | 全てのデータを1周分学習することを1エポックとして、どれだけ繰り返すか設定します。値を大きくするとその分学習に時間がかかります。 |
| LEARNING_SCHEDULE | 学習率の変更に関する設定 | learning_param.py参照 | 学習が進むごとに徐々に学習率を小さくすると良いパラメータを得られます。 |
| DATA_SET_SIZE | npzファイル1つに格納するデータ数 | BATCH_SIZE * 4000 | メモリサイズに合わせて値を変更してください。 |
| SL_VALUE_WEIGHT | Policyのlossに対するValueのlossの重み | 0.02 | 0.0以上の値を設定してください。値を大きくするとValueを過学習する傾向にあります。 |
ネットワークの試行錯誤をする場合は、まずはLEARNING_RATE、LEARNING_SCHEDULE、EPOCHS、BATCH_SIZEのいずれかを調整することをお勧めします。各デフォルトのパラメータで数万局のデータからの学習がうまく行くことは確認しています。
ニューラルネットワークの定義
ニューラルネットワークの定義は下記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の教師あり学習のプロセスは下記の順番で実行されます。
- 指定ディレクトリからSGFファイル (拡張子が.sgfのファイル) を読み込み、dataディレクトリ以下に教師データとしてsl_data_*.npzを出力
- dataディレクトリ以下にあるsl_data_*.npzファイルを用いて教師あり学習を実行
教師データファイルの出力ステップ
教師データファイルの出力の実行については任意ですが
- 学習に使用したい教師データを変更したい時
- 入力特徴を変更した時
はデータ生成の再実行が必要になります。
教師ありの実行ステップ
教師あり学習を実行する際には、dataディレクトリ以下のsl_data_*.npzファイルを8:2の割合で学習に使用する訓練データと学習の経過を評価するための検証データに分割します。データの分割の割合を変えたい場合はlearn.pyの下記コードの値を0.8を0.0から1.0の範囲で変更してください。
train_data_set, test_data_set = split_train_test_set(data_set, 0.8)
教師あり学習の実行方法
/home/user/sgf_files以下に教師データとして使用するSGFファイルを格納し、学習を実行する場合はTamaGoのホームディレクトリで下記コマンドを実行してください。
python train.py --kifu-dir /home/user/sgf_files
既にdataディレクトリにsl_data_*.npzファイルがあり、それらファイルを使用して学習を実行する場合は、TamaGoのホームディレクトリで下記コマンドを実行してください。
python train.py
指定したエポック数学習を実行し、学習済みモデルファイルをmodelディレクトリ以下にsl-model.binという名前で出力します。学習済みモデルの使い方はこちらを参照してください。
コマンドラインオプション
| オプション | 概要 | 設定する値の例 | デフォルト値 | 備考 |
|---|---|---|---|---|
--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 | 教師あり学習では使用しないオプション。 |