ニューラルネットワークといえば、長らく MLP(多層パーセプトロン) が基本部品でした。入力に重みを掛けて足し、固定の活性化関数(ReLUなど)に通す——この繰り返しです。これに対し「重みを数ではなく関数にしたら?」という大胆な発想で提案されたのが Kolmogorov–Arnold Networks (KAN) です(Liu et al., ICLR 2025)。
KANを調べると、しばしば「フーリエ級数」や「B-spline」が出てきて戸惑います。「なぜニューラルネットの中にフーリエ級数が入るの?」——本記事はこの疑問にきちんと答えます。結論を先に言うと、KANの『重み』は1変数関数で、その1変数関数を“フーリエ級数の係数”として表現するからです。順を追って見ていきましょう。
本記事の内容
- MLP と KAN の違い(重みがスカラーか、関数か)
- 背景にある Kolmogorov–Arnold 表現定理
- なぜフーリエ級数が入るのか(1変数関数を基底の係数で学ぶ)
- B-spline と フーリエ、2つの基底の違い
- PyTorchで「1本のKANエッジ」を学習する
前提・関連記事

MLP と KAN の違い
まずMLPを思い出します。MLPは、辺(エッジ)に学習可能な重み(スカラー) を持ち、点(ノード)に固定の活性化関数を置きます。各層は「線形変換 → 固定の非線形関数」という形です。
$$ \begin{equation} \mathrm{MLP}(x) = (W_3 \circ \sigma_2 \circ W_2 \circ \sigma_1 \circ W_1)(x) \end{equation} $$
ここで $W_i$ は学習する重み行列(中身は数)、$\sigma_i$ は固定の活性化関数です。学習で動くのは「数(線形の重み)」だけで、非線形性 $\sigma$ は人間が決め打ちした固定の形です。
KANはこれを裏返します。辺に「学習可能な1変数関数」 を置き、点では単に足し算するだけです。
$$ \begin{equation} \mathrm{KAN}(x) = (\Phi_3 \circ \Phi_2 \circ \Phi_1)(x) \end{equation} $$
$\Phi_i$ は「1変数関数の集まり」で、非線形な部分そのものを学習します。線形の重み行列は一切ありません。

図のとおり、MLPの辺は1本につき「1つの数」ですが、KANの辺は1本につき「1つの曲線(関数)」です。論文の比較図がこの対比を端的に示しています。

出典: Z. Liu et al. “KAN: Kolmogorov–Arnold Networks”, ICLR 2025 (arXiv:2404.19756), Fig.0.1.
MLP(左)は「線形・学習可能」な重みと「非線形・固定」の活性化。KAN(右)は「非線形・学習可能」な関数を辺に置き、ノードは和だけ。なぜこんな形が正当化されるのか——その根拠が、名前の由来でもある定理です。
Kolmogorov–Arnold 表現定理
KANの理論的な土台は、1957年の Kolmogorov–Arnold 表現定理です。これは「どんな多変数の連続関数も、1変数関数の足し算だけで書ける」という驚くべき主張です。
$$ \begin{equation} f(x_1, \dots, x_n) = \sum_{q=1}^{2n+1} \Phi_q\!\left( \sum_{p=1}^{n} \phi_{q,p}(x_p) \right) \end{equation} $$

