nodchipのコンピューター将棋ブログ

コンピューター将棋ソフト「tanuki-」シリーズの実験結果を掲載しています。

tanuki- 2025-07-16 知識蒸留 棋譜追加

tanuki- 2025-07-16 知識蒸留 棋譜追加

実験内容

  • 知識蒸留を行う。
  • 複数の教師モデルをアンサンブルする。
  • アンサンブルには以下のモデルを使用する。
    • DL 水匠 dlsuisho-15b-20220426
    • AobaZero 20240329_153000_model_resnet30x384_relu_027
  • 電竜戦TSEC指定局面と香落ち戦の棋譜を開始局面として自己対局を行い、棋譜を生成し、学習データに加える。

棋譜生成

生成ルーチン tanuki-棋譜生成ルーチン
評価関数 tanuki-.nnue-pytorch-2024-07-30.1
1手あたりの思考 深さ最大 9 思考ノード数最大 50,000 ノード
開始局面 1. foodgate の 2020 年~ 2021 年の棋譜を使用した。レーティング 3900 以上同士の対局のみ使用した。戦型が角換わりの対局が 10% になるよう調整した。 32 手目までから 1 局面ランダムに選択し、その局面を開始局面とした。ランダムムーブはしなかった。 2. 電竜戦TSEC指定局面と香落ち戦の棋譜を使用した。全局面から 1 局面ランダムに選択し、その局面を開始局面とした。ランダムムーブはしなかった。
生成局面数 10 億局面 × (8 + 1)セット
生成条件 対局は打ち切らず詰みの局面まで学習データに出力した
フォルダ名 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 点追加する。

レーティング測定

対局相手 https://docs.google.com/document/d/107vvP_UBlUe01rJaDeX9Rn2aut-6xpeHlIdr07-NIw0/edit?usp=sharing tanuki-.nnue-pytorch-2025-04-27.0
思考時間 持ち時間 300 秒 + 1 手 2 秒加算
対局数 5000
同時対局数 64
ハッシュサイズ 384
開始局面 dlshogi 互角局面集の角換わりの割合が 10% になるよう間引いたもの

実験結果

機械学習

レーティング測定

対局数=5000 同時対局数=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-07-12.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

対局数5000 先手勝ち2412(55.4%) 後手勝ち1939(44.6%) 引き分け649

engine1

勝ち2126(48.9% R-6.9 +-9.6) 先手勝ち1184(27.2%) 後手勝ち942(21.7%)

宣言勝ち69 先手宣言勝ち24 後手宣言勝ち45 先手引き分け320 後手引き分け329

engine2

勝ち2225(51.1%) 先手勝ち1228(28.2%) 後手勝ち997(22.9%)

宣言勝ち68 先手宣言勝ち38 後手宣言勝ち30 先手引き分け329 後手引き分け320

2126,649,2225

学習ロスと検証ロスは、学習データを追加する前より高くなった。

自己対局では、学習データを追加する前と比べてレーティングが R6.9 低かったが、有意な差はなかった。

考察

ロスが高かった理由は、学習データにより多様な局面が含まれるようになったためだと思う。

レーティングに有意な差がなかった理由は、多様な局面を含めても、必ずしも棋力の向上につながるわけではないためだと思う。

まとめ

知識蒸留を行った。複数の教師モデルをアンサンブルした。アンサンブルには DL 水匠 dlsuisho-15b-20220426 と AobaZero 20240329_153000_model_resnet30x384_relu_027 を使用した。電竜戦TSEC指定局面と香落ち戦の棋譜を開始局面として自己対局を行い、棋譜を生成し、学習データに加えた。

自己対局では、学習データを追加する前と比べてレーティングが R6.9 低かったが、有意な差はなかった。レーティングに有意な差がなかった理由は、多様な局面を含めても、必ずしも棋力の向上につながるわけではないためだと思う。

次回は学習モデルを halfkp_512x2-16-96 に変更して学習させ、レーティングを測定したい。

tanuki- 2025-07-02 知識蒸留 DL 水匠 + AobaZero WCSC35

tanuki- 2025-07-02 知識蒸留 DL 水匠 + AobaZero WCSC35

