Neural Tangent Kernel (NTK)
ニューラル接線カーネル(NTK)は、ネットワークの予測がパラメーターの変化にどのように応答するかを測定し、ニューラルネットワークの学習とカーネル法を結び付けます。
ニューラル接線カーネル(NTK)は、2つの入力に対するニューラルネットワークの出力が、モデルパラメーターに同じ小さな変化を加えたときにどのように応答するかを測定する類似度関数です。パラメーターに関する勾配が揃っている場合、入力間の予測は強く連動します。これにより、例同士のペアワイズ類似度を通じて学習するカーネル法と、ニューラルネットワークの学習が結び付けられます。
Arthur Jacot、Franck Gabriel、Clément Honglerは、2018年にNeural Tangent Kernel: Convergence and Generalization in Neural Networksでこの用語を導入し、学習中に予測がどのように変化するかを分析するための数学的枠組みを確立しました。
ニューラル接線カーネルの仕組み#
スカラー出力のニューラルネットワークについて、すべての学習可能なパラメーターに対する出力の微分を計算します。これらの微分は、モデルの重みに対する予測の感度を表す勾配ベクトルを形成します。2つの入力間のNTKは、それぞれの勾配ベクトルの内積です。
データセット全体では、これらのペアワイズ値がカーネル行列を形成し、グラム行列とも呼ばれます。対角成分は各予測のパラメーター変化に対する感度を測定し、非対角成分は異なる例同士の連動性を表します。複数の出力がある場合、各入力ペアは出力座標間の相互作用を含むブロックを生成します。これは経験的NTKの計算で使用されます。
勾配降下法では、カーネルによって、ある例の予測誤差を小さくしたときに、他の例の予測がどのように変化するかが決まります。対象となる勾配はネットワーク出力の微分であり、誤差逆伝播法が微分計算の仕組みを提供します。その後、損失関数によって、誤差を修正する更新の方向と強さが決まります。
無限幅、収束、汎化#
ネットワークの幅とは、隠れユニットの数、または畳み込み層のチャネル数です。NTKパラメーター化と適切な初期化・学習の仮定の下では、隠れ層の幅を無限大に近づけると、学習中に一定に保たれる決定論的な極限カーネルが得られます。有限ネットワークの経験的NTKは実際のパラメーターで評価され、学習の進行に伴って変化する可能性があります。
カーネルが一定の領域では、学習は初期化点まわりのネットワークの一次近似に従います。これは線形化ネットワークであり、入力に対する非線形な依存性を保ちながら、パラメーターの変化に対して予測が線形に変化します。関連用語の怠惰学習は、接線特徴量がほとんど変化しない領域を指します。特徴学習では、最適化中にこれらの特徴量が大きく変化します。
カーネルが一定の勾配フロー、つまり小さな勾配ステップの連続時間極限において、二乗誤差損失を用いると、固有値の大きいカーネル固有ベクトルに沿って誤差が最も速く減少します。固有ベクトルは例全体にわたるパターンを特定し、固有値はそれらの学習速度を決定します。これにより、早期終了が正則化として機能する理由が説明できます。早期終了は、ノイズや過学習に関連する成分など、学習の遅い成分への適合を抑えます。未見の入力に対する予測は、学習データとのカーネル類似度に依存します。
応用分野と関連概念#
NTK法は、カーネル回帰や画像分類の分析に利用できます。畳み込みNTK(CNTK)は、この構成を畳み込みニューラルネットワークに拡張したものです。Sanjeev AroraらはCIFAR-10の分類に正確なCNTK計算を用い、有限の畳み込みネットワークを学習する方法に対するカーネルベースの対応手法を示しました。
ニューラルネットワークガウス過程(NNGP)カーネルは、無限幅の極限において、ランダムに初期化されたネットワーク出力間の共分散を表します。NTKは勾配によって駆動される学習ダイナミクスを表します。同様に、線形プロービングでは固定された表現に対して線形分類器を学習します。一方、NTKの線形化では、選択した学習可能なパラメーターに対する微分を特徴量として使用します。
したがって、パラメーターの選択によって、学習を支配する接線カーネルが変わります。Ultralytics YOLO26のファインチューニングでは、freeze引数によって選択したレイヤーを固定するため、それらのパラメーターは有効な学習カーネルの更新方向に寄与しません。
経験的NTKの計算#
このPyTorchの例では、scikit-learnにバンドルされているdigitsデータセットから、手書き数字画像2枚のカーネルを計算します。pip install torch scikit-learnで依存関係をインストールします。
import torch
from sklearn.datasets import load_digits
from torch import nn
torch.manual_seed(0)
digits = load_digits()
inputs = torch.tensor(digits.data[:2], dtype=torch.float32) / 16
model = nn.Sequential(nn.Linear(64, 8), nn.Tanh(), nn.Linear(8, 1))
parameters = tuple(model.parameters())
outputs = model(inputs)
# 各ヤコビアンの行には、1つの出力に関するパラメーター微分が含まれます。
rows = []
for output in outputs[:, 0]:
gradients = torch.autograd.grad(output, parameters, retain_graph=True)
rows.append(torch.cat([gradient.flatten() for gradient in gradients]))
jacobian = torch.stack(rows)
kernel = jacobian @ jacobian.T
print(kernel)出力される2 x 2行列には、2つの自己感度と、例同士の相互作用が含まれます。jacobian @ jacobian.Tとして構成することで、スカラー出力の経験的NTKは対称かつ半正定値になり、そのランクは例の数と学習可能なパラメーターの数の両方によって上限が定まります。