ここで $\phi_{q,p}$ と $\Phi_q$ はすべて1変数関数です。つまり、本質的に必要な多変数演算は「足し算」だけで、残りはすべて1変数関数で表せる、ということです。
これは機械学習にとって朗報に見えます——高次元の関数を学ぶ問題が、有限個の1変数関数を学ぶ問題に分解できるのですから。ただし定理が保証する1変数関数は、非常にギザギザで(フラクタル的で)実際には学習しにくい場合があります。そこでKANは、定理をそのまま使うのでなく、1変数関数を「滑らかで学習しやすい形」に表現し直し、層を深く広く積めるよう一般化しました。
拠り所が違う:普遍近似定理 vs 表現定理
MLPとKANは、「なぜ任意の関数を表せるのか」の拠り所が異なります。MLPの根拠は 普遍近似定理で、「隠れ層を十分広くすれば、$\sum_i a_i\,\sigma(w_i\cdot x + b_i)$ の形でどんな連続関数も近似できる」と言います。固定の活性化 $\sigma$ をたくさん並べることで表現力を得る、という発想です。
一方KANの根拠は Kolmogorov–Arnold表現定理で、「1変数関数そのものを賢く選べば、その和で多変数関数を厳密に書ける」と言います。MLPが「固定の部品を数で大量に組む」のに対し、KANは「部品(非線形性)自体を学習する」。だから、うまくいけば少ない部品(パラメータ)で済むのです。
ここで核心の問いに来ます。「1変数関数を学習可能な形で表す」とは、具体的にどうするのでしょうか。
なぜニューラルネットにフーリエ級数が入るのか
ここが本記事の山場です。MLPの重みは「1つの数」なので、勾配降下でそのまま学習できます。でもKANの重みは「関数」です。関数は無限の自由度を持つので、「関数そのもの」を直接勾配降下で動かすことはできません。
そこで使うのが 基底展開 という考え方です。1変数関数 $\phi(x)$ を、あらかじめ決めた固定の基底関数の重み付き和として表します。
$$ \begin{equation} \phi(x) = a_0 + \sum_{k=1}^{N} \big( a_k \cos(kx) + b_k \sin(kx) \big) \end{equation} $$
この右辺が、まさに フーリエ級数 です。フーリエの定理により、たいていの1変数関数は sin と cos の和で(任意の精度で)表せます。すると——
「1変数関数 $\phi$ を学ぶ」=「フーリエ係数 $a_k, b_k$ を学ぶ」
になります。係数は有限個の数なので、ふつうに勾配降下で学習できます。ニューラルネットに「フーリエが入る」のは何も神秘的なことではなく、関数という無限自由度の対象を、基底の有限個の係数(=学習パラメータ)に変換するための道具として使っているだけなのです。

左の図は、ある目標の1変数関数を、フーリエ項を1→3→8と増やしながら近似したものです。項数(係数の数)を増やすほど、目標の形に近づきます。右は基底関数 $\sin(kx)$ そのもの。固定の波(基底)を、係数で足し合わせて任意の形を作る——これが「関数を学ぶ」の正体です。
コードで見ると一行です。フーリエ基底を並べ、係数を最小二乗で求めれば(学習すれば)、目標の関数が再現できます。
import numpy as np
T = 200; x = np.linspace(0, 2*np.pi, T)
g = np.sign(np.sin(x))*0.8 + 0.3*np.sin(3*x) # 学びたい1変数関数
def fit_fourier(g, x, N):
cols = [np.ones_like(x)] # 固定の基底 [1, sin kx, cos kx]
for k in range(1, N+1):
cols += [np.sin(k*x), np.cos(k*x)]
B = np.stack(cols, 1)
coef, *_ = np.linalg.lstsq(B, g, rcond=None) # ← 学ぶのは係数だけ
return B @ coef, coef
approx, coef = fit_fourier(g, x, N=8)
print("学習パラメータ(係数)の数:", len(coef)) # 17 = 1 + 2*8
学んでいるのは17個の係数だけ。これがKANの「辺の重み」の中身です(フーリエ基底を使う場合)。
B-spline と フーリエ、2つの基底
「1変数関数 = 基底の係数」と分かれば、次の疑問は「どの基底を使うか」です。KANの原論文は B-spline(区分多項式)を使い、KAN-ADのように フーリエ級数を使う派生もあります。両者の性格は対照的です。