実験内容

  • 知識蒸留を行う。
  • 複数の教師モデルをアンサンブルする。
  • アンサンブルには以下のモデルを使用する。
    • DL 水匠 dlsuisho-15b-20220426
    • AobaZero 20250407_235846_model_resnet30x384_relu_060

    棋譜生成

    生成ルーチン 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 20250407_235846_model_resnet30x384_relu_060

    機械学習

    機械学習ルーチン 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 点追加する。

    レーティング測定

    対局相手 https://docs.google.com/document/d/107vvP_UBlUe01rJaDeX9Rn2aut-6xpeHlIdr07-NIw0/edit?usp=sharing tanuki-.nnue-pytorch-2025-04-27.0
    思考時間 持ち時間 300 秒 + 1 手 2 秒加算
    対局数 5000
    同時対局数 64
    ハッシュサイズ 384
    開始局面 dlshogi 互角局面集の角換わりの割合が 10% になるよう間引いたもの

    実験結果

    機械学習

    レーティング測定

    対局数=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-26.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 先手勝ち1004(52.5%) 後手勝ち910(47.5%) 引き分け86

    engine1

    勝ち212(11.1% R-334.1 +-22.8) 先手勝ち125(6.5%) 後手勝ち87(4.5%)

    宣言勝ち6 先手宣言勝ち4 後手宣言勝ち2 先手引き分け51 後手引き分け35

    engine2

    勝ち1702(88.9%) 先手勝ち879(45.9%) 後手勝ち823(43.0%)

    宣言勝ち1 先手宣言勝ち1 後手宣言勝ち0 先手引き分け35 後手引き分け51

    212,86,1702

    対局数=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-26.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 先手勝ち1009(52.6%) 後手勝ち909(47.4%) 引き分け82

    engine1

    勝ち201(10.5% R-344.5 +-23.4) 先手勝ち121(6.3%) 後手勝ち80(4.2%)

    宣言勝ち5 先手宣言勝ち3 後手宣言勝ち2 先手引き分け48 後手引き分け34

    engine2

    勝ち1717(89.5%) 先手勝ち888(46.3%) 後手勝ち829(43.2%)

    宣言勝ち1 先手宣言勝ち1 後手宣言勝ち0 先手引き分け34 後手引き分け48

    201,82,1717

    対局数=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-26.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 先手勝ち972(51.2%) 後手勝ち926(48.8%) 引き分け102

    engine1

    勝ち226(11.9% R-317.5 +-22.0) 先手勝ち121(6.4%) 後手勝ち105(5.5%)

    宣言勝ち10 先手宣言勝ち7 後手宣言勝ち3 先手引き分け60 後手引き分け42

    engine2

    勝ち1672(88.1%) 先手勝ち851(44.8%) 後手勝ち821(43.3%)

    宣言勝ち2 先手宣言勝ち0 後手宣言勝ち2 先手引き分け42 後手引き分け60

    226,102,1672

    対局数=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-26.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 先手勝ち997(52.3%) 後手勝ち910(47.7%) 引き分け93

    engine1

    勝ち241(12.6% R-310.0 +-21.7) 先手勝ち138(7.2%) 後手勝ち103(5.4%)

    宣言勝ち10 先手宣言勝ち4 後手宣言勝ち6 先手引き分け54 後手引き分け39

    engine2

    勝ち1666(87.4%) 先手勝ち859(45.0%) 後手勝ち807(42.3%)

    宣言勝ち3 先手宣言勝ち2 後手宣言勝ち1 先手引き分け39 後手引き分け54

    241,93,1666

    対局数=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-26.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 先手勝ち1019(53.5%) 後手勝ち885(46.5%) 引き分け96

    engine1

    勝ち206(10.8% R-334.9 +-22.9) 先手勝ち134(7.0%) 後手勝ち72(3.8%)

    宣言勝ち5 先手宣言勝ち3 後手宣言勝ち2 先手引き分け55 後手引き分け41

    engine2

    勝ち1698(89.2%) 先手勝ち885(46.5%) 後手勝ち813(42.7%)

    宣言勝ち3 先手宣言勝ち1 後手宣言勝ち2 先手引き分け41 後手引き分け55

    206,96,1698

    学習ロスと検証ロスは、 DL 水匠 + AobaZero 34 より高くなった。

    自己対局では、 DL 水匠 + AobaZero 34 と比べてレーティングが最小でも R310.0 低く、有意な差があった。

    https://github.com/yssaya/dlshogi_aoba/releases/tag/v1 はリンクエラーにより、ビルドできなかった。

    https://github.com/yssaya/dlshogi_aoba/releases/tag/v1 の変更をやねうら王に移植し、思考させたところ、 tanuki-wcsc35 と評価値が大きく異なっていた。

    考察

    ロスが高かった理由は、 AobaZero WCSC35 のモデルの推論に失敗しており、学習データに出鱈目な評価値がついていたためだと思う。

    レーティングについても同様の理由だと思う。

    まとめ

    知識蒸留を行った。複数の教師モデルをアンサンブルした。アンサンブルには DL 水匠 dlsuisho-15b-20220426、AobaZero 20250407_235846_model_resnet30x384_relu_060 を使用した。

    自己対局では、 DL 水匠 + AobaZero 34 と比べてレーティングが最小でも R310.0 低く、有意な差があった。

    レーティングが有意に低かった理由は、 AobaZero WCSC35 のモデルの推論に失敗しており、学習データに出鱈目な評価値がついていたためだと思う。

    次回は電竜戦 TSEC の棋譜から開始局面を選択し、学習データを生成し、既存の学習データに加えて学習させ、レーティングを測定したい。

