FourierKAN
FourierKAN的Pytorch层
这是一个旨在替代线性层和非线性激活的层
它受到Kolmogorov-Arnold网络的启发,但使用一维傅里叶系数而不是样条系数 由于傅里叶比样条更密集(全局vs局部),它应该更容易优化 一旦达到收敛,你可以用样条近似替换一维函数,以获得更快的评估速度,同时得到几乎相同的结果 使用傅里叶而不是样条的另一个优势是函数是周期性的,因此在数值上更有界限 避免了超出网格的问题
使用方法
将文件放在同一目录下 然后
from fftKAN import NaiveFourierKANLayer
或者你可以运行
python fftKAN.py
查看演示。
代码可在CPU和GPU上运行,但未经测试。
这是一个简单版本,使用的内存与网格大小成正比,而融合版本不需要临时内存
训练
傅里叶系数的高频项可能会使训练变得困难,因为函数不会非常平滑。
@JeremyIV建议对傅里叶系数使用布朗噪声初始化(参见PR https://github.com/GistNoesis/FourierKAN/pull/4),你可以通过使用标志```smooth_initialization=True```构造层来尝试
处理傅里叶高频项的一种常用方法是添加一个正则化项,该项以你想要的方式惩罚高频。这样做的好处是,随着训练的进行,函数将被强制平滑,而不仅仅是在初始化时。
核心亮点:
你可以简单地实现乘积,然后进行求和,或者使用einsum进行降维。 Einsum应该使用更少的内存但速度更慢
许可证
许可证是MIT,但未来的演变(包括融合内核)将是专有的。
融合操作
这一层使用大量内存,但通过融合操作,我们不需要任何额外内存,甚至可以使用三角学技巧。