# 知識蒸留

知識蒸留(knowledge distillation)は、強い教師モデルが持つ知識を、より軽量な生徒モデルへ移す学習手法である。  
将棋AIでは、特に [NNUE](/shogi/shogiwiki/evaluation-function/nnue/) 評価関数の精度向上を目的として、深層学習系の評価関数の出力を NNUE に模倣させる形で応用されている。

近年のコンピュータ将棋では、従来の自己対局データだけを使った NNUE 学習ではレーティング向上が頭打ちになってきたと報告されている。  
そのため、より高精度な DL 系評価関数の知識を NNUE に移すことで、推論速度を保ちながら棋力を向上させる方法として知識蒸留が注目されている。

## 背景

NNUE 評価関数の学習では、長らく NNUE 系将棋ソフト同士の自己対局から生成した教師データを使う方法が主流だった。  
しかし 2024 年頃から、その方法だけではレーティング向上が難しくなり、深層学習系評価関数との精度差も課題として残るようになった。

そこで、DL 系将棋ソフトの評価を NNUE に模倣させることで、評価関数の精度を高める方向が試みられた。  
このとき理論的な枠組みとして使われるのが知識蒸留である。

やねうらおは 2024 年末の記事で、`NNUE で生成した教師の探索評価値を DL 水匠の value で上書きした教師から学習させたところ、+R100 ほど強くなった` と紹介しており、将棋AIの教師生成の考え方が変わる可能性を指摘している。  
この記述は、会誌原稿で述べられている `DL 系評価関数を教師にして NNUE を強化する` という流れと整合している。

## 知識蒸留とは何か

現代の深層学習では、多数のパラメーターを持つ大型モデルや、複数モデルのアンサンブルは高い予測精度を示しやすい。  
一方で、実運用では推論速度やメモリ使用量の制約から、より軽量で高速なモデルが求められることが多い。

知識蒸留では、推論精度が高い大型モデルやアンサンブルモデルを教師モデル(teacher)とし、その出力や内部表現を小型モデル(student)へ移す。  
これにより、生徒モデルは軽量なまま教師モデルに近い性能を獲得できる。

Hinton らの古典的な論文では、アンサンブルの予測分布を単一モデルへ移すことで、高速で扱いやすいモデルに圧縮できることが示された。  
将棋AIでの応用は、この考え方を `DL 系評価関数 -> NNUE` へ持ち込んだものとみなせる。

## 知識の種類

知識蒸留で教師から生徒へ移す情報は、大きく次の 3 つに分けられる。

### Response-Based Knowledge Distillation

教師モデルの最終出力を生徒に模倣させる方式である。  
確率分布や勝率、評価値などを学習信号として使う。  
将棋 AI で実際に使われているのは主にこの方式であり、DL 系評価関数の勝率や value を NNUE へ写す方法はここに属する。

### Feature-Based Knowledge Distillation

教師モデルの中間層表現を生徒に模倣させる方式である。  
最終出力だけでなく、内部表現そのものを伝える点に特徴がある。

### Relation-Based Knowledge Distillation

サンプル間の距離や角度など、教師モデルが作る関係構造を生徒に模倣させる方式である。  
単一サンプルごとの出力一致ではなく、データ間の構造保存を重視する。

## 蒸留の訓練スキーム

知識蒸留の学習方法は、大きく次の 3 つに分類される。

### Offline Distillation

教師モデルを先に学習・固定しておき、その出力や中間表現を用いて生徒モデルを学習する。  
実装が簡単で安定しやすく、現在の将棋 AI で使われている方法も主にこれである。

### Online Distillation

教師モデルと生徒モデル、あるいは複数の生徒モデルを同時に学習させる方式である。  
固定教師を必要とせず、相互学習の形を取れる。

### Self-Distillation

外部の教師を用いず、同一モデルの過去スナップショットや別層を教師として使う方式である。  
自己模倣による正則化効果や汎化性能向上が期待される。

## コンピュータ将棋への応用

将棋 AI で実際に試されたのは、DL 系評価関数の勝率出力を [NNUE](/shogi/shogiwiki/evaluation-function/nnue/) に模倣させる、Response-Based Knowledge による Offline Distillation である。

基本的な流れは次のようになる。

1. NNUE 系将棋ソフトの自己対局から教師データを生成する
2. 各局面を DL 系評価関数で推論し、勝率を得る
3. 勝率を評価値へ変換する
4. 元の教師データ中の評価値を、その変換後の値で置き換える
5. その改変データを用いて、新しい NNUE 評価関数を学習する

この方法では、局面・勝敗・指し手などの情報は従来の教師データを流用しつつ、評価値だけを強い教師モデルの出力で差し替える。

言い換えると、`探索で得た評価値` をそのまま教師にするのではなく、より表現力の高い DL 系評価関数の出力で教師信号を作り直す、という発想である。

## DL 水匠を教師にした蒸留

2024 年末には、DL 系将棋ソフトの評価関数を教師として使う蒸留が試された。  
具体的には、`DL 水匠(dlsuisho-15b-20220426)` が出力する勝率を用い、それを NNUE 評価関数に模倣させる方式である。

