缓存时间:
2026/06/10 00:21
# 通过Kolmogorov-Arnold网络在FPGA上实现超快机器学习
来源:https://aarushgupta.io/posts/kan-fpga/
2026年6月7日
本文是对我硕士论文的高层次解释,内容涉及使用Kolmogorov-Arnold网络(KAN)架构设计用于超快推理和在线学习的硬件架构。我假设读者熟悉标准机器学习概念,并具备一定的硬件和数字电路知识;关于后者,请阅读我之前的文章(https://aarushgupta.io/posts/cpu/)。
请阅读以下两篇论文以获取更多信息,特别是基准测试和显著结果的细节。
> **\[FPGA 2026 最佳论文\]** Duc Hoang**\***, Aarush Gupta**\***, 和 Philip C. Harris. “KANELÉ: Kolmogorov–Arnold Networks for Efficient LUT-based Evaluation.” *Proceedings of the 2026 ACM/SIGDA International Symposium on Field Programmable Gate Arrays*. ACM, 2026. https://dx.doi.org/10.1145/3748173.3779202 **\[ICML 2026\]** Duc Hoang**\***, Aarush Gupta**\***, 和 Philip Harris. “Ultrafast on-FPGA Online Learning via Spline Locality in Kolmogorov-Arnold Networks.” *arXiv preprint arXiv:2602.02056*, 2026. https://arxiv.org/abs/2602.02056 **\*同等贡献**
### 在FPGA上进行机器学习的理由
大多数现代机器学习工作负载,无论是训练还是推理,都在图形处理器(GPU)上运行。通过支持高度并行执行模型的硬件架构,GPU能够以极高的吞吐量对大量数据执行简单操作。这使得它们非常适合涉及大型架构或批量式训练和推理的机器学习问题。
然而,复杂的GPU架构无法满足需要超低延迟(例如亚微秒延迟)和高硬件效率的应用需求。处理器(如CPU和GPU)在调度和优化指令、动态访问内存等方面会产生显著开销。相反,具有超低延迟(约纳秒级)和效率要求的极端专业化工作负载更适合使用**自定义硬件加速器**。
现场可编程门阵列(FPGA)是一种可重新配置的数字逻辑器件,非常适合这种自定义硬件加速风格。FPGA包含查找表(LUT),通过枚举每种二进制输入组合的输出值来表示数字函数;触发器(FF),用于存储状态;以及其他存储和计算原语。这些组件及其连接被重新配置以设计自定义数字电路,从而实现底层硬件架构与算法的协同设计,进而实现超快机器学习。重要的是,神经网络是**直接作为数字逻辑实现**,而不是作为在处理器上顺序执行的指令。
### 背景
#### 定点量化
FPGA和其他数字设备从根本上操作的是**比特**而非连续值。然而,我们通常将神经网络中的算术运算(如 \(\times, +\) )视为在实数 \(\mathbb R\) 上进行。因此,我们需要将实数编码为比特串(比特序列),这个过程称为**量化**。加法和乘法等运算随后变为二元函数。
一种实现方法是**定点量化**。
> 定点量化以2为基数表示数字,其中一些比特(小数比特)位于小数点之后。举例来说,如果我们总共使用8比特,小数点后有4个小数比特,则可以表示 \(2^8\) 个值,范围从 \((-2^7) / 2^4 = -8\) 到 \((2^7 - 1) / 2^4 = 7.9375\),以 \(1/2^4 = 0.0625\) 的增量均匀分布。这里我们假设可表示范围关于零对称。
在定点量化方案中,我们只能表示某个固定范围内的离散值集,这在尝试表示实数值时会引入近似误差。资源高效机器学习的一个重点是减少这种近似误差,即**量化误差**,以实现稳定的训练和推理。
#### 查找表神经网络(LUT-NN)
FPGA主要通过查找表(LUT)实现数字逻辑,这些小型组件通过存储每种二进制输入组合的输出值来表示任意二元函数。例如,\(\text{AND} : \{0, 1\}^2 \to \{0, 1\}\) 用一个查找表表示为:
输入 \((x,y)\) | \(x\text{ AND }y\)
--- | ---
`00` | `0`
`01` | `0`
`10` | `0`
`11` | `1`
因此,学习这些用查找表表示的二元函数作为神经网络的核心原语是合理的:这种网络称为查找表神经网络(LUT-NN)。然而,通过梯度下降或类似方法学习查找表是困难的。
为解决这个问题,回想一下我们可以通过梯度下降学习实值函数 \(f: \mathbb R \to \mathbb R\)。如果我们使用 \(b_i\) 个输入比特和 \(b_o\) 个输出比特进行定点量化,则 \(f\) 变为二元函数 \(f_Q : \{0, 1\}^{b_i} \to \{0, 1\}^{b_o}\)。然后我们可以学习连续的 \(f\) 并量化以得到所需的查找表!
为了将 \(f\) 转换为 LUT,我们将函数定义域和值域离散化为 \(N_i = 2^{b_i}\) 和 \(N_o = 2^{b_o}\) 个值。\(f_Q\) 的查找表存储每个输入值 \(I \in \{I_0, I_1, \ldots, I_{N_i-1}\}\) 对应的输出。
LUT量化过程:*将连续的 \(f\)(虚线)量化为二元函数 \(f_Q\)(橙色点)。*
上方的示例函数 \(f\) 中,\(q_{l-1}\) 和 \(q_l\) 表示输入和输出的量化,产生一个二元函数 \(f_Q\),其 LUT 为:
\(q_{l-1}(x_l)\) | \(q_l(x_{l+1})\)
--- | ---
`00` | `000`
`01` | `011`
`10` | `100`
`11` | `111`
我们也可以将这种方法扩展到用查找表表示多元函数,其中 \(f_m: \mathbb{R}^{d_i} \to \mathbb{R}^{d_o}\) 将变为具有 \(d_i b_i\) 个输入比特和 \(d_o b_o\) 个输出比特的二元函数。
> 在此查找表中,对于 \(2^{d_i b_i}\) 种可能的输入组合,每种都存储大小为 \(d_o b_o\) 的条目。
对于任何合理的 \(d_i\),这显然是不切实际的。因此,基于查找表的网络将较小的查找表与算术运算相结合,以实现具有表达能力、资源高效且易于训练的结构。
#### Kolmogorov-Arnold 网络(KAN)
KAN 将 MLP(多层感知机)架构中的可学习权重和固定激活函数替换为**可学习的激活函数**。在这项工作中,我们证明 KAN 是一种自然且高效的 LUT-NN 架构。
在 KAN 层中,每条边携带一个**可学习的单变量函数**,而不是一个标量权重。对于一个具有 \(n_{\mathrm{in}}\) 个输入和 \(n_{\mathrm{out}}\) 个输出的 KAN 层,第 \(q\) 个输出的激活值为:
\[
y_q = \sum_{p=1}^{n_{\mathrm{in}}} \phi_{q,p}(x_p),
\]
其中 \(\phi_{q,p} \colon \mathbb{R} \to \mathbb{R}\) 是学习到的边激活函数。相比之下,MLP 使用:
\[
y_q = \sigma\left( \sum_{p=1}^{n_{\mathrm{in}}} w_{q,p} x_p + b_q \right)
\]
其中 \(\sigma\) 是固定的,而 KAN 将非线性置于边函数 \(\{\phi_{q,p}\}\) 中,并将节点运算保持为简单的求和。
下一个问题是如何学习 KAN 激活函数 \(\{\phi_{q,p}\}\)。为此,我们将它们参数化为某个函数基的线性组合:
\[
\phi_{q,p}(x) = \sum_{i=1}^n c_{q,p,i} B_i(x),
\]
这使得我们可以将系数 \(c_{q,p,i}\) 视为梯度下降中的可训练参数。原始的 KAN 论文使用 **B 样条**,它们构成一个多项式基,该基平滑且具有**局部性**,即对于任何给定的输入,只有一部分基函数非零。此外,B 样条以及由此产生的激活函数 \(\{\phi_{q,p}\}\) 是在一个较小的有限域(例如 \([-1, 1]\))上定义的,这一点非常重要。
> 术语:**B 样条**指的是基函数 \(\{B_i\}\),而**激活函数**指的是学习到的 \(\phi_{q,p}(x) = \sum_{i=1}^n c_{q,p,i} B_i(x)\)。
尽管 KAN 架构的完整行为仍有待深入探索,但它在缩放定律、参数效率和可解释性方面相对于 MLP 提供了潜在的改进。对于超快机器学习,前两个特性尤为相关。
### KAN 作为可训练的 LUT-NN
#### 方法
我们第一篇论文的关键思想是使用 KAN 作为一种原则性方法来构建可训练的 LUT-NN。我们为网络中的每个激活函数使用一个单独的 LUT 来表示,使用 LUT-NN 背景部分讨论的过程。现在我们证明 KAN 激活函数特别适合 LUT 表示。
许多其他 LUT-NN 方案将**多元**函数表示为查找表,这效率低下:正如我们之前所见,LUT 条目的数量随输入维度呈指数增长。相比之下,**KAN 的核心特性**是它对单变量激活函数求和,避免了指数增长,并实现了简单的剪枝(即移除不重要的网络组件以减少资源使用)。此外,由于每个激活函数都在一个较小的有限域(例如 \([-1,1]\))上定义,我们可以在量化函数时覆盖整个输入范围!
#### 实现
在这里,我们使用标准技术在软件中(例如,在 CPU/GPU 上的 PyTorch)训练 KAN,然后将固定模型部署到 FPGA 上进行推理。
为了在 FPGA 上对训练好的 KAN 层执行推理,我们采用定点量化方案,并使用查找表并行计算激活函数 \(\{\phi_{q,p}\}\)。然后,我们使用 \(n_\text{in} - 1\) 个两两加法(排列成加法树)执行求和 \(\sum_{p=1}^{n_\text{in}} \phi_{q,p}(x_p)\)。
> 我们将每个**完整激活函数** \(\phi_{q,p}(x_p)\) 转换为查找表,**而不是** B 样条 \(\{B_i\}\) 本身。这是因为模型是预训练的,并且在推理时激活函数是固定的。
对于多层网络,我们为每一层构建上述电路(其 LUT 存储各自学习到的激活函数),并将每一层的输出连接到下一层的输入。
KAN 基于 LUT 的推理架构:*用于在 FPGA 上高效进行 LUT 基 KAN 推理的架构概述。*
#### 结果
该框架在延迟和资源使用等指标上**匹配并超越**了最先进的神经网络 FPGA 加速器,比之前的 KAN-FPGA 实现实现了 2700 倍的加速。如果您感兴趣,请查阅论文了解更多细节!
### FPGA 上的实时在线学习
#### 动机
在软件中训练模型并部署到 FPGA 上可以提供极快的推理速度,但模型本身在部署后仍然是固定的。然而,在许多实时场景中,被建模的系统并不是静态的:其状态或属性可能以高频率演变。在量子控制和核聚变等应用中,模型可能需要在不到一微秒的时间内调整其行为,同时仍然执行超快推理。
这就是**在线学习**的动机:我们不再将 FPGA 视为仅用于预训练模型推理的设备,而是在新数据到达时实时更新模型。我们流式输入数据,运行模型,将每个预测与反馈或目标值进行比较,并使用该误差来更新模型参数。换句话说,前向传播、反向传播和梯度更新都在 FPGA 本身上运行,而不仅仅是前向传播。
> 与从内存中获取权重、计算梯度并将其写回的 CPU/GPU 不同,FPGA 将梯度更新逻辑实现为一个专用且并行的电路,直接修改存储系数的 FPGA 内存。
尽管在 FPGA 上进行实时梯度更新的概念尚未得到充分探索,并且在历史上被认为不切实际,但我们证明,基于 LUT 的 KAN 推理思想可以扩展,以在亚微秒时间尺度上实现这种在线学习。
#### 方法
由于我们现在希望在 FPGA 上训练模型,而不仅仅是使用静态预训练模型进行推理,因此我们将 B 样条基函数 \(\{B_i\}\) 存储在 LUT 中,而不是学习到的激活函数 \(\{\phi_{q,p}\}\)。
> 原因是系数 \(c_{q,p,i}\) 在 \(\phi_{q,p}(x) = \sum_{i=1}^n c_{q,p,i} B_i(x)\) 中随着 FPGA 上的训练进展而更新:由于激活函数 \(\{\phi_{q,p}\}\) 不断变化,**我们无法预先计算并存储它们**。相反,我们必须查找 B 样条值,并将其与每个激活函数的系数相乘来计算激活函数。
现在我们展示 B 样条基 \(\{B_i\}\) 的某些属性,这些属性使得梯度更新在定点量化下既稀疏又稳定,从而能够以极低的延迟和比之前方法更小的资源占用实现基于梯度的学习。
##### 局部基函数
B 样条基函数具有这样的性质:对于任何给定的输入值,只有一小部分基函数是非零的(“激活的”)。为了实现这一点,输入范围被划分为 \(G\) 个区间,或称为“网格单元”。对于阶数为 \(S\) 的 B 样条多项式,\(G+S\) 个基函数构成一个完整基,但只有 \(S+1 \ll G+S\) 个基函数在任意特定区间上非零。
局部基函数示意图:*\(G=3, S=2\) 时的 B 样条基函数。注意在每个网格单元上只有 \(S+1=3\) 个基函数非零。*
我们如下利用这种局部性。在每个区间内,\(S+1\) 个激活的基函数具有相同的形状(只是从一个区间到下一个区间平移);只有它们的系数在不同区间之间不同。为了计算一个激活函数,我们计算那固定的 \(S+1\) 个基函数,将它们乘以当前区间的系数,并求和结果。
> 因此,KAN 样条前向和反向传播所需的硬件逻辑规模与 \(S+1\) 成正比,**而非** \(G\)。特别是,我们可以通过增加网格大小 \(G\) 来“水平”扩展 KAN,从而提高模型的表达能力,而无需扩展 \(S\)。
##### 稳定的定点训练
基于 FPGA 的训练的一个常见问题是,神经网络训练经常产生幅度变化很大的权重和梯度。然而,在固定比特数下,精确表示小值(精细精度)与覆盖大范围幅度之间存在权衡。
此外,多层感知机(MLP)主要由矩阵乘法组成,其输出幅度与输入激活幅度成比例缩放,从而扩大了量化必须覆盖的值范围。即使使用像 sigmoid 或 tanh 这样有界的激活函数,馈入这些激活函数中的中间值在量化时也会遇到同样的问题。
然而,可以证明 KAN 中的 B 样条满足 \(\sum_i B_i(x) = 1\)。对于任何给定的输入 \(x\),输出
\[
f(x) = c_1 B_1(x) + c_2 B_2(x) + \ldots + c_{S+1} B_{S+1}(x)
\]
因此始终介于最小和最大系数之间:\(\min_i c_i \leq f(x) \leq \max_i c_i\)。梯度也遵循类似的界限。