KAN 实战指南5 步把 hellokan 跑到输出解析公式【免费下载链接】pykanKolmogorov Arnold Networks项目地址: https://gitcode.com/GitHub_Trending/pyk/pykan本文面向有 PyTorch 基础的工程师解决用 KANpykan 实现时的三个真实问题为什么训练比 MLP 慢一个量级、loss 停在 1e-2 不动怎么办、以及如何把训好的样条激活函数变成可解释的符号公式。整个过程在仓库根目录的 hellokan.ipynb 一个 notebook 里就能走完任务是拟合 f(x,y) exp(sin(πx)y²)终点是拿到公式 exp(1.0·x₂² 1.0·sin(3.1416·x₁))。下面 5 步就是通往这个结果的路径对应 KAN 论文arXiv 2404.197562024给出的核心工作流。一、先跑通 hellokan起步真正的坑在哪安装就一行pip install pykan当前版本 0.2.8依赖里 torch 2.2.2、numpy 1.24.4 都是 requirements.txt 钉死的版本。如果要在源码上开发从 https://gitcode.com/GitHub_Trending/pyk/pykan 克隆后执行pip install -e .即可。跑起来之后第一眼是慢。hellokan 默认 50 步 LBFGS 要跑十秒以上比同规模 MLP 慢得多。原因 README.md 写得很直白symbolic_enabled默认 True每次前向都会多算一条 symbolic 分支而符号计算没有并行化。如果你自己写训练循环、用不到符号功能训练前调model.speed()把这条分支砍掉速度立刻正常。model KAN(width[2,5,1], grid3, k3, seed42) model.fit(dataset, optLBFGS, steps50, lamb0.001) model model.prune(); model model.refine(10) model.auto_symbolic(lib[x,x^2,exp,log,sqrt,tanh,sin,abs]) model.symbolic_formula() # - exp(1.0*x_2**2 1.0*sin(3.1416*x_1))上面 5 行就是全文骨架训练 → 剪枝 → 网格加密 → 符号回归 → 出公式。另一个细节hellokan 里torch.set_default_dtype(torch.float64)不是随手写的样条系数对数值精度敏感float32 下会看到莫名其妙的震荡。二、KAN 真正的三个超参width、grid、kKAN 和 MLP 是双生的MLP 的激活函数在节点上KAN 的激活函数在边上——每条边放一个可学的一维函数。看 kan/KANLayer.py 的 forward 会发现它由两部分相加一条 B-spline 曲线加一个 base 函数默认 SiLU再乘可训练系数。所谓基于 Kolmogorov-Arnold 表示定理落到代码里就是这个结构。grid 和 k 到底控制什么grid是 B-spline 的网格区间数k是分段多项式阶数默认三次k3。kan/spline.py 里的curve2coef/coef2curve负责曲线值与控制系数两种表示的互转训练时优化的是后者。grid 越大单条边能刻画的函数越精细参数量也随之上去——所以 grid 对过拟合的影响往往比 width 还大。由此引出的调参直觉和 MLP 文献是反的。README 的建议从小模型起步。5 输入 1 输出的任务先试KAN(width[5,1,1], grid3, k3)而不是照搬 MLP 习惯上 O(10²) 的宽度不行先加宽再加深。小模型反馈快而且小数据定性上通常能代表大数据——这是作者物理学家思维的注脚。三、判断过拟合看 grid提精度靠 refine训几轮之后最常见的状态是 train/test loss 拉开差距。此时 README 的处方是先降grid再降width别急着加数据。反过来想要精度就上 KAN 独有的网格加密model.refine(new_grid)把现有样条在更密的网格上重新近似再继续训练。hellokan 里 refine(10) 之后接 50 步 LBFGStest loss 从 1.7e-2 压到 4.7e-4三个数量级。这也是为什么refine 之后要警惕过拟合——网格越密单条边的表达能力越接近任意曲线。另外fit的update_gridTrue默认开启训练中会根据样本分布自适应更新网格grid_eps默认 0.02在均匀网格和分位数网格之间插值。数据分布不均时这个机制比 MLP 的归一化技巧省心得多。四、把 KAN 变稀lamb 与 prune 的配合可解释性是 KAN 相对 MLP 的卖点工程上来自稀疏正则。fit(lamb0.01)会对边前向激活加 L1 类惩罚reg_metric 默认edge_forward_spline_n把没用的边往零上压。lamb 幅度怎么定从 0.001 起步能收敛就往上调直到 plot 里出现大片接近零的边调过头loss 明显恶化就回退。训完调model.prune()按edge_th3e-2、node_th1e-2的默认阈值把弱边、弱节点物理删掉实现见 kan/MultKAN.py然后继续训练让剩下的边补回功能。hellokan 里 plot 的子图从 22 个变成 6 个就是这一步。⚠️ 精度和稀疏不是天然矛盾的。论文里两者可以正相关换个任务又变成 trade-off所以别贪心一个阶段只追一个目标。先稀疏剪枝拿到可解释骨架需要精度时再用 refine 和加数据收尾。五、从曲线到公式符号回归的最后一步样条终究是曲线要公式得把边锁死到显式函数。两条路model.fix_symbolic(l, i, j, sin)手动锁定某条边为 sin之后只学幅度系数model.auto_symbolic(liblib)对每条边按 R² 自动匹配 lib 里的候选。lib 的选择是关键手感。hellokan 用[x,x^2,x^3,x^4,exp,log,sqrt,tanh,sin,abs]起步缺函数就用 kan/utils.py 的add_symbolic往函数库里加。锁完之后模型自由度骤降50 步 LBFGS 直接打到 test loss 7e-11 的机器精度量级symbolic_formula()输出 sympy 表达式ex_round(..., 4)四舍五入系数就是最终公式。 同一套 API 平移到 PDE、拉格朗日量等科学问题上tutorials/Physics/ 的 notebook 从守恒律、黑洞到本构方程都有走通案例。注意 PDE 训练是最贵的场景CPU 上小时到天级别其余 tutorial 单 CPU 十分钟以内能跑完。六、KAN 的适用与不适用作者自己的冷判断问得最多的问题是KAN 能不能替掉 MLP。作者在 README 里的态度很坦率对纯 ML 任务KAN 目前不是开箱即用的插件超参要调场景更偏向关心高精度或可解释性的小中规模问题——科学发现、函数拟合、PDE。社区里两个方向的改造值得留意GraphKAN 把 KAN 放进隐空间、前后加线性嵌入层KANRL 在强化学习里固定部分参数换训练稳定性。边界还在被试出来。最后一个长程开发的实用细节MultKAN 的auto_save默认开启任何状态改动都会往 ./model 目录存带版本的 checkpointcheckout(model_id)、rewind(model_id)可以回到任意历史状态。KAN 的训 → 剪 → refine → 锁符号是非线性流程有回滚敢大胆试。下一步动作克隆仓库把 hellokan.ipynb 完整跑一遍重点看prune()之后model.plot()留下的边能读懂剪枝后的网络为什么还能拟合再开始调自己数据的超参。【免费下载链接】pykanKolmogorov Arnold Networks项目地址: https://gitcode.com/GitHub_Trending/pyk/pykan创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考