# Training an nnue

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

## 概要

NNUE の学習では、典型的に

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

という流れを取る。

## 教師データ

教師値としては、

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

などが使われる。

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

## 学習パイプライン

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

```python
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` は「どう作るか」を説明する記事になる。

## 注意点

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

## 関連項目

- [NNUE](/shogi/shogiwiki/search/nnue/)
- [ニューラルネットワーク](/shogi/shogiwiki/search/neural-networks/)
- [評価関数](/shogi/shogiwiki/search/evaluation-function/)

## 参考にしたホームページ

- [Chessprogramming Wiki: Training AN NNUE](https://www.chessprogramming.org/Training_an_nnue)
- [GitHub: official-stockfish/nnue-pytorch](https://github.com/official-stockfish/nnue-pytorch)
- [やねうら王公式サイト: NNUE Based Training DATA Generation](https://yaneuraou.yaneu.com/2025/12/01/nnue-based-training-data-generation/)