tanuki- 2023-08-22 tanuki- 学習データ生成時の開始局面の戦型の割合 追試
実験内容
- 学習データ生成時の開始局面の戦型の割合を調整し、学習データを生成し、ランダムパラメーターから学習させ、レーティングを比較する。
- 戦型の割合を調整するときは、角換わりの戦型が全体の 10% になるよう、間引いて調整する。
- 角換わりの判定は、 20 手めまでに、双方の駒台に角が置かれたことがあることとする。
- レーティングの測定には dlshogi 互換局面集と、 dlshogi 互換局面集の戦型の割合を調整したものを使用する。
- 戦型の割合を調整するときは、角換わりの戦型が全体の 10% になるよう、間引いて調整する。
棋譜生成
生成ルーチン | tanuki-棋譜生成ルーチン |
評価関数 | tanuki-wcsc28 FV_SCALE=16 |
1手あたりの思考 | 深さ最大 9 思考ノード数最大 50,000 ノード |
開始局面 | foodgate の 2020 年~ 2021 年の棋譜のうち、レーティング 3900 以上同士の対局のうち 32 手目までから 1 局面ランダムに選択し、その局面を開始局面とした 戦型の割合をそのままにしたものと、角換わりの戦型の対局を 10% になるよう間引いたものの 2 つを使用した ランダムムーブなし |
生成局面数 | 10 億局面 |
生成条件 | 対局は打ち切らず詰みの局面まで学習データに出力した 対局開始時に置換表をクリアした |
シャッフル条件
生成ルーチン | tanuki-シャッフルルーチン |
qsearch() | あり |
置換表 | 無効 |
機械学習
機械学習ルーチン | nnue-pytorch + やねうら王 https://github.com/nodchip/nnue-pytorch/tree/shogi.2022-05-23 |
学習モデル | halfkp_256x2-32-32 |
学習手法 | SGD ミニバッチ法 |
初期学習率 (lr) | 8.75e-4 |
最適化手法 | Ranger |
学習率調整手法 | StepLR step=1 gamma=0.992 |
batch-size | 16384 |
threads | 1 |
num-workers | 8 |
gpus | 1 |
features | HalfKP |
max_epoch | 1000 |
scaling (kPonanzaConstant) | 361 |
lambda | 0.5 |
勝敗項の教師信号 | 0.999 |
レーティング測定
対局相手 | 対局開始時に置換表をクリアせずに生成した学習データを用いて学習させた評価関数 |
思考時間 | 持ち時間 300 秒 + 1 手 2 秒加算 |
対局数 | 5000 |
同時対局数 | 64 |
ハッシュサイズ | 768 |
開始局面 | dlshogi 互角局面集 dlshogi 互角局面集の角換わりの割合が 10% になるよう間引いたもの |
実験結果
機械学習
最初の 2 つのグラフのうち、青は開始局面の戦型の割合を調整していないもの、オレンジは開始局面の戦型の割合を調整したものを表す。
レーティング測定
対局数=5000 同時対局数=64 ハッシュサイズ=768 開始手数=0 最大手数=320 開始局面ファイル=C:\Jenkins\workspace\TanukiColiseum.2023-04-16\TanukiColiseum\floodgate32-80.sfen NUMAノード数=1 表示更新間隔(ms)=3600000
思考エンジン1 name=YaneuraOu NNUE 7.63 64ZEN2 TOURNAMENT author=by yaneurao exeファイル=C:\Jenkins\workspace\TanukiColiseum.2023-04-16\engine1\source\YaneuraOu-by-gcc.exe 評価関数フォルダパス=D:\hnoda\shogi\eval\tnk-wcsc28-2018-05-05.clear=yes.nnue-pytorch.shogi.2022-05-23 定跡手数=256 定跡ファイル名=no_book 思考ノード数=0 思考ノード数に加える乱数(%)=0 思考ノード数の乱数を1手毎に変化させる=False 持ち時間(ms)=300000 秒読み時間(ms)=0 加算時間(ms)=2000 乱数付き思考時間(ms)=0 スレッド数=1 BookEvalDiff=30 定跡の採択率を考慮する=true 定跡の手数を無視する=false SlowMover=100 DrawValue=-2 BookEvalBlackLimit=0 BookEvalWhiteLimit=-140 FVScale1=16 Depth1=0
思考エンジン2 name=YaneuraOu NNUE 7.63 64ZEN2 TOURNAMENT author=by yaneurao exeファイル=C:\Jenkins\workspace\TanukiColiseum.2023-04-16\engine2\source\YaneuraOu-by-gcc.exe 評価関数フォルダパス=D:\hnoda\shogi\eval\tnk-wcsc28-2018-05-05.clear=yes.nnue-pytorch.shogi.2022-05-23.adjust_bishop_exchange 定跡手数=256 定跡ファイル名=no_book 思考ノード数=0 思考ノード数に加える乱数(%)=0 思考ノード数の乱数を1手毎に変化させる=False 持ち時間(ms)=300000 秒読み時間(ms)=0 加算時間(ms)=2000 乱数付き思考時間(ms)=0 スレッド数=1 BookEvalDiff=30 定跡の採択率を考慮する=true 定跡の手数を無視する=false SlowMover=100 DrawValue=-2 BookEvalBlackLimit=0 BookEvalWhiteLimit=-140 FVScale2=16 Depth2=0
対局数5000 先手勝ち2598(56.2%) 後手勝ち2024(43.8%) 引き分け378
engine1
勝ち2294(49.6% R-2.4 +-9.6) 先手勝ち1318(28.5%) 後手勝ち976(21.1%)
宣言勝ち1 先手宣言勝ち0 後手宣言勝ち1 先手引き分け135 後手引き分け243
engine2
勝ち2328(50.4%) 先手勝ち1280(27.7%) 後手勝ち1048(22.7%)
宣言勝ち8 先手宣言勝ち3 後手宣言勝ち5 先手引き分け243 後手引き分け135
2294,378,2328
対局数=5000 同時対局数=64 ハッシュサイズ=768 開始手数=0 最大手数=320 開始局面ファイル=C:\Jenkins\workspace\TanukiColiseum.2023-04-16\TanukiColiseum\floodgate32-80.adjust_bishop_exchange.sfen NUMAノード数=1 表示更新間隔(ms)=3600000
思考エンジン1 name=YaneuraOu NNUE 7.63 64ZEN2 TOURNAMENT author=by yaneurao exeファイル=C:\Jenkins\workspace\TanukiColiseum.2023-04-16\engine1\source\YaneuraOu-by-gcc.exe 評価関数フォルダパス=D:\hnoda\shogi\eval\tnk-wcsc28-2018-05-05.clear=yes.nnue-pytorch.shogi.2022-05-23 定跡手数=256 定跡ファイル名=no_book 思考ノード数=0 思考ノード数に加える乱数(%)=0 思考ノード数の乱数を1手毎に変化させる=False 持ち時間(ms)=300000 秒読み時間(ms)=0 加算時間(ms)=2000 乱数付き思考時間(ms)=0 スレッド数=1 BookEvalDiff=30 定跡の採択率を考慮する=true 定跡の手数を無視する=false SlowMover=100 DrawValue=-2 BookEvalBlackLimit=0 BookEvalWhiteLimit=-140 FVScale1=16 Depth1=0
思考エンジン2 name=YaneuraOu NNUE 7.63 64ZEN2 TOURNAMENT author=by yaneurao exeファイル=C:\Jenkins\workspace\TanukiColiseum.2023-04-16\engine2\source\YaneuraOu-by-gcc.exe 評価関数フォルダパス=D:\hnoda\shogi\eval\tnk-wcsc28-2018-05-05.clear=yes.nnue-pytorch.shogi.2022-05-23.adjust_bishop_exchange 定跡手数=256 定跡ファイル名=no_book 思考ノード数=0 思考ノード数に加える乱数(%)=0 思考ノード数の乱数を1手毎に変化させる=False 持ち時間(ms)=300000 秒読み時間(ms)=0 加算時間(ms)=2000 乱数付き思考時間(ms)=0 スレッド数=1 BookEvalDiff=30 定跡の採択率を考慮する=true 定跡の手数を無視する=false SlowMover=100 DrawValue=-2 BookEvalBlackLimit=0 BookEvalWhiteLimit=-140 FVScale2=16 Depth2=0
対局数5000 先手勝ち2627(56.3%) 後手勝ち2038(43.7%) 引き分け335
engine1
勝ち2344(50.2% R1.6 +-9.6) 先手勝ち1350(28.9%) 後手勝ち994(21.3%)
宣言勝ち8 先手宣言勝ち5 後手宣言勝ち3 先手引き分け106 後手引き分け229
engine2
勝ち2321(49.8%) 先手勝ち1277(27.4%) 後手勝ち1044(22.4%)
宣言勝ち11 先手宣言勝ち7 後手宣言勝ち4 先手引き分け229 後手引き分け106
2344,335,2321
学習ロスは、開始局面の戦型を調整したほうがやや大きかった。
検証ロスは、両方とも、一度下がったあと、また上がり、一定の値へと収束した。また、開始局面の戦型を調整したほうが大きかった。
レーティングは、 dlshogi 互角局面集を用いた場合、開始局面の戦型を調整したほうが、していないものに対し、 R-2.4 レーティングが低かったが、有意な差はなかった。 dlshogi 互角局面集の戦型の調整を調整したものを用いた場合、開始局面の戦型を調整したほうが、していないものに対し、 R1.6 レーティングが高かったが、有意な差はなかった。
考察
学習ロスと検証ロスは、学習データに過学習していることを表していると考える。原因として 2 つ考えられる。
1 つは、学習データを、それぞれ 10 億局面しか用意していない点である。 10 億局面は、過去の実験で 80 億局面使用していたのに比べ、明らかに少ない。これにより、特定の局面に過学習したのだと考える。
もう 1 つは、検証データが少なかった点である。検証データは過去の実験においては、 7 百万局面程度使用した。一方、今回は 100 万局面しか使用しなかった。これにより、特定の局面に過学習したのだと考える。
レーティングについては、開始局面の戦型の割合を調整しても、その戦型に特化した評価関数を作れないということを表していると考える。この考察は、学習データに過学習していることを加味しても変わらないと考える。
まとめ
学習データ生成時の開始局面の戦型の割合を調整し、学習データを生成し、ランダムパラメーターから学習させ、レーティングを比較した。戦型の割合を調整したときは、角換わりの戦型が全体の 10% になるよう、間引いて調整した。角換わりの判定は、 20 手めまでに、双方の駒台に角が置かれたことがあることとした。また、レーティングの測定には dlshogi 互換局面集と、 dlshogi 互換局面集の戦型の割合を調整したものを使用した。戦型の割合を調整したときは、角換わりの戦型が全体の 10% になるよう、間引いて調整した。
結果、開始局面の戦型の割合を調整しても、レーティングに変化がなかった。これは、開始局面の戦型の割合を調整しても、その戦型に特化した評価関数を作れないということを表していると考える。
次回は、たややん定跡生成スクリプト 2023 による、角換わり基本図からの定跡生成の追試を行いたい。