Training an nnue

Training an nnue は、NNUE型の評価関数を学習する工程である。 ネットワーク構造だけでなく、教師データ、出力スケール、量子化、探索器との整合が強さに大きく影響する。

概要

NNUE の学習では、典型的に

  1. 大量の局面データを集める
  2. 各局面に教師値を付ける
  3. ネットワークを最適化する
  4. 学習済み重みを評価器形式へ変換する
  5. 実戦対局で検証する

という流れを取る。

教師データ

教師値としては、

  • 強い探索器の評価値
  • 実際の対局結果
  • その混合

などが使われる。

将棋AIでは、教師データをどの探索器から作るかで学習結果の性質がかなり変わる。 やねうら王公式サイトでも、NNUE 系教師データの性質やノイズについて議論されている。

学習パイプライン

概念的には次のようになる。

for batch in loader:
    inputs, targets = batch
    preds = model(inputs)
    loss = criterion(preds, targets)
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

実際には、

  • halfkp などの入力形式
  • 量子化前提の出力スケール
  • checkpoint 管理
  • 学習途中の self-play / match 検証

などが加わる。

変換と量子化

NNUE は最終的にエンジン内で高速に使える形へ変換される必要がある。 そのため、

  • 学習時の浮動小数
  • 実行時の整数演算

の橋渡しとして量子化が重要になる。

この部分が崩れると、 学習時には良いのに実機で弱い、ということが起こりうる。

将棋AIでの位置づけ

将棋AIでは NNUE が強力だが、 強い学習済みネットワークを作るには

  • 良い局面データ
  • 良い教師値
  • 実行エンジンとの整合

が必要である。

つまり、NNUE 記事が「何か」を説明するのに対し、 Training an nnue は「どう作るか」を説明する記事になる。

注意点

  • 教師データの偏りがそのままネットに出やすい
  • 評価値のスケール設計を誤ると探索器と噛み合わない
  • 学習損失が改善しても、実戦強度が上がるとは限らない

関連項目

参考にしたホームページ