tanuki- 2025-06-22 知識蒸留 qsearch あり+なし

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 点追加する。

レーティング測定

対局相手 https://docs.google.com/document/d/107vvP_UBlUe01rJaDeX9Rn2aut-6xpeHlIdr07-NIw0/edit?usp=sharing tanuki-.nnue-pytorch-2025-04-27.0
思考時間 持ち時間 300 秒 + 1 手 2 秒加算
対局数 5000
同時対局数 64
ハッシュサイズ 384
開始局面 dlshogi 互角局面集の角換わりの割合が 10% になるよう間引いたもの

実験結果

機械学習

レーティング測定

対局数=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 から知識蒸留を行い、レーティングを測定したい。

tanuki- 2025-06-22 知識蒸留 qsearch あり+なし アンサンブル

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 点追加する。

レーティング測定

対局相手 https://docs.google.com/document/d/107vvP_UBlUe01rJaDeX9Rn2aut-6xpeHlIdr07-NIw0/edit?usp=sharing tanuki-.nnue-pytorch-2025-04-27.0
思考時間 持ち時間 300 秒 + 1 手 2 秒加算
対局数 5000
同時対局数 64
ハッシュサイズ 384
開始局面 dlshogi 互角局面集の角換わりの割合が 10% になるよう間引いたもの

実験結果

機械学習

レーティング測定

対局数=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 から知識蒸留を行い、レーティングを測定したい。

tanuki- 2025-06-14 知識蒸留 qsearch なし

tanuki- 2025-06-14 知識蒸留 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 点追加する。

レーティング測定

対局相手 https://docs.google.com/document/d/107vvP_UBlUe01rJaDeX9Rn2aut-6xpeHlIdr07-NIw0/edit?usp=sharing tanuki-.nnue-pytorch-2025-04-27.0
思考時間 持ち時間 300 秒 + 1 手 2 秒加算
対局数 5000
同時対局数 64
ハッシュサイズ 384
開始局面 dlshogi 互角局面集の角換わりの割合が 10% になるよう間引いたもの

実験結果

機械学習

レーティング測定

対局数=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-09.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 先手勝ち985(54.3%) 後手勝ち828(45.7%) 引き分け187

engine1

勝ち461(25.4% R-166.4 +-17.0) 先手勝ち266(14.7%) 後手勝ち195(10.8%)

宣言勝ち24 先手宣言勝ち12 後手宣言勝ち12 先手引き分け102 後手引き分け85

engine2

勝ち1352(74.6%) 先手勝ち719(39.7%) 後手勝ち633(34.9%)

宣言勝ち7 先手宣言勝ち3 後手宣言勝ち4 先手引き分け85 後手引き分け102

461,187,1352

対局数=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-09.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 先手勝ち951(52.9%) 後手勝ち846(47.1%) 引き分け203

engine1

勝ち518(28.8% R-139.2 +-16.5) 先手勝ち285(15.9%) 後手勝ち233(13.0%)

宣言勝ち16 先手宣言勝ち5 後手宣言勝ち11 先手引き分け102 後手引き分け101

engine2

勝ち1279(71.2%) 先手勝ち666(37.1%) 後手勝ち613(34.1%)

宣言勝ち12 先手宣言勝ち2 後手宣言勝ち10 先手引き分け101 後手引き分け102

518,203,1279

対局数=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-09.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 先手勝ち955(54.0%) 後手勝ち812(46.0%) 引き分け233

engine1

