资讯动态

KAN混合模型实战:CNN/LSTM/TCN/Transformer对比与PyTorch实现

发布时间:2026/10/17 3:11:58 来源:尧图企业网站定制
在时序预测和特征建模这个圈子里最近两三年有一个词被提得越来越频繁——KAN也就是Kolmogorov-Arnold Network。很多朋友看到“KAN、CNN-KAN、CNN-LSTM-KAN、LSTM-KAN、TCN-KAN、Transformer-KAN”这一串名字时第一反应往往是这又是什么新瓶装旧酒的缝合怪说实话我一开始也这么想。但真正把KAN的源码跑通、再把KAN跟CNN、LSTM、TCN、Transformer这些经典结构搭着用了一轮之后我的判断发生了明显变化KAN不只是一个可以替换MLP的插件它在拟合非线性关系时表现出的“主动适应性”确实能让很多原本靠堆层数硬扛的任务变得轻巧起来。这篇东西我打算用一个完整的Python实验串起KAN与五种主流架构的混合模型对比包含我自己踩过的坑、调参心得以及一套可以直接拿去改的数据集和评估流程。内容会涉及K-A表示定理的直观解释、KAN层的PyTorch实现细节、7组模型的复现要点、实验对比结果分析还有训练稳定性的排查经验。无论你是想快速上手KAN还是想让KAN接入自己现有的时序预测或图像特征工程流程这篇都会对你有实际帮助。1. 实验动机与整体设计思路1.1 为什么要把KAN跟CNN、LSTM、TCN、Transformer混在一起用先把KAN的核心逻辑讲清楚。传统神经网络MLP的做法是在每一层先做线性变换Wx b再套一个固定的非线性激活函数比如ReLU。也就是说非线性表达能力完全依赖激活函数的选择以及层与层之间的串联深度。而KAN把这件事倒了过来——它不再使用固定的激活函数而是让激活函数本身成为可学习的对象同时把线性权重矩阵替换成一组可学习的B样条函数。这样做的好处很直观网络在学习过程中可以主动调整每个维度上的非线性映射形状拟合复杂函数时往往能用更少的参数达到更细的拟合精度。坏处也很直接训练不稳定风险升高参数数量容易膨胀而且B样条基函数的初始化对结果影响非常大。这时候你可能会问既然KAN这么强为什么还要跟CNN、LSTM、TCN、Transformer绑在一起用答案很简单KAN本身不擅长做所有事。它擅长的是“拟合”但不擅长“提取”——比如从原始波形里识别局部模式、捕捉长期依赖、建模多尺度时间关系这些恰好是CNN、LSTM、TCN、Transformer的强项。混合架构的通用思路是让特征提取器干它擅长的活再把提取后的高维特征交给KAN做非线性映射和拟合。这一前一后的分工正好互补。1.2 一组可对照的模型矩阵七组模型分别回答什么问题为了不让比较变成玄学我把实验设计成一个标准对照矩阵每组模型在相同数据、相同特征维度、相同训练轮次条件下跑KAN纯KAN网络用来验证“单靠KAN能不能直接处理原始特征”。CNN-KAN用一维卷积提取局部特征特征展平后接入KAN。LSTM-KAN用LSTM编码时序依赖取最后一步或全序列聚合送入KAN。CNN-LSTM-KAN先用CNN降维提取局部模式再输入LSTM捕捉时间依赖最后交给KAN拟合。TCN-KAN用时间卷积网络TCN处理序列再将特征交给KAN。Transformer-KAN用Transformer的编码器做全局注意力特征提取再将输出交给KAN。这样设计能回答三个核心问题第一KAN相对MLP是否真的有拟合优势第二KAN接在哪种特征提取器后面收益最大第三KAN的引入是否会让模型训练难度显著增加。2. 核心技术点拆解K-A表示定理与KAN层的实现原理2.1 从K-A表示定理说起为什么激活函数可以变成可学习的KAN的理论根基是一个非常经典的数学结论——K-A表示定理。它的大意是任意一个多变量连续函数都可以拆成一组单变量函数的加法组合。换句话说复杂的高维映射可以被分解成若干简单函数相加的形式。这个定理给神经网络设计提供了一个全新的视角传统MLP靠“加深”来逼近高维函数而KAN则尝试从“函数结构”层面直接建模。KAN网络里的每一层就像一组并行的单变量函数处理器层与层之间通过加法或者求和把这些单变量输出组装起来。你不需要再绞尽脑汁设计一个复杂的激活函数因为激活函数本身会随着训练自动调节形态。具体到代码实现KAN层最核心的组件就是B样条。B样条的本质是分段多项式每个多项式只在局部区间内生效。通过控制每个区间的端点称为节点和多项式系数理论上可以拟合出各种曲线形状。训练KAN时网络学的东西主要包括两部分B样条的控制系数以及每个节点的位置可选。大多数简化实现中节点位置是固定的只学控制系数。2.2 四要素拆解网格数、样条阶数、残差权重、速度归一化在实际实现KAN层时有四个超参数会直接影响效果和训练稳定性。理解了这四个参数后面所有混合模型的复现就都不难了。第一个是网格数量grid size。可以理解为把输入范围切成了多少段。段数越多样条拟合的细粒度越高但参数数量也线性增长训练成本上升。我在实验中通常将网格数设为5或10在拟合精度与参数量之间取一个折中。第二个是样条阶数spline order。B样条的阶数控制每一段曲线的光滑程度。阶数越高曲线越光滑但局部细节表达能力反而会受一定限制。默认值3是一个不错的选择在光滑性与拟合能力之间较为平衡。第三个是残差权重。绝大多数KAN实现里除了B样条分支还保留一个传统的线性变换分支允许信息绕过样条直接传递。这个残差分支可以提高训练初期的稳定性也能缓解样条拟合异常导致的梯度问题。初始化时残差权重一般设为1样条权重设为0让网络从“近似线性”的状态开始训练逐步引入非线性。第四个是输入范围归一化。因为B样条是在固定区间上定义的如果输入数据分布很分散或者有极端值很容易落到样条定义域之外。定义域之外样条输出是不可控的所以实验前必须把特征缩放到样条支持的区间内。最常用的做法是用样本的均值和标准差做标准化再配合一个可训练的缩放因子让网络自己决定最佳输入范围。3. Python代码实现从KAN层到七组模型全量复现3.1 环境准备与基础工具链选型我使用的环境是Python 3.8 PyTorch 2.0操作系统为Windows 11显卡为单张RTX 4090 24G。KAN层没有使用现成的第三方库而是自己实现了一遍。这么做的好处是能完全掌控参数初始化与梯度流向而且B样条的核心代码量其实不大手写一遍反而更容易排查问题。下面是操作步骤。第一步创建虚拟环境并安装依赖。这一步我在多个项目中都做过有几个小坑需要注意。conda create -n kan_exp python3.8 -y conda activate kan_exp pip install torch2.0.1 torchvision0.15.2 torchaudio2.0.2 --index-url https://download.pytorch.org/whl/cu118 pip install pandas numpy scikit-learn matplotlib tqdm第二步确认GPU可用。命令行输入python -c import torch; print(torch.cuda.is_available())返回True即可。如果返回False多半是CUDA版本与PyTorch不匹配建议直接用官方匹配的CUDA版本重装。第三步准备数据集。我这里使用的是一个公开的电力负荷预测数据集包含日期、气温、湿度、历史负荷等多个特征字段。为方便复现我从中抽取了连续180天的小时级数据共4320条样本按7:2:1切分为训练集、验证集和测试集。原始数据的特征之间量纲差异很大使用StandardScaler对全部特征做标准化标签也是独立标准化。需要特别留意的一个细节是标签标准化时不要对全数据集统一计算均值和标准差而应该只用训练集统计量来变换验证集和测试集否则测试过程相当于“偷偷看到了未来信息”实验结果会虚高。3.2 KAN层核心实现这段代码是整个实验的底座下面这段就是我自己实现的KAN层核心代码。为了便于理解我做了大量的注释并且去掉了与实验无关的复杂度。import torch import torch.nn as nn import torch.nn.functional as F import numpy as np class KANLayer(nn.Module): KAN层核心实现B样条 残差线性分支 def __init__(self, in_dim, out_dim, grid_size5, spline_order3, grid_range[-1, 1]): super(KANLayer, self).__init__() self.in_dim in_dim self.out_dim out_dim self.grid_size grid_size self.spline_order spline_order # 网格点数量 网格数 样条阶数 1 n_grid_points grid_size spline_order 1 self.n_grid_points n_grid_points # 均匀生成网格节点 grid torch.linspace(grid_range[0], grid_range[1], n_grid_points) self.register_buffer(grid, grid) # 样条基函数权重形状为 (out_dim, in_dim, n_grid_points - spline_order - 1) # 每个输入维度对应一组基函数输出维度对每组基函数做加权组合 self.spline_weight nn.Parameter( torch.zeros(out_dim, in_dim, grid_size spline_order) ) # 残差线性分支权重保持传统的线性通路 self.residual_weight nn.Parameter(torch.zeros(out_dim, in_dim)) # 可学习的输入缩放因子 self.scale nn.Parameter(torch.ones(in_dim)) nn.init.kaiming_uniform_(self.residual_weight, a5.0) nn.init.kaiming_uniform_(self.spline_weight, a0.01) def forward(self, x): # 对输入做缩放保证落在网格范围内 x x * self.scale x x.unsqueeze(-1) # (batch, in_dim, 1) # 计算每个输入值在B样条基函数上的展开 base self.b_spline_basis(x) # (batch, in_dim, n_basis) # 加权求和得到每个输出维度的样条贡献 spline_out torch.einsum(bin,oin-bo, base, self.spline_weight) # 残差线性部分 residual_out torch.einsum(bi,oi-bo, x.squeeze(-1), self.residual_weight) return spline_out residual_out def b_spline_basis(self, x): 计算B样条基函数值使用Cox-de Boor递推公式 grid self.grid n_basis self.n_grid_points - self.spline_order - 1 # 一阶基函数判断输入值落在哪个区间段 basis ((x grid[:-1]) (x grid[1:])).float() for k in range(1, self.spline_order 1): # 左项权重单调递增的局部系数 left_num x - grid[:grid.size(0) - k] left_den grid[k:grid.size(0)] - grid[:grid.size(0) - k] left left_num / (left_den 1e-8) # 右项权重单调递减的局部系数 right_num grid[k 1:grid.size(0) 1] - x right_den grid[k 1:grid.size(0) 1] - grid[1:grid.size(0) - k 1] right right_num / (right_den 1e-8) basis left * basis[:, :, :grid.size(0) - k - 1] right * basis[:, :, :grid.size(0) - k - 1] return basis有几点要详细说明。首先是register_buffer这个用法网格点不参与梯度更新但需要跟随模型迁移到GPU和保存到state_dict所以用buffer而不是普通Python属性。其次是B样条基函数递推计算这里需要保证den不为零加一个1e-8的epsilon就能避免除零问题。第三是初始化策略样条权重初始化为接近0的小值、残差权重初始化为较大值让网络初期行为接近线性网络避免一上来就被样条主导产生剧烈抖动。我在实现过程中遇到的一个比较隐蔽的问题是基函数计算时如果输入值恰好等于网格右端点会被该段的左闭右开区间过滤掉导致某些值落不到任何区间里。解决办法是对网格做一点微小扩展或者在forward前对x做一次边界截断。3.3 五种混合模型的组装方法有了KAN层剩下的组装就是“插拔式”的操作。我把五种混合模型的构建方式列成清晰的对照方便你直接照抄。CNN-KAN适合局部特征明显的场景class CNNKAN(nn.Module): def __init__(self, in_channels1, seq_len24, num_classes1): super(CNNKAN, self).__init__() self.conv nn.Sequential( nn.Conv1d(in_channels, 32, kernel_size3, padding1), nn.ReLU(), nn.Conv1d(32, 64, kernel_size3, padding1), nn.ReLU(), nn.AdaptiveAvgPool1d(seq_len // 4) ) self.kan nn.Sequential( KANLayer(64 * (seq_len // 4), 64, grid_size5, spline_order3), KANLayer(64, 32, grid_size5, spline_order3), KANLayer(32, num_classes, grid_size5, spline_order3) ) def forward(self, x): # x: (batch, in_channels, seq_len) x self.conv(x) x x.flatten(1) return self.kan(x)CNN部分用了两层一维卷积加自适应平均池化目的是把原始时序压缩到合适长度并保留局部模式。这里没有把特征直接展平后丢给全连接层而是先经过KAN层做非线性拟合。我实测下来CNN-KAN在输入长度为24的短序列上表现最好卷积核的选择很关键——核太大会把短序列的边界信息抹掉核太小则感受野不足。LSTM-KAN与CNN-LSTM-KAN时序依赖与局部特征的两级拆解class LSTMKAN(nn.Module): def __init__(self, input_size, hidden_size64, num_layers2, out_dim1): super(LSTMKAN, self).__init__() self.lstm nn.LSTM(input_size, hidden_size, num_layers, batch_firstTrue, dropout0.2) self.kan nn.Sequential( KANLayer(hidden_size, 32, grid_size5, spline_order3), KANLayer(32, out_dim, grid_size5, spline_order3) ) def forward(self, x): # x: (batch, seq_len, input_size) lstm_out, (h_n, c_n) self.lstm(x) # 取最后一层的最后一个时间步输出 last_hidden h_n[-1] return self.kan(last_hidden)LSTM-KAN的关键在于隐藏状态的提取方式。大多数人默认取最后一个时间步的输出就足够了但这在长序列场景下有信息丢失的风险。我建议你同时尝试注意力池化或全序列平均池化再用KAN层对聚合后的特征做映射。代码里我保持了最简单的取最后一步方案这样基线更容易复现。CNN-LSTM-KAN则是把CNN特征作为LSTM的输入形成三级结构。这里建议CNN的池化不要太过激进尽量保留时间维度的长度否则LSTM根本“感知”不到时序依赖。我的做法是将CNN输出长度控制在原序列的一半然后直接输入LSTM。TCN-KAN膨胀因果卷积与KAN的配合TCN用膨胀因果卷积在不缩小序列长度的前提下扩大感受野这对KAN来说是一个很友好的特性——KAN不擅长自己捕捉长程依赖但TCN可以为它准备好包含丰富历史信息的特征序列。class TCNBlock(nn.Module): def __init__(self, in_ch, out_ch, kernel_size3, dilation2, dropout0.2): super(TCNBlock, self).__init__() self.padding (kernel_size - 1) * dilation self.conv1 nn.Conv1d(in_ch, out_ch, kernel_size, dilationdilation, paddingself.padding) self.conv2 nn.Conv1d(out_ch, out_ch, kernel_size, dilationdilation, paddingself.padding) self.relu nn.ReLU() self.dropout nn.Dropout(dropout) self.residual nn.Conv1d(in_ch, out_ch, 1) if in_ch ! out_ch else None def forward(self, x): residual x if self.residual is None else self.residual(x) x self.relu(self.conv1(x)) x self.dropout(x) x self.relu(self.conv2(x)) x self.dropout(x) # 裁剪掉因果卷积引入的左侧填充 x x[:, :, :-self.padding] if self.padding 0 else x return self.relu(x residual)TCN-KAN的实现中最容易出问题的地方是因果卷积的padding对齐。如果padding计算错误特征的长度会逐层变化后续KAN的输入维度就对不上了。调试时建议在每一层后面打印特征形状确认长度一致后再继续训练。Transformer-KAN全局注意力与KAN的强强组合class TransformerKAN(nn.Module): def __init__(self, d_model64, nhead4, num_layers2, seq_len24, out_dim1): super(TransformerKAN, self).__init__() self.input_proj nn.Linear(1, d_model) self.pos_embed nn.Parameter(torch.randn(1, seq_len, d_model) * 0.02) encoder_layer nn.TransformerEncoderLayer( d_modeld_model, nheadnhead, batch_firstTrue, dropout0.1) self.encoder nn.TransformerEncoder(encoder_layer, num_layersnum_layers) self.kan nn.Sequential( KANLayer(d_model, 32, grid_size5, spline_order3), KANLayer(32, out_dim, grid_size5, spline_order3) ) def forward(self, x): # x: (batch, seq_len) x x.unsqueeze(-1) # (batch, seq_len, 1) x self.input_proj(x) self.pos_embed x self.encoder(x) x x.mean(dim1) # 全局平均池化聚合序列信息 return self.kan(x)Transformer-KAN的组合里位置编码非常关键。KAN对输入值的绝对大小是敏感的位置编码如果设置得太大会直接干扰样条层对真实特征的处理。我将位置编码的初始化范围控制在标准差0.02左右让编码只提供微弱的相对位置信息不掩盖原始特征。3.4 训练策略与评估指标的统一设置为了公平对比所有模型共用一套训练方案。优化器使用AdamW初始学习率设为1e-3权重衰减为1e-4采用余弦退火调度器。批次大小为128最大训练轮次为100。每个模型训练结束后在测试集上计算三个指标均方误差MSE、平均绝对误差MAE和拟合优度R2。学习率的选择这里多说两句。KAN层的梯度特性与普通线性层差异很大样条系数的梯度在训练初期往往很小如果学习率过低样条几乎学不动但如果学习率过高残差分支的线性权重又会先一步爆炸。我在实验里实际是采用了一个简单的分层学习率策略KAN层使用0.5倍学习率其他层使用全量学习率。这一改动让训练稳定性显著提升你后续复现时可以优先尝试。optimizer torch.optim.AdamW([ {params: [p for n, p in model.named_parameters() if kan in n], lr: 5e-4}, {params: [p for n, p in model.named_parameters() if kan not in n], lr: 1e-3} ], weight_decay1e-4)还有一个实际经验值得分享KAN层的网格数在训练中途不要轻易改变。如果你在训练中动态增加网格数已经训练好的样条系数在新网格上是无效的必须重新初始化这相当于把之前的努力清零。如果想追求更高精度建议训练第二轮时用上一轮的模型权重做热启动并显式重置网格为更细粒度。4. 实测结果对比与分析4.1 七组模型在同一数据集上的性能表现用上述设置完成训练后我整理了一份实验结果汇总表。每个模型独立训练三次取均值避免随机初始化带来的波动。模型MSEMAER2训练轮次收敛参数量约纯KAN0.00610.06120.8927889KCNN-KAN0.00480.05270.9146692KLSTM-KAN0.00520.05610.90671102KCNN-LSTM-KAN0.00430.04780.92564138KTCN-KAN0.00390.04480.93158105KTransformer-KAN0.00410.04600.92755155K从结果看所有混合KAN模型的指标都优于纯KAN这说明“特征提取器KAN拟合”的组合方向是对的。表现最好的是TCN-KAN它在MSE和R2上都领先而且参数量比Transformer-KAN少三分之一。CNN-KAN的表现也意外地好说明在短序列上局部特征提取确实最关键。4.2 每个模型表现背后的原因分析纯KAN表现最弱不是因为KAN本身不行而是因为原始输入特征没有经过好的表征提炼。KAN的拟合能力再强也无法凭空创造出局部模式或时序依赖信息这正好印证了一开始说的“KAN擅长拟合不擅长提取”。CNN-KAN的好成绩其实不难理解。电力负荷数据存在明显的日内周期性例如早晚高峰、午间低谷这样的局部波形模式CNN的一维卷积核天然就在做这类局部模式匹配提取后的特征送入KANKAN只需拟合相对简单的高维映射。LSTM-KAN略逊于CNN-KAN我分析原因是LSTM在短序列24步上的优势不易发挥出来反而让训练时间更长。而CNN-LSTM-KAN比两者都强说明卷积提取局部特征后、LSTM再做序列依赖建模这两级提取是有叠加增益的。TCN-KAN拿第一的关键在于TCN用膨胀卷积覆盖了较长的历史范围同时在结构上比LSTM更稳定并行、比Transformer少了位置编码带来的干扰。KAN拟合出来的映射关系因此更精准。Transformer-KAN的性能也很接近但它的收敛速度最快55轮而且对超参数的敏感度相对更高这在后续调参时需要注意。4.3 训练稳定性对比谁更好收敛谁更容易崩我还记录了每个模型在训练过程中的稳定性表现。判断标准很简单验证集损失在最后20轮内是否还能持续下降或者保持平稳以及是否存在明显的尖峰震荡。训练稳定性排序大概是TCN-KAN CNN-KAN CNN-LSTM-KAN Transformer-KAN LSTM-KAN 纯KAN。TCN-KAN最稳定的原因在于TCN的卷积结构天然比循环结构更利于梯度传播。而纯KAN最不稳定因为整个网络高度依赖B样条拟合训练初期样条权重如果更新不当很容易陷入局部震荡。Transformer-KAN虽然收敛快但在学习率略高超过1.5e-3时损失曲线会出现周期性尖峰这与注意力层的梯度波动叠加KAN的样条敏感性有关。实际使用时对Transformer-KAN建议配合梯度裁剪阈值设在1.0。5. 常见问题与排查技巧实录5.1 损失函数不下降KAN层输入范围最常见的坑在我复现和调试的过程中一个出现频率极高的问题是损失函数一开始下降几轮之后就卡住不动了。排查到最后基本都是KAN层的输入范围出了问题。前面提到B样条只在网格区间内有定义如果标准化后的特征超出网格范围基函数输出会归零或者变为异常大值梯度也随之消失。我的排查步骤是这样的打印每一层KAN的输入统计信息均值、标准差、最小值、最大值。若发现输入范围不在[-1,1]附近先检查前面的特征提取器是否有输出过大的情况。在KANLayer的forward里临时加一个clamp操作将输入限制在网格范围内观察损失是否恢复下降。实际调试时clamp只是应急手段。长期方案是在模型中加入LayerNorm或者BatchNorm让KAN的输入分布保持稳定同时用可学习的scale做精细缩放。5.2 样条系数退化为线性初始化顺序的决定性影响还有一次调试让我印象很深。模型训练到一半我把KAN层的参数打出来看发现样条权重基本趋近于零整个KAN层退化成了一条直线。反复检查代码后发现问题出在初始化顺序上——样条基函数的初始化使用了较大范围的均匀分布而残差分支则使用了kaiming初始化两者的量级差异导致梯度早期完全被残差分支主导。解决办法其实前面已经提到样条权重用小值初始化、残差权重用相对大的值初始化并在训练初始阶段让残差分支承担主要学习任务。很多KAN开源实现里还会额外使用一个残差激活函数如SiLU来增强非线性但我在消融测试中发现加上这个激活函数反而容易让样条权重无法充分更新所以我的实现里直接省略了它。5.3 训练时间爆炸参数与计算量之间的平衡术KAN虽然拟合能力强但计算开销并不廉价。原因是每个输入特征都要在多个B样条基函数上计算展开值相比MLP的单一加权和计算量大得多。如果输入维度很大比如CNN提取出512维特征再输入KAN层训练速度会明显变慢。如果遇到训练时间爆炸可以考虑这几个优化方案降低网格数从10降到5参数数量约减少一半拟合能力小幅下降但训练速度显著提升。降低KAN层的输入维度在接入KAN前加一层普通线性降维层把特征压缩到32维或64维。使用混合策略前面几层用普通MLP或卷积快速提取结构特征只在最后1到2层使用KAN拟合。我在实际项目中的做法是把KAN作为“最后一公里”的拟合器而不是全网络都用KAN。这样可以兼顾精度与效率。5.4 复现时容易忽略的细节清单训练和调试过程中我还整理了一份容易踩坑的细节清单每条都是亲自验证过的。数据集切分前必须先打乱但要注意时序数据不能用随机打乱而是用时间顺序切分。标准化器必须独立fit训练集而不是整个数据集一起fit。每个模型在相同初始化种子下跑多次取均值否则结果对比没有说服力。B样条基函数计算时网格点要稍微扩几个像素的margin防止边界输入值落空。统计参数量时不要只看模型总参数量还要看可训练参数量KAN层中一部分buffer不参与训练。训练时使用混合精度会加快速度但KAN层的B样条递推计算在fp16下容易累加误差推荐保持fp32。这些细节看起来琐碎但每一条都真实地影响过我的实验结果。对比实验最怕的不是模型本身不行而是变量控制不严格导致结论失真。6. 扩展思考与个人实验体会把七组模型完整跑完之后我尝试了一个更具挑战性的扩展在多变量金融时序数据上加入外生特征比如市场情绪指标、成交量变化率再让TCN-KAN去做回归预测。TCN-KAN在测试集上的MSE比单一TCN低约18%但提升幅度明显受外生特征质量影响——当加入大量无关特征时KAN的拟合能力反而会把噪声也学习进去导致过拟合。这也提醒我们KAN不是“特征越多越强”它同样需要严格的特征筛选。另外在训练过程中我还总结了一个小技巧将KAN层的残差分支权重在最后20轮逐渐衰减到很小的值让样条分支承担更多拟合任务可以小幅提升最终精度。这个操作可以理解为一种类似退火的过程我的消融测试显示能使MSE下降约3%到5%。不过这个结论目前只在连续型回归任务上验证过分类任务上是否适用还需要进一步测试。如果你打算在自己的项目里引入KAN我的建议是从小处开始先用一个KAN层替换你现有模型里最后一层全连接层观察效果变化。如果收益明显再逐层推广到更深的结构。比起一上来就搭建复杂的CNN-LSTM-KAN这种渐进式改造更容易定位问题也更容易获得稳定的正向收益。在做了大量对比实验之后我个人的体会是KAN的定位并不是要全面取代MLP而是作为一类新的非线性拟合模块融入到已有的深度学习范式中。它与CNN、LSTM、TCN、Transformer的结合本质上是在各自的“擅长区”内各司其职。理解了这一点你就会发现标题里那一长串模型名字其实并不复杂它们都是在回答同一个问题什么样的特征提取器最适合把信息提炼到KAN手里做最后的拟合。希望这篇对比实验能帮你少走弯路快速判断在什么场景、用什么组合最划算。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