tanuki- 2025-06-22 知識蒸留 qsearch あり+なし アンサンブル
実験内容
-
知識蒸留を行う。
-
複数の教師モデルをアンサンブルする。
-
アンサンブルには以下のモデルを使用する。
-
DL 水匠
-
AobaZero 20240329_153000_model_resnet30x384_relu_027
-
シャッフル時に qsearch を行った学習データと行わなかった学習データをアンサンブルする。
生成ルーチン
|
tanuki-棋譜生成ルーチン
|
評価関数
|
tanuki-.nnue-pytorch-2024-07-30.1
|
1手あたりの思考
|
深さ最大 9
思考ノード数最大 50,000 ノード
|
開始局面
|
foodgate の 2020 年~ 2021 年の棋譜を使用した。レーティング 3900 以上同士の対局のみ使用した。戦型が角換わりの対局が 10% になるよう調整した。 32 手目までから 1 局面ランダムに選択し、その局面を開始局面とした。ランダムムーブはしなかった。
|
生成局面数
|
10 億局面 × 8 セット
|
生成条件
|
対局は打ち切らず詰みの局面まで学習データに出力した
|
フォルダ名
|
tanuki-.nnue-pytorch-2024-07-30.1
|
シャッフル条件
生成ルーチン
|
tanuki-シャッフルルーチン
|
qsearch()
|
あり+なし
|
置換表
|
無効
|
min_progress
|
0.0
|
重複した局面
|
取り除かない
|
知識蒸留
Knowledge
|
Response-based Knowledge
|
Distillation Schemes
|
Offline Knowledge Distillation
|
Teacher network
|
DL 水匠 dlsuisho-15b-20220426
AobaZero 20240329_153000_model_resnet30x384_relu_027
|
機械学習ルーチン
|
nnue-pytorch + やねうら王
https://github.com/nodchip/nnue-pytorch/tree/shogi.2025-04-12.halfkp_512x2-8-96
|
学習モデル
|
halfkp_512x2-8-96
|
学習手法
|
ミニバッチ SGD
|
初期学習率 (lr)
|
0.5
|
最適化手法
|
なし
|
学習率調整手法
|
Warmup + Newbob 風
|
batch-size
|
16384
|
threads
|
16
|
num-workers
|
16
|
accelerator
|
gpu
|
devices
|
1
|
features
|
HalfKP
|
max-epoch
|
1000000
|
score-scaling
|
511
|
lambda
|
1.0
|
勝敗項の教師信号
|
1.0
|
num-batches-warmup
|
10000
|
newbob-decay
|
0.5
|
epoch-size
|
1000000
|
num-epochs-to-adjust-lr
|
500
|
学習を打ち切る下限 newbob scale
|
1e-5
|
1 epoch 毎のネットワークパラメーターのクリップ
|
あり
|
ネットワークパラメーターの量子化
|
量子化なしで学習し、収束後に量子化する。
|
ネットワークパラメーターの初期化方法
|
pytorch のデフォルトの初期化手法で初期化する。
|
勾配の正規化
|
なし
|
momentum
|
0.9
|
入玉ボーナス
|
入玉時、持ち駒および敵陣三段目までに侵入している駒について、小駒 1 枚につき 20 点、大駒 1 枚につき 100 点、敵陣三段目までに侵入している駒 1 枚につき 20 点追加する。
|
レーティング測定
実験結果
レーティング測定
対局数=2000 同時対局数=64 ハッシュサイズ=384 開始手数=24 最大手数=320 開始局面ファイル=C:\Jenkins\workspace\TanukiColiseum.2025-05-01\TanukiColiseum\floodgate32-80.adjust_bishop_exchange.sfen NUMAノード数=1 表示更新間隔(ms)=3600000
思考エンジン1 思考エンジン2
name YaneuraOu NNUE 8.60git 64ZEN2 TOURNAMENT YaneuraOu NNUE 8.60git 64ZEN2 TOURNAMENT
author by yaneurao by yaneurao
exeファイル C:\Jenkins\workspace\TanukiColiseum.2025-05-01\engine1\source\YaneuraOu-by-gcc.exe C:\Jenkins\workspace\TanukiColiseum.2025-05-01\engine2\source\YaneuraOu-by-gcc.exe
評価関数フォルダパス D:\hnoda\shogi\eval\tanuki-.nnue-pytorch-2025-06-14.0 D:\hnoda\shogi\eval\tanuki-.nnue-pytorch-2025-04-27.0
定跡手数 256 256
定跡ファイル名 no_book no_book
思考ノード数 0 0
思考ノード数に加える乱数(%) 0 0
思考ノード数の乱数を1手毎に変化させる False False
持ち時間(ms) 300000 300000
秒読み時間(ms) 0 0
加算時間(ms) 2000 2000
乱数付き思考時間(ms) 0 0
スレッド数 1 1
BookEvalDiff 30 30
定跡の採択率を考慮する true true
定跡の手数を無視する true true
SlowMover 100 100
DrawValue -2 -2
BookEvalBlackLimit 0 0
BookEvalWhiteLimit -140 -140
FVScale 20 40
Depth=0 0
MinimumThinkingTime 1000 1000
Ponder false false
対局数2000 先手勝ち946(53.3%) 後手勝ち830(46.7%) 引き分け224
engine1
勝ち629(35.4% R-92.1 +-15.8) 先手勝ち338(19.0%) 後手勝ち291(16.4%)
宣言勝ち25 先手宣言勝ち12 後手宣言勝ち13 先手引き分け119 後手引き分け105
engine2
勝ち1147(64.6%) 先手勝ち608(34.2%) 後手勝ち539(30.3%)
宣言勝ち27 先手宣言勝ち13 後手宣言勝ち14 先手引き分け105 後手引き分け119
629,224,1147
対局数=2000 同時対局数=64 ハッシュサイズ=384 開始手数=24 最大手数=320 開始局面ファイル=C:\Jenkins\workspace\TanukiColiseum.2025-05-01\TanukiColiseum\floodgate32-80.adjust_bishop_exchange.sfen NUMAノード数=1 表示更新間隔(ms)=3600000
思考エンジン1 思考エンジン2
name YaneuraOu NNUE 8.60git 64ZEN2 TOURNAMENT YaneuraOu NNUE 8.60git 64ZEN2 TOURNAMENT
author by yaneurao by yaneurao
exeファイル C:\Jenkins\workspace\TanukiColiseum.2025-05-01\engine1\source\YaneuraOu-by-gcc.exe C:\Jenkins\workspace\TanukiColiseum.2025-05-01\engine2\source\YaneuraOu-by-gcc.exe
評価関数フォルダパス D:\hnoda\shogi\eval\tanuki-.nnue-pytorch-2025-06-14.0 D:\hnoda\shogi\eval\tanuki-.nnue-pytorch-2025-04-27.0
定跡手数 256 256
定跡ファイル名 no_book no_book
思考ノード数 0 0
思考ノード数に加える乱数(%) 0 0
思考ノード数の乱数を1手毎に変化させる False False
持ち時間(ms) 300000 300000
秒読み時間(ms) 0 0
加算時間(ms) 2000 2000
乱数付き思考時間(ms) 0 0
スレッド数 1 1
BookEvalDiff 30 30
定跡の採択率を考慮する true true
定跡の手数を無視する true true
SlowMover 100 100
DrawValue -2 -2
BookEvalBlackLimit 0 0
BookEvalWhiteLimit -140 -140
FVScale 24 40
Depth=0 0
MinimumThinkingTime 1000 1000
Ponder false false
対局数2000 先手勝ち973(55.5%) 後手勝ち780(44.5%) 引き分け247
engine1
勝ち676(38.6% R-70.6 +-15.5) 先手勝ち384(21.9%) 後手勝ち292(16.7%)
宣言勝ち23 先手宣言勝ち13 後手宣言勝ち10 先手引き分け125 後手引き分け122
engine2
勝ち1077(61.4%) 先手勝ち589(33.6%) 後手勝ち488(27.8%)
宣言勝ち20 先手宣言勝ち9 後手宣言勝ち11 先手引き分け122 後手引き分け125
676,247,1077
対局数=2000 同時対局数=64 ハッシュサイズ=384 開始手数=24 最大手数=320 開始局面ファイル=C:\Jenkins\workspace\TanukiColiseum.2025-05-01\TanukiColiseum\floodgate32-80.adjust_bishop_exchange.sfen NUMAノード数=1 表示更新間隔(ms)=3600000
思考エンジン1 思考エンジン2
name YaneuraOu NNUE 8.60git 64ZEN2 TOURNAMENT YaneuraOu NNUE 8.60git 64ZEN2 TOURNAMENT
author by yaneurao by yaneurao
exeファイル C:\Jenkins\workspace\TanukiColiseum.2025-05-01\engine1\source\YaneuraOu-by-gcc.exe C:\Jenkins\workspace\TanukiColiseum.2025-05-01\engine2\source\YaneuraOu-by-gcc.exe
評価関数フォルダパス D:\hnoda\shogi\eval\tanuki-.nnue-pytorch-2025-06-14.0 D:\hnoda\shogi\eval\tanuki-.nnue-pytorch-2025-04-27.0
定跡手数 256 256
定跡ファイル名 no_book no_book
思考ノード数 0 0
思考ノード数に加える乱数(%) 0 0
思考ノード数の乱数を1手毎に変化させる False False
持ち時間(ms) 300000 300000
秒読み時間(ms) 0 0
加算時間(ms) 2000 2000
乱数付き思考時間(ms) 0 0
スレッド数 1 1
BookEvalDiff 30 30
定跡の採択率を考慮する true true
定跡の手数を無視する true true
SlowMover 100 100
DrawValue -2 -2
BookEvalBlackLimit 0 0
BookEvalWhiteLimit -140 -140
FVScale 32 40
Depth=0 0
MinimumThinkingTime 1000 1000
Ponder false false
対局数2000 先手勝ち927(54.1%) 後手勝ち788(45.9%) 引き分け285
engine1
勝ち692(40.3% R-58.0 +-15.4) 先手勝ち381(22.2%) 後手勝ち311(18.1%)
宣言勝ち20 先手宣言勝ち10 後手宣言勝ち10 先手引き分け141 後手引き分け144
engine2
勝ち1023(59.7%) 先手勝ち546(31.8%) 後手勝ち477(27.8%)
宣言勝ち21 先手宣言勝ち12 後手宣言勝ち9 先手引き分け144 後手引き分け141
692,285,1023
対局数=2000 同時対局数=64 ハッシュサイズ=384 開始手数=24 最大手数=320 開始局面ファイル=C:\Jenkins\workspace\TanukiColiseum.2025-05-01\TanukiColiseum\floodgate32-80.adjust_bishop_exchange.sfen NUMAノード数=1 表示更新間隔(ms)=3600000
思考エンジン1 思考エンジン2
name YaneuraOu NNUE 8.60git 64ZEN2 TOURNAMENT YaneuraOu NNUE 8.60git 64ZEN2 TOURNAMENT
author by yaneurao by yaneurao
exeファイル C:\Jenkins\workspace\TanukiColiseum.2025-05-01\engine1\source\YaneuraOu-by-gcc.exe C:\Jenkins\workspace\TanukiColiseum.2025-05-01\engine2\source\YaneuraOu-by-gcc.exe
評価関数フォルダパス D:\hnoda\shogi\eval\tanuki-.nnue-pytorch-2025-06-14.0 D:\hnoda\shogi\eval\tanuki-.nnue-pytorch-2025-04-27.0
定跡手数 256 256
定跡ファイル名 no_book no_book
思考ノード数 0 0
思考ノード数に加える乱数(%) 0 0
思考ノード数の乱数を1手毎に変化させる False False
持ち時間(ms) 300000 300000
秒読み時間(ms) 0 0
加算時間(ms) 2000 2000
乱数付き思考時間(ms) 0 0
スレッド数 1 1
BookEvalDiff 30 30
定跡の採択率を考慮する true true
定跡の手数を無視する true true
SlowMover 100 100
DrawValue -2 -2
BookEvalBlackLimit 0 0
BookEvalWhiteLimit -140 -140
FVScale 40 40
Depth=0 0
MinimumThinkingTime 1000 1000
Ponder false false
対局数2000 先手勝ち959(55.3%) 後手勝ち776(44.7%) 引き分け265
engine1
勝ち710(40.9% R-55.2 +-15.4) 先手勝ち397(22.9%) 後手勝ち313(18.0%)
宣言勝ち27 先手宣言勝ち14 後手宣言勝ち13 先手引き分け140 後手引き分け125
engine2
勝ち1025(59.1%) 先手勝ち562(32.4%) 後手勝ち463(26.7%)
宣言勝ち21 先手宣言勝ち14 後手宣言勝ち7 先手引き分け125 後手引き分け140
710,265,1025
対局数=2000 同時対局数=64 ハッシュサイズ=384 開始手数=24 最大手数=320 開始局面ファイル=C:\Jenkins\workspace\TanukiColiseum.2025-05-01\TanukiColiseum\floodgate32-80.adjust_bishop_exchange.sfen NUMAノード数=1 表示更新間隔(ms)=3600000
思考エンジン1 思考エンジン2
name YaneuraOu NNUE 8.60git 64ZEN2 TOURNAMENT YaneuraOu NNUE 8.60git 64ZEN2 TOURNAMENT
author by yaneurao by yaneurao
exeファイル C:\Jenkins\workspace\TanukiColiseum.2025-05-01\engine1\source\YaneuraOu-by-gcc.exe C:\Jenkins\workspace\TanukiColiseum.2025-05-01\engine2\source\YaneuraOu-by-gcc.exe
評価関数フォルダパス D:\hnoda\shogi\eval\tanuki-.nnue-pytorch-2025-06-14.0 D:\hnoda\shogi\eval\tanuki-.nnue-pytorch-2025-04-27.0
定跡手数 256 256
定跡ファイル名 no_book no_book
思考ノード数 0 0
思考ノード数に加える乱数(%) 0 0
思考ノード数の乱数を1手毎に変化させる False False
持ち時間(ms) 300000 300000
秒読み時間(ms) 0 0
加算時間(ms) 2000 2000
乱数付き思考時間(ms) 0 0
スレッド数 1 1
BookEvalDiff 30 30
定跡の採択率を考慮する true true
定跡の手数を無視する true true
SlowMover 100 100
DrawValue -2 -2
BookEvalBlackLimit 0 0
BookEvalWhiteLimit -140 -140
FVScale 48 40
Depth=0 0
MinimumThinkingTime 1000 1000
Ponder false false
対局数2000 先手勝ち956(55.8%) 後手勝ち757(44.2%) 引き分け287
engine1
勝ち704(41.1% R-53.4 +-15.4) 先手勝ち392(22.9%) 後手勝ち312(18.2%)
宣言勝ち24 先手宣言勝ち11 後手宣言勝ち13 先手引き分け163 後手引き分け124
engine2
勝ち1009(58.9%) 先手勝ち564(32.9%) 後手勝ち445(26.0%)
宣言勝ち26 先手宣言勝ち13 後手宣言勝ち13 先手引き分け124 後手引き分け163
704,287,1009
学習ロスと検証ロスは、 qsearch ありより高くなった。
自己対局では、 qsearch ありと比べてレーティングが最小でも R53.4 低く、有意な差があった。
考察
ロスが高かった理由は、 qsearch の PV の末端局面のほうが学習しやすいためだと思う。末端局面は駒のやり取りが終わったあとの局面のため、情報量が少ないのだと思う。
レーティングについては、思考エンジンは qsearch の PV の末端局面を評価しているのに対し、学習データの qsearch の PV の末端局面以外も含まれており、それらも学習したため、局面の評価の精度が落ちてしまっているのだと思う。
まとめ
知識蒸留を行った。複数の教師モデルをアンサンブルした。アンサンブルには DL 水匠、 AobaZero 20240329_153000_model_resnet30x384_relu_027 を使用した。 シャッフル時に qsearch を行った学習データと行わなかった学習データをアンサンブルした。
自己対局では、 qsearch ありと比べてレーティングが最小でも R53.4 低く、有意な差があった。
レーティングについては、思考エンジンは qsearch の PV の末端局面を評価しているのに対し、学習データの qsearch の PV の末端局面以外も含まれており、それらも学習したため、局面の評価の精度が落ちてしまっているのだと思う。
次回は DL 水匠と AobaZero (WCSC35) 20250407_235846_model_resnet30x384_relu_060 から知識蒸留を行い、レーティングを測定したい。