- B-spline:各基底が局所的な山で、特定の区間だけに効きます。細かい形を柔軟に表せる反面、局所のノイズにも食いつきやすい。グリッド(節点)の設計が必要です。
- フーリエ:各基底が大域的な波で、全域に広がります。滑らかで周期的なパターンに強く、局所ノイズに頑健。グリッド設計が要りません。
どちらが良いかは対象次第です。たとえば時系列の異常検知に使うKAN-ADは、「正常は滑らか・異常は局所的」という性質を活かすため、あえて大域的なフーリエ基底を選んでいます。
PyTorchで「1本のKANエッジ」を学習する
最後に、KANの最小単位——1本の辺(学習可能な1変数関数)——を実際に学習させてみます。辺の関数をフーリエ係数でパラメータ化し、目標の形に勾配降下で合わせます。
import torch, numpy as np
x = torch.linspace(-np.pi, np.pi, 200)
target = torch.tanh(2*x) + 0.3*torch.sin(4*x) # この活性化を学ばせたい
N = 6
a = torch.zeros(N+1, requires_grad=True) # cos係数 + 定数
b = torch.zeros(N, requires_grad=True) # sin係数
def phi(x): # 学習可能な1変数関数(フーリエ表現)
out = a[0]*torch.ones_like(x)
for k in range(1, N+1):
out = out + a[k]*torch.cos(k*x) + b[k-1]*torch.sin(k*x)
return out
opt = torch.optim.Adam([a, b], lr=0.05)
for _ in range(400):
loss = ((phi(x) - target)**2).mean()
opt.zero_grad(); loss.backward(); opt.step()
print("最終MSE:", round(float(((phi(x)-target)**2).mean()), 4)) # ≈ 0.036
print("パラメータ数:", a.numel() + b.numel()) # 13 = (6+1)+6

学習前(係数ゼロ=平坦)から、わずか13個のフーリエ係数を勾配降下で動かすだけで、目標の活性化の形(MSE≈0.036)にぴたりと合いました。これがKANの辺1本がやっていることです。MLPの辺が「1つの数」だったのに対し、KANの辺は「数個の係数で表された1つの関数」を学んでいる——この違いがKANの表現力と解釈性の源です。
KANの特徴
最後にKANの性格を簡単にまとめます。
- 解釈性:辺の関数を直接プロットして「何を学んだか」を目で見られる。記号回帰(数式の再発見)にも使える。
- パラメータ効率:1変数関数を少数の係数で表すため、小さなKANが大きなMLPに匹敵することがある(とくに低次元の科学的関数)。
- 得意・不得意:低次元の関数近似・科学計算で強み。大規模・高次元(画像・言語)ではMLPほど確立しておらず、研究途上です。
まとめ
Kolmogorov–Arnold Networks (KAN) を基礎から見てきました。
- KANとは:辺の重みをスカラーから「学習可能な1変数関数」に置き換えたネットワーク。ノードは和だけ
- 根拠:Kolmogorov–Arnold表現定理(多変数関数=1変数関数の和)
- なぜフーリエ?:1変数関数を学ぶには、固定の基底の係数として表す必要がある。フーリエ級数(sin/cosの和)はその代表的な選択で、「関数を学ぶ=係数を学ぶ」に変換する道具
- 基底の選択:B-spline(局所・細かい)か フーリエ(大域・滑らか)か
「重みを数から関数へ」という一手が、表現力・解釈性・効率の新しいトレードオフを開きました。フーリエ級数は、その『関数の重み』を学習可能にするための、ごく自然な部品なのです。

参考文献
- Z. Liu, Y. Wang, S. Vaidya, F. Ruehle, J. Halverson, M. Soljačić, T. Y. Hou, M. Tegmark. “KAN: Kolmogorov–Arnold Networks.” ICLR 2025 (arXiv:2404.19756).
- J. Zhou et al. “KAN-AD: Time Series Anomaly Detection with Kolmogorov–Arnold Networks.” ICML 2025 (arXiv:2411.00278).