!! 2024年7月14日重大更新
model.train()
已更改为model.fit()
- 一些其他小功能也有变化(例如,create_dataset 已移至 kan.utils)。我已更新并检查了
./tutorials
中的笔记本可在 CPU 上运行,所以请参考这些教程了解更新/新功能。文档尚未更新,但很快会更新。
对于 pypi 用户,这是最新版本 0.2.1。
新功能包括(稍后会有文档):
Kolmogorov-Arnold 网络(KAN)
这是论文"KAN: Kolmogorov-Arnold Networks"的 GitHub 仓库。文档可以在这里找到。这里是作者对当前 KAN 热潮的回应。
Kolmogorov-Arnold 网络(KAN)是多层感知器(MLP)的有前景的替代方案。KAN 和 MLP 一样具有坚实的数学基础:MLP 基于通用近似定理,而 KAN 基于 Kolmogorov-Arnold 表示定理。KAN 和 MLP 是对偶的:KAN 在边上有激活函数,而 MLP 在节点上有激活函数。这个简单的改变使 KAN 在模型精度和可解释性方面比 MLP 更好(有时甚至好得多!)。KAN 的简介可以在这里找到。
精度
KAN 的扩展速度比 MLP 更快。KAN 以更少的参数实现了比 MLP 更好的精度。
如果你需要高精度,请设置 torch.set_default_dtype(torch.float64)
。
示例 1:拟合符号公式
示例 2:拟合特殊函数
示例 3:PDE 求解
示例 4:避免灾难性遗忘
可解释性
KAN 可以直观地可视化。KAN 提供了 MLP 无法提供的可解释性和交互性。我们可以使用 KAN 潜在地发现新的科学定律。
示例 1:符号公式
示例 2:发现结的数学定律
示例 3:发现安德森局域化的物理定律
示例 4:三层 KAN 的训练
安装
Pykan 可以通过 PyPI 或直接从 GitHub 安装。
前提条件:
Python 3.9.7 或更高版本
pip
对于开发者
git clone https://github.com/KindXiaoming/pykan.git
cd pykan
pip install -e .
通过 GitHub 安装
pip install git+https://github.com/KindXiaoming/pykan.git
通过 PyPI 安装:
pip install pykan
要求
# python==3.9.7
matplotlib==3.6.2
numpy==1.24.4
scikit_learn==1.1.3
setuptools==65.5.0
sympy==1.11.1
torch==2.2.2
tqdm==4.66.2
激活虚拟环境后,你可以按如下方式安装特定的包要求:
pip install -r requirements.txt
可选:Conda 环境设置 对于喜欢使用 Conda 的人:
conda create --name pykan-env python=3.9.7
conda activate pykan-env
pip install git+https://github.com/KindXiaoming/pykan.git # GitHub 安装
# 或
pip install pykan # PyPI 安装
计算要求
教程中的示例通常可在单个 CPU 上在 10 分钟内运行完成。论文中的所有示例都可以在单个 CPU 上在一天内运行完成。训练 PDE 的 KAN 最为耗时,可能需要几小时到几天的时间在单个 CPU 上完成。我们使用 CPU 来训练我们的模型,因为我们进行了参数扫描(对 MLP 和 KAN 都进行了),以获得帕累托前沿。有成千上万个小模型,这就是为什么我们使用 CPU 而不是 GPU 的原因。诚然,我们的问题规模比典型的机器学习任务小,但对于与科学相关的任务来说是典型的。如果你的任务规模很大,建议使用 GPU。
文档
文档可以在这里找到。
教程
快速开始
从 hellokan.ipynb 笔记本开始。
更多演示
更多笔记本教程可以在 tutorials 中找到。
超参数调优建议
许多关于 MLP 和其他网络的直觉可能不能直接转移到 KAN 上。那么如何有效地调整超参数呢?以下是我基于在论文中报告的问题上的经验给出的一般建议。由于这些问题相对小规模且面向科学,我的建议可能不适合你的情况。但我至少想分享我的经验,让用户能更好地知道从哪里开始以及从调整超参数中可以期待什么。
-
从简单的设置开始(小的 KAN 形状,小的网格大小,小数据,无正则化
lamb=0
)。这与 MLP 文献很不同,在 MLP 文献中,人们默认使用O(10^2)
或更高阶的宽度。例如,如果你有一个有 5 个输入和 1 个输出的任务,我会尝试像KAN(width=[5,1,1], grid=3, k=3)
这样简单的设置。如果不行,我会逐渐首先增加宽度。如果还是不行,我会考虑增加深度。你不需要这么极端,如果你对任务的复杂性有更好的理解的话。 -
一旦达到可接受的性能,你就可以尝试优化你的 KAN(更精确或更可解释)。
-
如果你关心精度,尝试网格扩展技术。一个例子在这里。但要注意过拟合,见下文。
-
如果你关心可解释性,尝试使用例如
model.train(lamb=0.01)
来稀疏化网络。建议也逐渐增加 lamb。在稀疏化训练后,绘制图表,如果你看到一些明显无用的神经元,你可以调用pruned_model = model.prune()
来获得剪枝后的模型。然后你可以进一步训练(无论是为了提高精度还是鼓励稀疏性),或进行符号回归。 -
我还想强调,精度和可解释性(以及参数效率)不一定是矛盾的,例如我们论文中的图 2.3。在某些情况下它们可能是正相关的,但在其他情况下可能会显示一些权衡。所以最好不要贪心,一次只瞄准一个目标。然而,如果你有强烈的理由相信剪枝(可解释性)也可以帮助提高精度,你可能想提前计划,即使你的最终目标是精度,你也想首先推动可解释性。
-
一旦你得到一个相当好的结果,尝试增加数据大小并进行最后一次运行,这应该会给你更好的结果! 免责声明:首先尝试最简单的方法是物理学家的思维方式,这可能带有个人偏见,但我发现这种思维方式相当有效,能让我很好地控制事物。此外,我倾向于先选择小数据集的原因是为了在调试阶段获得更快的反馈(毕竟我的初始实现速度很慢)。隐含的假设是小数据集在质量上与大数据集行为相似,这在一般情况下不一定成立,但在我尝试过的小规模问题中通常是成立的。要了解你的数据是否足够,请参阅下一段。
另一个需要牢记的是,请持续检查你的模型是处于欠拟合还是过拟合状态。如果训练和测试损失之间存在较大差距,你可能需要增加数据或减少模型规模(grid
比width
更重要,所以先尝试减小grid
,然后是width
)。这也是为什么我喜欢从简单模型开始,确保模型首先处于欠拟合状态,然后逐步扩展到"黄金地带"。
引用
@article{liu2024kan,
title={KAN: Kolmogorov-Arnold Networks},
author={Liu, Ziming and Wang, Yixuan and Vaidya, Sachin and Ruehle, Fabian and Halverson, James and Solja{\v{c}}i{\'c}, Marin and Hou, Thomas Y and Tegmark, Max},
journal={arXiv preprint arXiv:2404.19756},
year={2024}
}
联系方式
如有任何问题,请联系zmliu@mit.edu
作者说明
我要感谢所有对KAN感兴趣的人。当我设计KAN并编写代码时,我主要考虑的是数学和物理示例(规模相当小!),因此没有过多考虑效率或可重用性的优化。能够收到这种意料之外的关注,我感到非常荣幸,这远远超出了我的预期。因此,我接受任何关于代码效率和可重用性的批评,对此我深表歉意。我唯一的希望是你们能觉得model.plot()
玩起来很有趣:)。
对于对科学发现和科学计算感兴趣的用户(最初的目标用户),我很高兴听到你们的应用并进行合作。这个仓库将继续主要为此目的服务,可能不会有显著的效率更新。事实上,已经有像efficientkan或fouierkan这样的实现,看起来在提高效率方面很有前景。
对于专注于机器学习的用户,我必须坦诚地说,KAN可能还不是一个可以开箱即用的简单插件。需要调整超参数,并引入更多特定于你的应用的技巧。例如,GraphKAN建议KAN最好在潜在空间中使用(需要在输入后和输出前添加嵌入和解嵌入的线性层)。KANRL建议在强化学习中最好固定一些可训练参数以增加训练稳定性。
最近我被问到最多的问题是KAN是否会成为下一代大语言模型。对此我没有很好的直觉。KAN是为那些关心高精度和/或可解释性的应用而设计的。我们当然关心大语言模型的可解释性,但对于大语言模型和科学来说,可解释性可能意味着完全不同的东西。我们是否关心大语言模型的高精度?我不确定,扩展定律似乎暗示了这一点,但可能不需要太高的精度。此外,对于大语言模型和科学来说,精度也可能意味着不同的东西。这种微妙之处使得很难直接将我们论文中的结论转移到大语言模型或一般的机器学习任务中。然而,如果你喜欢这个高层次的想法(边上的可学习激活函数,或与AI互动进行科学发现),我会非常高兴。这不一定是"未来",但希望能启发并影响"许多可能的未来"。作为一个物理学家,我想传达的信息不是"KAN很棒",而更多的是"试着批判性地思考当前的架构,寻求根本不同的替代方案,这些替代方案可以做一些有趣和/或有用的事情"。
我欢迎人们对KAN持批评态度,但也希望对批评本身保持批判。实践是检验真理的唯一标准。在真正尝试并证明成功或失败之前,我们事先并不知道很多事情。我既愿意看到KAN的成功模式,也同样好奇KAN的失败模式,以更好地理解其边界。KAN和MLP无法相互取代(据我所知);它们各自在某些设置中有优势,在其他设置中有局限性。我会对一个能够包含两者并可能建议新的替代方案的理论框架感兴趣(对不起,物理学家喜欢统一理论:)。