KAN网络简明教程

在不断发展的机器学习领域,最近一篇题为“KAN:柯尔莫哥洛夫-阿诺德网络”的研究论文在爱好者中引发了一波热潮。这种创新方法挑战了多层感知器 (MLP) 的传统观点,为神经网络架构提供了全新的视角。

1、什么是柯尔莫哥洛夫-阿诺德网络 (KAN)

这一突破性概念的核心是柯尔莫哥洛夫-阿诺德表示定理,这是由弗拉基米尔·阿诺德和安德烈·柯尔莫哥洛夫开发的数学理论。该定理断言,复杂的多元函数可以分解为更简单的一维函数,为 KAN 的独特结构奠定了基础。

现在,显而易见的问题是这些“更简单的一维函数”是什么。对于任何有一点数学或计算图形知识的人来说,我们谈论的是古老而值得信赖的分段多项式,即样条函数

2、KAN 的秘密武器,样条线!

样条线是一种数学函数,通过连接一系列控制点,可以创建平滑的曲线。样条线可以灵活地调整曲线的形状,同时确保相邻段之间的连续性和平滑性。

要创建样条线,通常从一组定义曲线路径的控制点开始。然后通过使用基函数(例如 B 样条线或贝塞尔曲线)在这些控制点之间插入或近似路径来构建曲线。

本质上,样条线提供了一种多功能工具,可以精确灵活地表示复杂的曲线或曲面,使其在各个领域都具有无价的价值。

但是,这些样条线如何在 KAN 架构中使用和利用?

3、了解 KAN 工作原理的最简单方法

KAN 与传统 MLP 不同,它沿网络边缘用可学习函数(B 样条线)替换固定激活函数。

这种自适应架构允许 KAN 有效地对复杂函数进行建模,同时保持可解释性并减少所需的参数数量。

与 MLP 中充当信号传输被动管道的神经元不同,KAN 中的神经元是学习过程的主动参与者,旨在根据遇到的数据动态地塑造其行为。

这种变革性转变是通过采用位于网络边缘的可学习激活函数实现的。

这些函数利用 B 样条的表达能力,赋予 KAN 无与伦比的灵活性和适应性,使它们能够轻松驾驭复杂的数据环境。

4、KAN 的主要优势

增强的可扩展性:与 MLP 相比,KAN 表现出卓越的可扩展性,尤其是在高维数据场景中。它们能够将复杂的函数分解为更简单的组件,从而高效处理大型数据集,使其成为处理大量信息任务的理想选择。

提高准确性:尽管使用较少的参数,但 KAN 在各种任务中都比传统 MLP 实现了更高的准确性和更低的损失。这归因于它们能够自适应地对数据中的关系进行建模,从而产生更精确的预测和更好地泛化到看不见的示例。

可解释的模型:KAN 的结构有助于提高可解释性,使研究人员能够推导出有效表示学习模式的符号公式。与黑盒模型不同,KAN 提供了输入特征如何在整个网络中转换的见解,从而增强了透明度和理解力。

5、KAN实践

现在我们知道了什么是 KAN,以及为什么它们在人工智能领域如此重要,但世界并不仅仅依靠论文中看起来不错的理论和模型来推动。

但 KAN 最好的一点是,它们非常类似于使用新的 Python 库“PyKAN”在你自己的数据科学问题中进行扩展和利用。

让我们以一个如何在 Python 中实现这些架构的示例来结束我们的讨论,让我们使用分类问题进行演示。

5.1 创建数据集

我们将使用 sklearn 库的“make_moons”函数创建一个合成数据集。

import matplotlib.pyplot as plt
from sklearn.datasets import make_moons
import torch
import numpy as np

dataset = {}
train_input, train_label = make_moons(n_samples=1000, shuffle=True, noise=0.1, random_state=None)
test_input, test_label = make_moons(n_samples=1000, shuffle=True, noise=0.1, random_state=None)

dataset['train_input'] = torch.from_numpy(train_input)
dataset['test_input'] = torch.from_numpy(test_input)
dataset['train_label'] = torch.from_numpy(train_label)
dataset['test_label'] = torch.from_numpy(test_label)

X = dataset['train_input']
y = dataset['train_label']
plt.scatter(X[:,0], X[:,1], c=y[:])

输出如下:

5.2 创建并训练 KAN

from kan import KAN

odel = KAN(width=[2,2], grid=3, k=3)

def train_acc():
    return torch.mean((torch.argmax(model(dataset['train_input']), 
    dim=1) == dataset['train_label']).float())

def test_acc():
    return torch.mean((torch.argmax(model(dataset['test_input']), 
    dim=1) == dataset['test_label']).float())

results = model.train(dataset, opt="LBFGS", steps=20, 
          metrics=(train_acc, test_acc), 
          loss_fn=torch.nn.CrossEntropyLoss())

5.3 从模型中获取符号公式

此后,将得出一个符号公式,表示模型从数据中学到的内容。

formula1, formula2 = model.symbolic_formula()[0]

5.4 计算准确率

最后,可以从学习到的公式中得到准确率

def acc(formula1, formula2, X, y):
    batch = X.shape[0]
    correct = 0
    for i in range(batch):

        logit1 = np.array(formula1.subs('x_1', 
                          X[i,0]).subs('x_2', X[i,1])).astype(np.float64)
        logit2 = np.array(formula2.subs('x_1', X[i,0]).subs('x_2', 
                          X[i,1])).astype(np.float64)

        correct += (logit2 > logit1) == y[i]

    return correct/batch

# Print Accuracy
print('train acc of the formula:', acc(formula1, 
                                       formula2, 
                                       dataset['train_input'],  
                                       dataset['train_label']))

print('test acc of the formula:', acc(formula1, 
                                      formula2, 
                                      dataset['test_input'], 
                                      dataset['test_label']))

输出如下:

train acc of the formula: tensor(0.9700)
test acc of the formula: tensor(0.9660)

6、结束语

总之,柯尔莫哥洛夫-阿诺德网络 (KAN) 代表了神经网络架构的范式转变。虽然需要进一步研究和实验才能充分发挥其潜力,但 KAN 有望成为未来几年推动机器学习和科学发现的宝贵工具。

随着该领域的不断发展,KAN 站在创新的前沿,塑造智能系统的未来,并彻底改变我们处理复杂数据分析和建模的方式。


原文链接:Kolmogorov–Arnold Networks (KAN) Are About To Change The AI World Forever

BimAnt翻译整理,转载请标明出处