勝ち561(31.7% R-116.2 +-16.1) 先手勝ち320(18.1%) 後手勝ち241(13.6%)

宣言勝ち24 先手宣言勝ち14 後手宣言勝ち10 先手引き分け111 後手引き分け122

engine2

勝ち1206(68.3%) 先手勝ち635(35.9%) 後手勝ち571(32.3%)

宣言勝ち12 先手宣言勝ち8 後手宣言勝ち4 先手引き分け122 後手引き分け111

561,233,1206

対局数=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-09.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 先手勝ち981(56.1%) 後手勝ち769(43.9%) 引き分け250

engine1

勝ち552(31.5% R-116.4 +-16.1) 先手勝ち322(18.4%) 後手勝ち230(13.1%)

宣言勝ち23 先手宣言勝ち13 後手宣言勝ち10 先手引き分け136 後手引き分け114

engine2

勝ち1198(68.5%) 先手勝ち659(37.7%) 後手勝ち539(30.8%)

宣言勝ち10 先手宣言勝ち3 後手宣言勝ち7 先手引き分け114 後手引き分け136

552,250,1198

対局数=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-09.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 先手勝ち977(55.3%) 後手勝ち791(44.7%) 引き分け232

engine1

勝ち557(31.5% R-117.9 +-16.1) 先手勝ち324(18.3%) 後手勝ち233(13.2%)

宣言勝ち25 先手宣言勝ち15 後手宣言勝ち10 先手引き分け116 後手引き分け116

engine2

勝ち1211(68.5%) 先手勝ち653(36.9%) 後手勝ち558(31.6%)

宣言勝ち12 先手宣言勝ち8 後手宣言勝ち4 先手引き分け116 後手引き分け116

557,232,1211

学習ロスと検証ロスは、 qsearch ありより高くなった。

自己対局では、 qsearch ありと比べてレーティングが最小でも R116.2 低く、有意な差があった。

考察

ロスが高かった理由は、 qsearch の PV の末端局面のほうが学習しやすいためだと思う。末端局面は駒のやり取りが終わったあとの局面のため、情報量が少ないのだと思う。

レーティングについては、思考時の探索の末端局面が学習データに少なかったのが原因だと思う。

まとめ

知識蒸留を行った。複数の教師モデルをアンサンブルした。アンサンブルには DL 水匠、 AobaZero 20240329_153000_model_resnet30x384_relu_027 を使用した。 シャッフル時に qsearch を行わなかった。

自己対局では、 qsearch ありと比べてレーティングが最小でも R116.2 低く、有意な差があった。思考時の探索の末端局面が学習データに少なかったのが原因だと思う。

次回はシャッフル時に qsearch を行った局面と行わなかった局面を混ぜ、学習させ、レーティングを測定したい。

tanuki- 2025-06-02 知識蒸留 重複した局面を取り除く

tanuki- 2025-06-02 知識蒸留 重複した局面を取り除く

実験内容

  • 知識蒸留を行う。
  • 複数の教師モデルをアンサンブルする。
  • アンサンブルには以下のモデルを使用する。
    • DL 水匠
    • AobaZero 20240329_153000_model_resnet30x384_relu_027
  • 重複した局面を取り除く。

棋譜生成

生成ルーチン 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 点追加する。

レーティング測定

対局相手 https://docs.google.com/document/d/107vvP_UBlUe01rJaDeX9Rn2aut-6xpeHlIdr07-NIw0/edit?usp=sharing tanuki-.nnue-pytorch-2025-04-27.0
思考時間 持ち時間 300 秒 + 1 手 2 秒加算
対局数 5000
同時対局数 64
ハッシュサイズ 384
開始局面 dlshogi 互角局面集の角換わりの割合が 10% になるよう間引いたもの

実験結果

機械学習

レーティング測定

対局数=5000 同時対局数=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-05-29.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

対局数5000 先手勝ち2289(54.0%) 後手勝ち1953(46.0%) 引き分け758

engine1

勝ち2144(50.5% R3.2 +-9.6) 先手勝ち1153(27.2%) 後手勝ち991(23.4%)

宣言勝ち56 先手宣言勝ち18 後手宣言勝ち38 先手引き分け385 後手引き分け373

engine2

勝ち2098(49.5%) 先手勝ち1136(26.8%) 後手勝ち962(22.7%)

宣言勝ち66 先手宣言勝ち37 後手宣言勝ち29 先手引き分け373 後手引き分け385

