Kolmogorov–Arnold Networks (KAN) 即将改变 AI 世界

目录

一、说明

二、KAN介绍 

2.1 什么是 Kolmogorov-Arnold Networks (KAN):

2.2 KAN 的秘诀,Splines!

2.3 了解KAN工作的最简单方法

三、KAN的主要优点 

四、KAN 的 Python 实现 (PyKAN) 

4.1 创建数据集

4.2 输出(数据集可视化)

4.3 创建和训练 KAN

4.4 从模型中获取符号公式

4.5 计算精度

4.6 输出

五、结论


关键词:Kolmogorov–Arnold Networks

一、说明

        在人工智能中,多层感知器(MLP)是基石,其神经架构塑造了无数应用的格局。然而,Kolmogorov-Arnold Networks(KAN)试图通过重新构想神经元在神经网络中工作的本质来突破这一基础。

忘记你所知道的关于神经网络的一切,KAN 在这里改写规则

二、KAN介绍 

        在不断发展的机器学习领域,最近一篇名为“KAN:Kolmogorov-Arnold Network”的研究论文在爱好者中引发了一波兴奋。这种创新方法挑战了多层感知器(MLP)的传统智慧,为神经网络架构提供了新的视角。

2.1 什么是 Kolmogorov-Arnold Networks (KAN):

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

        现在,显而易见的问题变成了这些“更简单的一维函数”是什么。 对于任何对数学或计算图形学有一点了解的人来说,我们谈论的是古老的,并且由称为样条多项式分段信任

B 样条曲线示例 (Google.com)

2.2 KAN 的秘诀,Splines!

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

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

图片来源: Unity Manual |样条曲线入门

从本质上讲,样条曲线提供了一种通用工具,用于精确、灵活地表示复杂的曲线或曲面,使其在各个领域中都非常宝贵。

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

2.3 了解KAN工作的最简单方法

        KAN与传统的MLP不同,它沿着网络边缘用可学习的函数(B样条曲线)取代了固定的激活函数这种自适应架构使 KAN 能够有效地对复杂函数进行建模,同时保持可解释性并减少所需参数的数量。

资料来源:PyKAN Github (https://github.com/KindXiaoming/pykan)

        与MLP中的神经元不同,MLP中的神经元是传输信号的被动管道,KAN中的神经元是学习过程的积极参与者,旨在动态地塑造它们的行为,以响应它们遇到的数据。

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

        资料来源:PyKAN Github (https://github.com/KindXiaoming/pykan)

        利用 B-Splines 的表现力,这些功能赋予 KAN 无与伦比的灵活性和适应性,使他们能够轻松驾驭复杂的数据环境。

三、KAN的主要优点 

1 增强的可扩展性

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

2 提高准确性

        尽管使用较少的参数,但 KAN 在各种任务中比传统 MLP 具有更高的精度和更低的损耗。这归因于它们能够自适应地对数据中的关系进行建模,从而实现更精确的预测和对看不见的例子的更好泛化。

3 可解释模型

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

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

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

        让我们用一个如何在 Python 中实现这些架构的示例来结束我们的讨论

四、KAN 的 Python 实现 (PyKAN) 

让我们使用分类问题进行演示。

4.1 创建数据集

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

import matplotlib.pyplot as plt
from sklearn.datasets import make_moons
import torch
import numpy as npdataset = {}
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[:])

4.2 输出(数据集可视化)

4.3 创建和训练 KAN

from kan import KANodel = 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())

4.4 从模型中获取符号公式

在此之后,将派生一个符号公式,该公式表示模型从数据中学习的内容。

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

4.5 计算精度

最后,可以从学习的公式中获得准确性

def acc(formula1, formula2, X, y):batch = X.shape[0]correct = 0for 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']))

4.6 输出

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

五、结论

        总之,Kolmogorov-Arnold 网络 (KAN) 代表了神经网络架构的范式转变。 虽然需要进一步的研究和实验来充分释放其潜力,但 KAN 有望成为未来几年推进机器学习和科学发现的宝贵工具。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/23205.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

可燃气体报警器效检:预防事故,守护家园

在现代化工业生产、居民生活中,可燃气体报警器作为安全预防的重要工具,其准确性和可靠性直接关系到人们的生命财产安全。 因此,对可燃气体报警器进行定期效检,确保其处于最佳工作状态,是保障安全生产的必要措施。 接…

Java集合之List(超详细)

List是Java集合框架中一个非常重要的接口,它代表了一个有序的集合,允许元素重复,并且可以按照插入的顺序进行访问。 我们先来看看List在集合中的位置: List是单列集合接口Collection下的一个分支,另两个分支是Set和Qu…

【Redis数据库百万字详解】数据类型

文章目录 一、字符串类型概述1.1、数据类型1.2、字符串简介1.3、字符串应用场景 二、字符串命令三、哈希类型概述3.1、哈希介绍3.2、哈希类型应用场景3.3、哈希命令 四、列表类型概述4.1、列表简介4.2、使用场景4.3、列表命令 五、集合概述5.1、集合简介5.2、使用场景5.3、集合…

[大师C语言(第二十一篇)]C语言字节对齐技术详解

引言 在计算机系统中,内存对齐是一种非常重要的技术。它指的是数据在内存中的存放位置与内存地址之间的关系。C语言作为一种高级编程语言,提供了丰富的内存对齐操作,使得程序员可以灵活地控制数据在内存中的布局。本文将深入探讨C语言对齐背…

