NNUE は、CPU 上で高速に使えることを強く意識して設計されたニューラルネットワーク型の評価関数である。 将棋AIの文脈で 2018 年に那須悠氏が導入し、その後 Stockfish 系にも広がって大きな影響を与えた。
NNUE は Efficiently Updatable Neural Network の略で、
「一手進めるたびにネットワーク全体を最初から計算し直すのではなく、
差分だけを効率よく更新する」ことを重視した構造を持つ。
一般的な深いニューラルネットワークより軽く、 アルファベータ法中心の探索と組み合わせて CPU で大量に評価できるのが特徴である。
Chessprogramming Wiki でも、NNUE は
とのつながりの中で説明されている。
将棋AIでは、手作り評価から学習評価への大きな橋渡しとして非常に重要である。
NNUE の要点は次の通りである。
accumulator として保持するこれにより、毎ノードでフル推論するよりはるかに高速になる。
NNUE の中心にあるのが accumulator である。
これは「現在局面に対応する中間層の値」を保持する配列で、
局面変化に応じて差分更新する。
静かな手なら、変化する特徴は少ないため、
だけで済むことが多い。
差分更新の最小イメージは次のようになる。
void updateAccumulator(Accumulator& acc,
const std::vector<int>& removedFeatures,
const std::vector<int>& addedFeatures) {
for (int idx : removedFeatures) {
for (int i = 0; i < HIDDEN; ++i) {
acc.value[i] -= weight[idx][i];
}
}
for (int idx : addedFeatures) {
for (int i = 0; i < HIDDEN; ++i) {
acc.value[i] += weight[idx][i];
}
}
}
これは概念説明用の単純化した例であり、実際には
などの最適化が入る。
NNUE は将棋側で成果を出したあと、 Stockfish 系へ移植されて一気に広まった。 Chessprogramming Wiki でも、Shogi 由来であることと Stockfish NNUE で普及したことの両方が強調されている。
NNUE の強さはアーキテクチャだけでなく、
にも強く依存する。
やねうら王側の記事でも、学習器やバージョン差で結果がかなり変わることが説明されている。
現在の将棋AIでは、
が並立している。
NNUE は後者の中心技術であり、 従来の探索器を活かしたまま学習評価を強くできる点で非常に実用的である。