在不断发展的机器学习领域,最近一篇题为“KAN:柯尔莫哥洛夫-阿诺德网络”的研究论文在爱好者中引发了一波热潮。这种创新方法挑战了多层感知器 (MLP) 的传统观点,为神经网络架构提供了全新的视角。
NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 - Three.js虚拟轴心开发包 - 3D模型在线减面 - STL模型在线切割
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 站在创新的前沿,塑造智能系统的未来,并彻底改变我们处理复杂数据分析和建模的方式。
原文链接:KAN网络简明教程 - BimAnt