JavaScript中,ToPrimitive的操作把对象转化为原始值

在JavaScript中,ToPrimitive是一个抽象操作,不是一个实际的方法。ToPrimitive操作用于将对象转换为原始值(例如,字符串、数字或布尔值)。这个操作通常在需要原始值的情况下自动执行,例如在比较或算术运算中…

网络工程从头做-1

网络工程从头做-1 自下而上,从接入交换机开始网络的配置和规划 实验拓扑: 实验步骤: 1.完成基本配置 1.1 PC端IP地址信息配置略 1.2 接入层交换机S1配置 [Huawei]sys S1 [S1]undo in [S1]vlan b 10 20 [S1]int e0/0/1 [S1-Ethernet0/0/1]p l…

k8s怎么监听自定义资源的变更?(2)

接上一篇当生成下面代码之后怎么去使用呢? 1.生成crd文件 这里我们通过kubebuilder的一个子项目 controller-gen 来生成crd文件 https://github.com/kubernetes-sigs/controller-tools curl -L -o https://github.com/kubernetes-sigs/controller-tools; go ins…

48、Flink 的 Data Source API 详解

a)概述 本节将描述 FLIP-27 中引入的新 Source API 的主要接口。 b)Source Source API 是一个工厂模式的接口,用于创建以下组件。 Split EnumeratorSource ReaderSplit SerializerEnumerator Checkpoint Serializer 此外,Sou…

D-Day 上海站回顾丨以科技赋能量化机构业务

5月31日下午,DolphinDB 携手光大证券,在上海成功举办 D-Day 行业交流会。三十余位来自私募机构的核心策略研发、量化交易员、数据分析专家们齐聚现场,深入交流量化投研交易过程中的经验、挑战及解决方案。 DolphinDB 赋能机构业务平台 来自光…

1877java项目建设平台管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java 项目建设平台管理系统 是一套完善的web设计系统,对理解JSP java编程开发语言有帮助采用了java设计,系统具有完整的源代码和数据库,系统采用web模式,系统主要采用B/S模式开 发。开发环境为TOMCAT7.0,Myeclipse8.…

java表实体 蛇形转驼峰 正则匹配替换

java表实体 蛇形转驼峰 正则匹配替换 1.匹配寻找正则:([a-z])_([a-z])2.替换结果正则:$1\U$2\E效果如下图所示:

Python第二语言(三、Python函数def)

目录 1. Python函数(def 函数名():) 1.1 sorted对容器进行排序:无法指定排序规则 1.2 sort对容器自定义排序:可以指定排序规则 1.3 获取变量长度函数(len) 1.4 函数的定义 1.5 函数-传参定义 1.6 函…

如何使用 Systemd 和 Nginx 部署 Node.js 应用程序

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 介绍 在将 Web 应用部署到 Droplet 时,可能会诱人地简单地使用与开发中相同的设置,即在终端中运行“ruby app.rb”或“node server.js”来启动服务器。这样做简单易行…

C#-for循环语句

for循环语句 语法: for(初始化变量; 判断条件; 增量表达式) { // 内部代码 } 第一个空(初始表达式): 一般用来声明一个临时的局部变量 用来计数第二个空(条件表达式): 表明进入循环的条件 一个bool类型的值(bool类型 条件表达式 逻辑运算符)第三个空(增量表达式): 使用第一个空…

Python怎么翻译:探索Python在翻译领域的无限可能

Python怎么翻译:探索Python在翻译领域的无限可能 Python,这门强大而灵活的编程语言,已经在众多领域展现了其独特的魅力。然而,当谈到翻译这一领域时,许多人可能会感到困惑:Python怎么能用于翻译呢&#xf…

OpenCV如何判断一张图片是否有过高的明暗变化

操作系统:ubuntu22.04OpenCV版本:OpenCV4.9IDE:Visual Studio Code编程语言:C11 前言 判断一张图片是否有过高的明暗变化,可以通过分析图像的亮度分布一致性来实现。一种常见的做法是计算图像的亮度标准差(Standard …

免费,C++蓝桥杯等级考试真题--第7级(含答案解析和代码)

C蓝桥杯等级考试真题--第7级 答案:D 解析:步骤如下: 首先,--a 操作会使 a 的值减1,因此 a 变为 3。判断 a > b 即 3 > 3,此时表达式为假,因为 --a 后 a 并不大于 b。因此,程…

ESP32-C3模组上跑通NVS(4)

接前一篇文章:ESP32-C3模组上跑通NVS(3) 本文内容参考: 非易失性存储库 - ESP32 - — ESP-IDF 编程指南 latest 文档 ESP32-C3入门教程 基础篇(八、NVS — 非易失性存储库的使用)_esp入门教学-CSDN博客 …

STM32 启用指令缓存 HAL_ICACHE_Enable

函数在 STM32 的 HAL(硬件抽象层)库中通常用于启用指令缓存(I-Cache)。以下是该函数的主要功能: 启用指令缓存: 当调用 HAL_ICACHE_Enable 函数时,STM32 的 Cortex-M 处理器(特别是…

ElementUI的Table组件在无数据情况下让“暂无数据”文本居中显示

::v-deep .el-table__empty-block {width: 100%;min-width: 100%;max-width: 100%; }