勝率から評価値への変換には、シグモイド関数を使った次の形が用いられている。

```text
勝率 = δ(評価値 / 600)
```

ここで `δ` はシグモイド関数である。

この方式による実験では、蒸留を適用した NNUE 評価関数が、蒸留なしで学習したモデルに比べてレーティングで約 `R104.3` 向上したと報告されている。  
これは、DL 系評価関数の知識を高速な NNUE へ移し替える方法として、非常に実用的であることを示している。

また、nodchip の公開実験記事では、その後も `lambda`、`FV_SCALE`、`in_scaling` / `out_scaling`、入玉ボーナスの扱いなど、蒸留後の学習条件を変えた比較が継続されている。  
このことから、知識蒸留は単発の技巧ではなく、学習パイプライン全体の調整対象として扱われていることが分かる。

## 教師モデルのアンサンブル

さらに、単一の DL 水匠だけでなく、`AobaZero WCSC34 版` を加えたアンサンブル教師による蒸留も試されている。  
この場合は、複数の DL 系評価関数が出力した勝率をそれぞれ評価値へ変換し、その平均値で教師データの評価値を置き換える。

手順としては単一教師版とほぼ同じであり、違いは複数教師から得た評価値を平均化する点だけである。

このアンサンブル蒸留では、DL 水匠単独を教師にした場合に比べて、さらに約 `R23.7` のレーティング向上が得られたと報告されている。  
この結果は、複数の高性能教師モデルから知識を融合することで、NNUE の精度をさらに高められることを示している。

一方で、公開実験では `AobaZero 単独` や `ふかうら王単独` を教師にした場合に必ずしも良い結果が出ていない例もあり、`教師モデルが強いこと` と `生徒モデルへ学習しやすいこと` は同義ではないことが示唆されている。  
将棋AIにおける知識蒸留では、教師の質だけでなく、教師信号の滑らかさやスケール、生徒側の表現力との相性も重要である。

## 実装例

概念的には、教師の勝率出力を評価値へ変換して教師データを書き換える処理は、次のような形で書ける。

```python
import math

def winrate_to_eval(winrate: float) -> float:
    winrate = min(max(winrate, 1e-6), 1.0 - 1e-6)
    return 600.0 * math.log(winrate / (1.0 - winrate))

for sample in teacher_data:
    winrate = teacher_model.predict(sample["position"])
    sample["eval"] = winrate_to_eval(winrate)
```

実際の学習系はこれより複雑だが、考え方としては「強い教師モデルの出力へ評価値を差し替えて、そのデータで NNUE を学習する」と理解するとよい。

## 意義

知識蒸留は、巨大で高精度な DL 系評価関数の知識を、軽量で高速な NNUE 評価関数へ移す方法として重要である。  
将棋 AI では、CPU 上で高速に動く NNUE を保ちつつ、DL 系評価関数の強みを取り込む現実的な手段になっている。

今後は、

- 教師信号の改善
- 特徴量設計の最適化
- 損失関数の工夫
- Online Distillation や Self-Distillation の導入

などによって、さらに発展していく可能性が高い。

特に将棋AIでは、`どの教師モデルを使うか`、`勝率をどの評価値スケールへ写すか`、`元の教師データとどの割合で混ぜるか` といった実装上の選択が棋力へ直結しやすい。  
そのため、知識蒸留は単なる一般論としてではなく、学習データ生成・評価値設計・NNUE 学習の交点にある実戦的な技術として理解するのがよい。

## 関連項目

- [評価関数](/shogi/shogiwiki/evaluation-function/)
- [NNUE](/shogi/shogiwiki/evaluation-function/nnue/)
- [nnue-pytorch](/shogi/shogiwiki/evaluation-function/nnue-pytorch/)
- [ニューラルネットワーク](/shogi/shogiwiki/evaluation-function/neural-networks/)
- [elmo式学習](/shogi/shogiwiki/evaluation-function/elmo-style-learning/)

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

- コンピュータ将棋協会会誌 Vol.37: NNUE評価関数の紹介 その3
- [Distilling the Knowledge in a Neural Network](https://research.google/pubs/distilling-the-knowledge-in-a-neural-network/)
- [Categories of Response-Based, Feature-Based, and Relation-Based Knowledge Distillation](https://arxiv.org/abs/2306.10687)
- [official-stockfish/nnue-pytorch](https://github.com/official-stockfish/nnue-pytorch)
- [tanuki- 2024-12-25 学習データの評価値を DL 水匠で付けなおす](https://nodchip.hatenablog.com/entry/2024/12/25/000000)
- [tanuki- 2025-05-01 知識蒸留 DL 水匠 + AobaZero](https://nodchip.hatenablog.com/entry/2025/05/01/000000)
- [将棋AIの強化学習の基礎が根底から変わりそうな件](https://yaneuraou.yaneu.com/2024/12/30/shogi-ai-may-transform-fundamentally/)