# ニューラルネットワーク

ニューラルネットワークは、多数の重み付きユニットを層状に接続し、局面特徴から評価値や方策を学習するモデルである。
将棋AIでは、近年は特に[NNUE](/shogi/shogiwiki/search/nnue/)や深層学習系の評価器・方策器として重要である。

## 概要

古典的な[評価関数](/shogi/shogiwiki/search/evaluation-function/)は、
人手で選んだ特徴量を重み付き和で足し合わせることが多かった。
これに対してニューラルネットワークでは、

- 入力特徴
- 中間表現
- 出力

を学習でまとめて最適化する。

将棋AIでは大きく分けて、

- alpha-beta 探索と組み合わせる評価器
- policy / value network を中核に置く探索器

の二方向で使われてきた。

## 基本形

もっとも単純な全結合ネットワークでは、

- 入力層
- 隠れ層
- 出力層

の各層で線形変換と活性化関数を繰り返す。

```cpp
for (int j = 0; j < hiddenSize; ++j) {
    hidden[j] = bias1[j];
    for (int i = 0; i < inputSize; ++i) {
        hidden[j] += input[i] * w1[i][j];
    }
    hidden[j] = relu(hidden[j]);
}
```

これは概念説明用の最小例で、実際には SIMD、量子化、バッチ処理などの最適化が入る。

## 将棋AIでの使われ方

将棋AIでは、

- Bonanza 系の特徴量学習
- [NNUE](/shogi/shogiwiki/search/nnue/)
- policy / value network を使う深層学習型

といった流れがある。

特に NNUE は、
「CPU 上で大量のノード評価を行う必要がある alpha-beta 探索」
に適した形へ落とし込まれている点が重要である。

## 手作り評価との違い

- 手作り評価
  特徴量と重みの意味が比較的分かりやすい
- ニューラルネットワーク
  表現力が高いが、内部表現は解釈しにくい

将棋AIでは両者が完全に置き換わるというより、
時代ごとに重点が移ってきたと見るのが自然である。

## NNUE との関係

[NNUE](/shogi/shogiwiki/search/nnue/)は、ニューラルネットワークの中でも
「差分更新可能で CPU 向け」という実装上の制約に強く最適化された形である。
そのため、ニューラルネットワーク一般の記事では、
NNUE を特殊で実用的な派生形として捉えると分かりやすい。

## 注意点

- 学習データと損失関数に強く依存する
- 推論コストが高いと探索ノード数が大きく落ちる
- alpha-beta 系探索と組み合わせるなら、推論の軽さが特に重要になる

## 関連項目

- [評価関数](/shogi/shogiwiki/search/evaluation-function/)
- [NNUE](/shogi/shogiwiki/search/nnue/)
- [Training an nnue](/shogi/shogiwiki/search/training-an-nnue/)
- [Minimax Tree Optimization](/shogi/shogiwiki/search/minimax-tree-optimization/)

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

- [Chessprogramming Wiki: Neural Networks](https://www.chessprogramming.org/Neural_Networks)
- [Chessprogramming Wiki: NNUE](https://www.chessprogramming.org/NNUE)
- [やねうら王公式サイト: MAKE Evaluate Function](https://yaneuraou.yaneu.com/2020/11/17/make-evaluate-function/)