# 论文解读(KAN Kolmogorov–Arnold Networks)


五一假期刚开始没两天的时候，刷到了一篇火遍国内外AI圈的论文，叫做 [KAN: Kolmogorov–Arnold Networks](https://arxiv.org/abs/2404.19756) ,  尤其国内某些科技媒体铺天盖地的宣传更是让我提起了兴趣，在假期结束之前，抽个空读一下看看是怎么个事。读了之后发现，仅仅只是高数、线代和概率论这些数学知识是看不懂的，最好还需要了解一点数分方面的知识，反正我是借助了ChatGPT才能勉强看完，这里我就从一个简单的科普角度来阅读这篇文章好了，建议感兴趣的同学还是完整的阅读下这篇文章，真的是个很有意思的思路。

## 基础

### 什么是 Kolmogorov-Arnold 定理？

这篇论文主要的理论依据在于 Kolmogorov-Arnold 定理， 中文叫做科尔莫戈洛夫-阿诺尔德表示定理。这个定理是由苏联数学家安德烈·科尔莫戈洛夫（Andrey Kolmogorov）首先提出，并由他的学生弗拉基米尔·阿诺尔德（Vladimir Arnold）在1957年进一步发展。定理最初的动机是探讨**多元函数可以如何被一组更简单的函数表示**，这是数学和理论计算机科学中的一个基本问题，而且实际上部分解答了数学家希尔伯特著名的23个问题中的第13个问题：**是否可以使用加，减，乘，除，以及最多两个变量的代数函数的组合来求解7次方程。** Kolmogorov-Arnold 定理是是在一个更广泛的连续函数的背景下，而非希尔伯特原先提出的代数方程的框架，因此只能算是部分解决。

具体来说， Kolmogorov-Arnold 定理指的是，对于任何定义在闭区间 $[0, 1]^n$ 上的连续函数 $f(x_1, ..., x_n)$，存在整数 $2n+1$ 以及一系列的一维连续函数 $\phi_{q,p}$ 和 $\Phi_q$，使得该多变量函数可以表示为： $$ f(x_1, ..., x_n) = \sum_{q=1}^{2n+1} \Phi_q \left(\sum_{p=1}^{n} \phi_{q,p}(x_p)\right) $$ 其中：
- $\phi_{q,p}$ 是将单个变量 $x_p$ 映射到实数的一维连续函数。
- $\Phi_q$ 是将实数和到实数的一维连续函数，它处理由 $\phi_{q,p}$ 映射后的和。 
- $2n+1$ 表示所需的最少函数数量，确保任意连续函数都能以这种形式表示。

平时很少接触数学的同学们直接看这个定理可能有点云里雾里，我们来看个简单的例子好了。假设我们有个多元函数: $f(x, y, z) = x^2 + 2y^3 + \sin z$ ，根据定理，我们可以找到一组一维函数 $\phi_{q,p}$ 和 $\Phi_q$，使得 $f(x, y, z)$ 可以被表示为这些函数的组合：

$$
f(x, y, z) = \sum_{q=1}^{7} \Phi_q \left(\sum_{p=1}^{3} \phi_{q,p}(x_p)\right)
$$

这里，$x_1 = x, x_2 = y, x_3 = z$，我们可以选择以下具体的函数形式：

- $\phi_{1,1}(x) = x^2$, $\phi_{1,2}(y) = 0$, $\phi_{1,3}(z) = 0$
- $\phi_{2,1}(x) = 0$, $\phi_{2,2}(y) = y^3$, $\phi_{2,3}(z) = 0$
- $\phi_{3,1}(x) = 0$, $\phi_{3,2}(y) = 0$, $\phi_{3,3}(z) = \sin z$
- 其余 $\phi_{q,p}$ 函数可以定义为 0，因为它们不会影响最终的和。

相应地，$\Phi_q$ 函数可以选择为：

- $\Phi_1(u) = u$, $\Phi_2(u) = 2u$, $\Phi_3(u) = u$
- 其余 $\Phi_q(u) = 0$，因为它们不会对最终的和产生贡献。

因此，$f(x, y, z)$ 可以表示为：

$$
\begin{align}
f(x, y, z)  &= x^2 + 2y^3 + \sin z   \\
&= \Phi_1(\phi_{1,1}(x)) + \Phi_2(\phi_{2,2}(y)) + \Phi_3(\phi_{3,3}(z))
\end{align}
$$
那么这个定理对于我们来说有什么作用呢？

其实它的关键点在于，它**说明了多维函数可以通过一系列的一维函数操作和简单的加法来构建**。这种结构**简化了多维函数的复杂性**，因为一维函数相对来说更易于处理和学习。从机器学习和神经网络的角度看，这提供了一种潜在的网络架构设计思路，即通过学习一系列的一维函数来近似复杂的多维函数。

### 回忆下 MLP

我们回过头看看 MLP 网络模型，也就是**多层感知机**。它是深度神经网络（DNN）的一种形式。MLP由多个层组成，每一层都包含多个神经元，这些神经元通过**激活函数**进行非线性变换。MLP包括三种主要的层：

1. **输入层**：负责接收样本数据。每个神经元代表输入数据的一个特征。
2. **隐藏层**：一个或多个隐藏层，每层包含多个神经元。隐藏层是MLP的核心，它们能够学习输入数据中的非线性特征和模式。每个隐藏层的输出都作为下一层的输入。
3. **输出层**：将神经网络的输出呈现给外界。输出层的设计取决于特定任务——例如，分类任务通常用具有softmax激活函数的输出层，而回归任务则可能使用一个没有激活函数或使用线性激活函数的单个节点。

我们都知道，在 Transformer 架构中，有着自注意力层和前馈层，其中每个自注意力层后面通常就会跟着一个 MLP 块， 这个 MLP 块也被称作前馈网络（Feed Forward Network, FFN）。MLP 的存在为模型提供了处理复杂任务所需的计算和表达能力。通过这种结构，Transformer 能够有效地处理各种序列化数据，并在多个领域，如自然语言处理、图像识别和时间序列分析中，展示出极佳的表现。

那么 MLP 是基于什么原理呢？答案是**通用近似定理（Universal Approximation Theorem）** ，也有种翻译叫做**万能近似定理**，可见这个定理也是非常强大的。

这个定理的提出也很早了，George Cybenko 于1989年对使用sigmoid激活函数的神经网络证明了这一定理。紧接着，Kurt Hornik在1991年扩展了这一结果，证明了使用任意非线性激活函数的神经网络也具有通用近似能力。

定理的主要内容是：

**对于任何在闭区间上定义的连续函数和任意的误差 $\epsilon>0$，都存在一个具有至少一个隐藏层的前馈神经网络，可以找到一组权重和偏置，使得该神经网络的输出函数在整个定义域内与目标函数的最大偏差小于 $\epsilon$。**

这个定理解释了为什么神经网络可以被应用于各种复杂的模式识别和非线性回归任务，但在实际应用中，如何设计网络结构、选择合适的激活函数和训练算法以达到所需的逼近精度仍然是重要的研究和工程问题。此外，定理并没有涉及网络训练的收敛速度或是所需的训练数据量，因此它也有着它的局限性。

![](https://leafw-blog-pic.oss-cn-hangzhou.aliyuncs.com/1714836027797.png)

上面这张图就是论文中对于 MLPs(Multi-Layer Perceptrons) 和 KANs(Kolmogorov-Arnold Networks) 的对比。与 MLPs 类似，KANs 实际上也具有全连接结构，区别在于，MLPs 在节点（神经元）上放置固定的激活函数，而 KANs 在边缘（权重）上放置的是可学习的激活函数。因此，Kolmogorov-Arnold 网络完全没有线性权重矩阵：**每个权重参数都由一种可学习的一维样条函数替代**。Kolmogorov-Arnold 网络的节点仅对输入信号进行求和，不进行任何非线性处理。而且 KANs 通常允许比 MLPs 更小的计算图，文中也用 PDE 求解作为示例进行了说明：1个2层宽度为10的 KAN 比 一个4层宽度为100的 MLP 精度高100倍且参数效率高100倍。

这篇论文的贡献不只是使用 Kolmogorov-Arnold 表示定理来构建神经网络，而是将原始的 Kolmogorov-Arnold **推广到任意宽度和深度**。KANs 的实质可以理解成样条和 MLPs 的组合，那么结合后可以得到他们各自的优势。

首先来看看**样条函数(Spline function)**，它是一种特别的数学函数，用于在数值分析、插值、和曲线拟合中实现平滑曲线的生成。没学过数分的可能都不太了解，我们也简单介绍下。

> 样条函数通常由一系列低阶多项式分段定义，这些多项式在分段的接合点（称为节点或结点）上连续并具有连续的导数。这些多项式的阶数（degree）决定了样条的光滑程度，常见的如线性样条（一阶）、二次样条（二阶）、和三次样条（三阶）。其中，三次样条是最常用的类型，因为它在提供足够平滑的曲线的同时，计算复杂度和拟合效果之间达到了良好的平衡。

样条函数因其数学性质和灵活性，**在低维空间中的数据插值和函数逼近中表现出色**。然而，当应用到高维空间时，样条函数面临一系列挑战，主要是由于“**维数灾难**”（curse of dimensionality, COD）引起的，简单地说，就是随着数据的维度增加，为了维持样条插值的准确性和平滑性，所需的数据量和计算复杂度会呈指数级增长。这是因为每增加一个维度，样条函数所需覆盖的数据空间和可能的交互作用也急剧增加。

那么对于 MLP，它能够通过特征学习来挖掘数据的复合结构，每一层的神经元可以从前一层学到的特征中进一步抽取信息，这种分层学习的方式使得MLP在高维数据中能够捕捉更深层次的、非线性的数据结构和关联，从而缓解维数增加带来的影响，从而使其在维数灾难中表现得更为鲁棒。

但MLP在低维数据上的表现不如样条函数精确，且在模拟某些特定函数（如指数和正弦函数）时可能效率低下，这主要有这么几个原因：

**1. 非线性激活函数的限制**
MLP通常使用非线性激活函数（如Sigmoid、Tanh或ReLU）来使网络具备学习复杂非线性关系的能力。然而，这些标准的非线性激活函数**可能并不直接适合精确模拟一些特定的数学函数**，如指数函数或三角函数。要通过这些基本的非线性函数来精确拟合指数或正弦曲线，可能需要大量的神经元和复杂的网络结构，这会导致学习过程中的效率问题。

**2. 优化和收敛问题**
MLP的训练涉及到复杂的权重调整和误差最小化过程，这通常通过反向传播和梯度下降方法实现。在低维空间和简单函数拟合的情况下，**网络的训练可能不够稳定或收敛速度慢**，特别是当目标函数具有周期性、快速变化或者极端值时。此外，过拟合在低维数据上也更容易发生，尤其是在网络结构过于复杂时。

**3. 维数灾难的反面影响**
虽然MLP设计初衷是为了解决高维数据问题，但这种设计在低维数据上可能造成资源浪费和效率低下。例如，一个为处理成百上千维度数据而设计的复杂MLP在仅有一两个输入特征的任务上可能**表现过剩且运算效率不高**。

那么结合样条函数和 MLP 的优势而得到的KANs，它能够学习数据的复合结构（外部自由度）和优化一元函数（内部自由度），这使它们能够精确地学习和优化特征，从而在复杂性能和精确度上超越单纯的MLP或样条函数。

KANs内部使用样条函数来建模数据，外部则利用类似MLP的结构来优化和调整这些样条函数学习到的特征，因此在性能上优于 MLPs。

![](https://leafw-blog-pic.oss-cn-hangzhou.aliyuncs.com/1714896897940.png)

## KAN 架构

在 KAN 中，每个连接不再是简单的权重，而是一个可学习的一维函数。这些函数通常通过样条或其他平滑函数进行参数化，使得网络可以学习在每个维度上最适合数据的非线性变换。每个输入变量 $x_i$​ 通过一组独立的一维函数 $\phi_{q,p}​(x_i​)$ 处理，其中 p 表示输入变量的索引，q 表示输出维度的索引。

组合函数 $\Phi_q$ 在网络高层使用，它们将一维函数的输出进行组合和加工。这些函数也可以通过一维样条或其他形式进行参数化，使得输出不仅仅是简单的线性组合，而是能够捕捉输入间复杂的交互效应。 

### 架构描述

为了更清晰的理解 KANs， 我们可以看下这张图，左边展示了网络的层次结构和数据流动，右边则详细描述了一个关键的组件——B-样条激活函数，并展示了如何通过“**网格扩展技术**”在粗糙和细致网格之间切换。

![](https://leafw-blog-pic.oss-cn-hangzhou.aliyuncs.com/1714897866932.png)



左侧的图显示了 KAN 的分层架构。每层包括一组节点，每个节点都通过一组特定的函数处理输入数据，输出到下一层。每个节点上的小图标表示的是激活函数的形式，这里用B-样条函数作为激活函数。

右侧的图展示了一个激活函数 ϕ(x)，它被参数化为一个B-样条函数。图中还展示了如何通过改变B-样条的节点（也称为控制点）数量来调整函数的粒度。

这张图的核心在于展示KAN如何通过使用**B-样条**作为激活函数，结合网络的多层结构和激活函数的动态调整（网格扩展技术），来处理复杂的高维数据。这种设计使得网络不仅能适应不同的数据分辨率，还能通过调整激活函数的精度来优化性能。

> **B-样条**是[样条曲线](https://zh.wikipedia.org/wiki/%E6%A0%B7%E6%9D%A1%E6%9B%B2%E7%BA%BF "样条曲线")一种特殊的表示形式。它是B-样条基曲线的[线性组合](https://zh.wikipedia.org/wiki/%E7%BA%BF%E6%80%A7%E7%BB%84%E5%90%88 "线性组合")。B-样条是[贝兹曲线](https://zh.wikipedia.org/wiki/%E8%B2%9D%E8%8C%B2%E6%9B%B2%E7%B7%9A "贝兹曲线")的一种一般化，可以进一步推广为[非均匀有理B样条](https://zh.wikipedia.org/wiki/%E9%9D%9E%E5%9D%87%E5%8C%80%E6%9C%89%E7%90%86B%E6%A0%B7%E6%9D%A1 "非均匀有理B样条")（NURBS），使得我们能给更多一般的几何体建造精确的模型。

在 MLPs 中，一旦我们定义了一个层（由线性和非线性组成），就可以堆叠更多的层使得网络更深。同样我们可以也这样来堆叠深度 KAN 网络，但在此之前，先要解答一个问题：什么是 KAN 层？

按照文中解释，KAN 层被定义为**包含多个一维函数的矩阵**，这些函数之间可以训练和调整。每个函数不仅处理单一的输入输出关系，而是可以处理多个输入到多个输出的映射。这与 MLP 中每层处理多个输入和输出的方式相似，但 KAN 中使用的是一维函数的矩阵：

$$
\Phi={\phi_{p,q}​}
$$
其中 p 是输入维度的索引，q 是输出维度的索引。这种矩阵形式允许KAN网络在每个层上实现复杂的多维输入到多维输出的映射。

对于 KAN 的参数和层结构，每个 $\phi_{p,q}$​ 函数都有可训练的参数，使得 KAN 可以通过学习优化这些函数以适应具体的数据模式。根据 Kolmogorov-Arnold 定理，内部函数形成一个 KAN 层处理输入，外部函数形成另一个 KAN 层处理输出。对于有 n 维输入的情况，内部函数层的输入维度 $n_{in}​=n$，输出维度 $n_{out}​=2n+1$，满足Kolmogorov-Arnold定理中对输出数量的要求。

那么通过上述的层定义，可以看到，构建更深层的 KAN 就像在 MLP 中添加更多层一样简单。每一层的输出可以作为下一层的输入，通过这种方式，KAN能够实现更复杂的数据表示和处理。文中的描述指出，通过叠加更多的KAN层，可以实现对更复杂函数的高精度逼近。

文中关于 KAN 层的公式表达在公式2.5：

$$
x_{l+1,j} = \sum_{i=1}^{n_l} x_{l,i,j} = \sum_{i=1}^{n_l} \phi_{j,i}(x_{l,i}), \quad j = 1, \ldots, n_{l+1}
$$
描述了如何在第 l 层和第 l+1 层之间进行计算，即下一层的每个节点的激活值是当前层所有节点输出通过相应的一维函数处理后的总和。

这个公式看起来还是比较简单的，但文中还提到了如何进行优化才能达到更好的性能，主要包含了3个技巧：
1. **残差激活函数**：在文中公式(2.10)中，每个激活函数 ϕ(x) 被设计为残差形式，即包括一个基函数 𝑏(𝑥) 和一个B-样条函数。这里的 𝑏(𝑥)通常选择为 SiLU 函数，提供了非线性的基本变换，而B-样条部分允许进一步的细粒度调整。这种组合提高了模型对非线性关系的适应性和表达力。
2. **激活函数的尺度初始化**：为了确保网络在初始化阶段具有合理的行为，激活函数的部分，特别是B-样条部分，通常初始化为接近零的小值，而权重 𝑤 使用 Xavier 初始化。这种初始化方法帮助避免训练初期的梯度爆炸或消失问题，促进了更稳定的学习过程。
3. **动态更新样条网格**：由于B-样条是定义在有限区间的，但激活值可能在训练过程中超出这些区间，因此提出了动态更新网格的方法。这意味着根据激活函数输入的实际分布，调整定义样条函数的网格点，确保模型能够适应输入数据的变化，维持优化性能。

对于 KAN 网络参数数量的估算，文中也给出了一个简单的计算方式。假设网络深度为 𝐿，每层宽度为 𝑁，并且每个样条函数的阶为 𝑘，每个样条定义在 𝐺 个区间上（共有 𝐺+1 个网格点）。根据这些设定，KAN的总参数数量大约为： 
$$
O(N^2L(G+k)) \approx O(N^2LG)
$$
这个公式说明了参数数量是**网络深度、层宽、样条的阶数和网格点数量**的函数。相比于传统的多层感知机（MLP），这个数量可能看起来较大，因为KAN替代了传统的权重矩阈以函数形式表达，增加了模型的灵活性和表达能力。

尽管参数数量在理论上可能看起来比传统MLP模型更多，但文中指出，由于KANs通常可以用更少的层宽度 𝑁 来达到与更宽的 MLP 相当或更好的性能，所以在实际应用中它们通常更加参数高效。这种高效性不仅可以节省存储空间，还可以改善泛化能力，因为较少的参数数量有助于减少过拟合的风险。文中在2.3节介绍了KAN的近似能力和 Scaling Laws 描述了KANs 的泛化行为。

### KAN的近似能力和神经缩放定律

KANs 理论上能够**以任意精度近似任何连续函数**，只要网络有足够的层和每层有足够的节点。实际中，这意味着通过增加网络的深度和宽度，可以提高近似的精度。此外，KANs 的**每个节点实现的是一维函数变换**，这相比传统的神经网络在处理高维数据时更为高效和有效。

如果函数可以通过 KAN 表示，那么存在一组特定的B-样条函数，这些样条函数可以用来以任意小的误差近似原函数。这种近似的质量取决于B-样条函数的网格大小，网格越细，近似的精度越高。这个定理文中称作近似理论 KAT。这证明了KAN在处理复杂和高维数据时的潜在优势，因为可以通过细化网格来逐步提高模型的表现，而无需从头开始重建模型。

此外关于神经缩放律（neural scaling laws）及其与其他理论的比较，文章也提供了一段详尽的讨论。文中对比了几种不同的神经缩放理论，包括：

1. **Intrinsic dimensionality by Sharma & Kaplan**: 此理论提出缩放指数 𝛼 从数据拟合的本征维度 𝑑 派生，缩放律为 ℓ∝𝑁−𝛼，其中 𝛼=(𝑘+1)/𝑑。
2. **Maximum arity by Michaud et al.**: 此理论考虑了计算图中最大的分支数（arity），并提出了一个与分支数相关的缩放指数 𝛼=(𝑘+1)/2。
3. **Compositional sparsity by Poggio et al.**: 此理论基于组合稀疏性，提出了缩放指数 𝛼=𝑚/2，其中 𝑚m 是函数类中导数的阶。
4. **KAN by Liu et al.**: KAN 理论则是基于Kolmogorov-Arnold表示，其中提出的缩放指数是 𝛼=𝑘+1。这是因为 KAN 能够分解高维函数为多个一维函数，每个一维函数由样条来近似，从而实现高效的缩放。

KAN理论提出，由于其结构允许将高维函数有效地分解为多个一维函数，因此能够在参数效率方面实现更好的缩放律。这是因为KAN不仅能够学习函数的组成结构（外部自由度），还能精确地近似这些一维函数（内部自由度），从而在相对较少的参数下实现高精度的函数近似。特别是，在高维函数的情况下，KAN表现出比MLP更好的缩放行为和泛化能力。

再然后文中也对 UAT（Universal Approximation Theorem） 和 KAT（Kolmogorov-Arnold Theorem）进行了对比：
- **参数效率**：KAT提供了一种更加参数高效的方式来构造网络，因为它直接利用了函数的内在结构。与UAT相比，KAT允许使用更少的参数来达到同样的近似精度，特别是在面对高维数据时更为明显。
- **函数表示**：UAT依赖于网络的宽度或深度来提高近似能力，而KAT利用了将高维函数分解为一维函数的策略。这使得KAN在处理具有复杂内部结构的函数时更加有效和直接。
- **实际应用**：虽然UAT在理论上保证了神经网络的强大能力，但它并不指导如何构建网络以最优方式实现这一点。相比之下，KAT为设计能够有效利用其理论优势的KAN提供了直接的指导，尤其是在参数初始化和网络结构设计方面。
- **理论含义**：KAT强调了通过学习和优化一维函数来捕捉和表达多维空间中的关系，这种方法本质上更符合一些物理和自然现象的表示方式，因为很多自然规律本身可以分解为较简单的因素的组合。

总结来说，KAT相对于UAT提供了一种更为高效和直接的方法来设计和实现能够处理高维数据的神经网络。这种方法不仅在理论上具有优势，而且在实际应用中也显示出了其独特的效益，尤其是在需要解释模型决策和内部机制的场景中。


### 通过对 KAN 的网格进行扩展来提高模型的准确性

网格扩展是一种提高B-样条逼近精度的方法。在KAN中，每个激活函数通过一组B-样条基函数来表示，而网格点的位置决定了这些基函数的形状和覆盖范围。通过增加网格点的数量（即细化网格），可以提高样条函数的适应性，使其能更精确地拟合复杂的函数形态。

通过细化网格，KAN可以更精细地捕捉输入特征和输出之间的关系。这在数学和物理的应用中尤为重要，例如在解偏微分方程（PDE）或进行复杂数据拟合时。细化网格不仅提高了单个样条函数的逼近能力，也提升了整个网络在处理高维度和复杂数据结构时的表现。

实施网格扩展时，通常**从较粗的网格开始训练模型，逐渐增加网格点数目**。这种逐步细化的方法允许模型在初期快速学习大致的数据结构，随后通过更细的网格来调整和优化细节。此方法与常规的神经网络训练不同，后者通常在固定的网络结构中进行参数优化。

在进行网格扩展的过程中，训练动态可能会出现阶梯式变化：每当网格细化时，模型的损失通常会显著下降，因为模型突然能够更好地捕捉数据中的细节和复杂性。这种现象在训练曲线上表现为突然的性能提升，随后可能会稳定，直到下一次网格扩展。

总的来说，我们可以将网格扩展的过程列出如下：

1. **初始和扩展网格**：首先定义一个粗网格（G1个区间），具有固定的网格点${t_0, t_1, ..., t_{G1}}$。为了进行细化，这个网格会被扩展到一个更细的网格（G2个区间），网格点更密集。
2. **B-样条基函数**：在粗网格上，有 $G1 + k$ 个B-样条基函数，其中 k 是样条的阶数。每个基函数 $B_{i}(z)$ 只在特定的区间 $[t_{k+i-1}, t_{i+1}]$上非零。
3. **粗网格到细网格的逼近**：在粗网格上的函数 $f_{\text{coarse}}(z)$ 通过这些B-样条基函数的线性组合来表示。当网格被细化到G2个区间时，目标是用一个更精细的样条函数 $f_{\text{fine}}(z)$ 来逼近 $f_{\text{coarse}}(z)$。
4. **参数调整**：细网格上的样条函数的系数 $c_j'$ 可以通过最小化 $f_{\text{fine}}$ 和 $f_{\text{coarse}}$ 之间的差异来优化，通常使用最小二乘法来实现。这个优化过程可以根据一些概率分布或实际数据来进行。

网格扩展不仅提高了模型的性能，也增强了模型的解释性。因为每个激活函数都是明确地通过B-样条来表达，所以当查看模型参数时，研究人员可以直接观察到每个激活函数如何随输入变化，这对于理解模型的行为和做出调整至关重要。

### 为了可解释性：简化 KAN 并使其具有交互性

为了使KANs最大程度上具有可解释性，文中在第2.5.1节提出了一些简化技术：

1. **稀疏化（Sparsification）**：
    - 对于KAN中的激活函数进行稀疏化处理，通常通过L1正则化来实现。由于KAN中没有传统的线性权重，而是使用一维函数，因此需要对这些函数的稀疏性进行特别定义和优化。
2. **可视化（Visualization）**：
    - 通过将激活函数的重要性（例如，它们的输出影响程度）可视化，可以帮助研究者和开发者更好地理解模型的工作原理。这种可视化通常包括调整激活函数图像的透明度来反映其相对重要性。
3. **剪枝（Pruning）**：
    - 在训练过程中或训练后对模型进行剪枝，移除不重要的节点或激活函数，从而减少模型的复杂性。剪枝后的模型通常更加高效，且更易于分析和部署。
4. **符号化（Symbolification）**：
    - 将一些激活函数设置为特定的数学函数（如正弦、指数等），而不是完全依赖数据驱动的方式。这种方法有助于提升模型的数学解释性，使其输出更加可预测。

通过使模型简化并增加交互性，KAN不仅可以在复杂数据集上表现出色，还可以更好地与用户沟通，使其决策过程透明化。这些改进对于提升模型的实用性和可信度至关重要。

论文在 KANs 的准确性和可解释性上做了各种任务的实验，在文中的第三和第四节可以查阅。在准确性方面，通过一系列数据拟合和偏微分方程（PDE）求解的实验，展示了KAN在这些任务上相比传统多层感知机（MLP）有更高的准确性。实验结果表明，即使在网络规模较小的情况下，KAN也能达到或超过使用大型MLP模型的准确性。在可解释性方面，通过监督和无监督的toy datasets以及数学和物理上的应用，展示了 KAN 可以帮助研究者们探索和发现科学任务上的规则和定律。

## 讨论

文章的最后从数学、算法和应用的角度讨论了 KANs 的局限性和未来方向。

数学方面：
1. 虽然文章已经提供了关于KANs的初步数学分析（定理2.1），但对KANs的数学理解仍然非常有限。
2. Kolmogorov-Arnold 表示定理虽然在数学上已经被深入研究，但该定理对应的是形状为[n, 2n + 1, 1]的 KANs，这只是 KANs 的一个非常受限的子类。这种形状限制了 KANs 能表示的函数类型，通常只涉及到两层（depth-2）的组合。
3. 文章中提到，深层KANs在实际应用中取得的成功可能暗示了一些基本的数学原理。这引发了对是否可以将Kolmogorov-Arnold 表示定理推广到更深层次（超过两层）的表示的探讨。
4. 提出了“Kolmogorov-Arnold深度”的概念，用以描述可能不能在原始的（两层的）Kolmogorov-Arnold表示中平滑表示的函数，但可能在三层或更深层的表示中实现平滑表示。这一概念可能帮助我们更好地理解和分类不同的函数类。

算法方面：
1. **准确性**：在架构设计和训练策略方面还有许多未被充分探索的选择，这些选择可能进一步提高模型的准确性。例如，可以考虑用径向基函数或其他局部核替换样条激活函数，还有使用自适应网格策略以增强模型的准确性和灵活性。
2. **效率**：KANs运行缓慢的一个主要原因是**不同的激活函数不能利用批量计算**（大数据通过同一个函数），因为每个边上的激活函数都是独立的。一种潜在解决方案是将激活函数**分组成多个组**（"多头激活函数"），组内成员共享相同的激活函数，这样可以在完全相同（如 MLPs 中的激活函数）与完全不同（如 KANs 中的激活函数）之间进行插值。
3. **KANs与MLPs的混合**：KANs与MLPs的两大区别在于：(i) **激活函数位于边上而不是节点上**，(ii) **激活函数是可学习的而不是固定的**。哪种改变更本质地解释了KAN的优势呢？附录B中展示了一种混合模型的初步研究结果，该模型保持了激活函数的可学习性（类似KANs），但激活函数位于节点上（类似MLPs）。还可以构建另一种模型，激活函数固定（像MLPs）但位于边上（像KANs）。
4. **适应性**：由于样条基函数的固有局部性，可以在KANs的设计和训练中引入适应性，以提高准确性和效率。介绍了类似于多网格方法的多级训练概念，以及类似于多尺度方法的领域依赖基函数。

应用方面：
- 在科学相关任务中，KANs 比 MLPs 更有效，例如，拟合物理方程和 PDE 求解。KANs 也可能有望用于解决 Navier-Stokes 方程、密度泛函理论或任何可以表述为回归或 PDE 求解的任务。
- 在机器学习任务中，期望将 KANs 集成到当前的体系结构中，比如 transformers 变成 "kansformers",在transformers中将MLPs替换成KANs。

AI + Science 也是目前热门的 AI 应用研究方向，文中也介绍了使用 KANs 作为一种“语言模型”在 AI+Science 合作中的应用。主要思想是将KAN视为一种能够促进AI与科学家之间交流的工具，科学的语言是函数。KANs 由可解释的函数组成，因此当一个人类用户盯着一个 KAN 时，就像用函数语言与它交流一样。

文中提出了**AI-科学家合作的范式**，这种合作模式不仅限于特定的工具如KANs，而是提倡使用函数作为共同语言来促进这种合作。

通过 KANs，AI与科学家的合作变得前所未有地简单和方便，这促使我们重新思考如何处理AI与科学的关系——**我们是需要AI科学家，还是需要帮助科学家的AI？** 

AI 科学家的固有难度在于很难使人类偏好量化，这将使人类偏好编码成 AI 的目标。事实上，不同领域的科学家对于哪些函数简单或可解释可能有不同的看法。因此，科学家更希望有一个能够使用科学语言（函数）并且可以方便地与单个科学家的归纳偏好进行交互以适应特定科学领域的 AI。

最后的最后，**我们应该使用 KANs 还是 MLPs 呢？**

![](https://leafw-blog-pic.oss-cn-hangzhou.aliyuncs.com/1714905431585.png)

文中给出了一张决策树告诉我们如何进行选择，分别从准确性、可解释性以及效率这3个维度来判断如何进行选择，因为目前 KANs 的最大问题在于训练速度较慢，相同数量的参数情况下，KANs 通常比 MLPs 慢 10 倍。作者的观点认为 KANs 的训练速度慢只是个工程问题，不是根本性的限制。如果训练缓慢不是主要问题，建议可以尝试下KANs。


这篇文章还提供了[官方代码库](https://github.com/KindXiaoming/pykan)，感兴趣的同学可以阅读下源码看看具体的实现。