2144,758,2098

学習ロスと検証ロスは、重複した局面を取り除いたほうが高くなった。

自己対局では、重複した局面を取り除かなかった場合と比べてレーティングが R3.2 高かったが、有意な差はなかった。

考察

ロスが高かった理由は、重複した局面が序盤に多く、それらの局面の評価値の絶対値が低かったためだと思う。それらの局面が減ったため、全体的に評価値の絶対値が高くなり、クロスエントロピーが高くなったのだと思う。

レーティングについては、重複した局面を取り除いて学習しても、評価関数としての性質はあまり変わらないということなのだと思う。

まとめ

知識蒸留を行った。複数の教師モデルをアンサンブルした。アンサンブルには DL 水匠、 AobaZero 20240329_153000_model_resnet30x384_relu_027 を使用した。 重複した局面を取り除いた。

自己対局では、重複した局面を取り除かなかった場合と比べてレーティングが R3.2 高かったが、有意な差はなかった。

レーティングについては、重複した局面を取り除いて学習しても、評価関数としての性質はあまり変わらないということなのだと思う。

次回はシャッフル時に qsearch を行わないようにし、学習させ、レーティングを測定したい。

tanuki- 2025-05-29 知識蒸留 mate の値はそのまま学習する

tanuki- 2025-05-29 知識蒸留 mate の値はそのままにする

実験内容

  • 知識蒸留を行う。
  • 複数の教師モデルをアンサンブルする。
  • アンサンブルには以下のモデルを使用する。
    • DL 水匠
    • AobaZero 20240329_153000_model_resnet30x384_relu_027
  • 学習データの mate の値はそのまま使用する。

棋譜生成

生成ルーチン 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 水匠 AobaZero 20240329_153000_model_resnet30x384_relu_027
その他 学習データの mate の値はそのまま使用する。

機械学習

機械学習ルーチン 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 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 点追加する。

レーティング測定

対局相手 https://docs.google.com/document/d/107vvP_UBlUe01rJaDeX9Rn2aut-6xpeHlIdr07-NIw0/edit?usp=sharing tanuki-.nnue-pytorch-2025-04-27.0
思考時間 持ち時間 300 秒 + 1 手 2 秒加算
対局数 5000
同時対局数 64
ハッシュサイズ 384
開始局面 dlshogi 互角局面集の角換わりの割合が 10% になるよう間引いたもの

実験結果

機械学習

レーティング測定

対局数=5000 同時対局数=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-05-25.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

対局数5000 先手勝ち2352(54.9%) 後手勝ち1932(45.1%) 引き分け716

engine1

勝ち2029(47.4% R-15.7 +-9.6) 先手勝ち1113(26.0%) 後手勝ち916(21.4%)

宣言勝ち55 先手宣言勝ち30 後手宣言勝ち25 先手引き分け370 後手引き分け346

engine2

勝ち2255(52.6%) 先手勝ち1239(28.9%) 後手勝ち1016(23.7%)

宣言勝ち69 先手宣言勝ち35 後手宣言勝ち34 先手引き分け346 後手引き分け370

2029,716,2255

学習ロスと検証ロスは、 mate の値をそのままにしなかった場合と比べて高かった。

自己対局では、 mate の値をそのままにしなかった場合と比べてレーティングが R15.7 低く、有意な差があった。

考察

ロスが高かった理由は、 mate の値によりクロスエントロピーの値が高くなったためだと思う。

レーティングが有意に低かった理由は分からなかった。知識蒸留を用いない場合、 mate の値を含む学習データを入れたほうがレーティングが高くなったと記憶している。ただし、そちらは詰みの局面を学習データに含む・含まないの違いもあるため、一概に比較することはできない。

まとめ

知識蒸留を行った。複数の教師モデルをアンサンブルした。アンサンブルには DL 水匠、 AobaZero 20240329_153000_model_resnet30x384_relu_027 を使用した。 学習データの mate の値はそのまま使用した。

自己対局では、 mate の値をそのままにしなかった場合と比べてレーティングが R15.7 低く、有意な差があった。

レーティングが有意に低かった理由は分からなかった。知識蒸留を用いない場合、 mate の値を含む学習データを入れたほうがレーティングが高くなったと記憶している。ただし、そちらは詰みの局面を学習データに含む・含まないの違いもあるため、一概に比較することはできない。

次回は学習データから重複した局面を取り除き、学習させ、レーティングを測定したい。