《KAN》的四个问题(转自b站耿直哥)

视频链接

【KAN网络】非线性空间美学的崛起,傅里叶级数转世泰勒展开重生_哔哩哔哩_bilibili

1、KAN和MLP的本质区别

MLP:输入的线性组合外套一层激活函数,从而实现非线性变换 写成矩阵形式更为简洁

对于深度神经网络就是线性组合 激活函数 再组合 再激活 如此反复

把线性空间不断变换扭曲成非线性的空间 这使得原来非线性不可分的数据在新的空间中反倒线性可分了

MLP的优点:结构简洁高效

MLP的缺点:

1、激活函数固定而脆弱,一旦导数为0或者太大,就会产生梯度消失/爆炸,导致反向传播失效

2、线性组合过于简单,想学到有用的信息需要庞大的参数量,效率的低下,处理高维数据或者长期依赖能力有限

  • KAN:针对MLP的缺点做了改进,对于输入直接激活非线性变换然后再组合,在这个两层结构中,相当于把激活函数放到了连接上

以样条函数(作为激活函数)为例,当多个样条函数组合起来就能模拟任意函数

写成公式如上图所示,数学上叫Kolmogorov-Arnold表示定理,这也是KAN网络名字的来源了。

2、KAN的核心原理和主要思想

单丝不成线,独木难成林,单独的KAN结构其实用处不大,KAN的牛逼之处在于扩展了深度网络,写成矩阵形式不再是MLP线性组合与激活的嵌套,而是激活 激活 再激活 

比如选择样条函数进行参数化学习,虽然学起来比线性模型更难,但是非线性表征能力大大提升,能用很少的节点实现更高的准确度,一个两层宽度为10的KAN网络求解偏微分方程比一个四层宽度为100的MLP效果还要好,KAN是这个MLP参数量的1%

3.为什么它有很好的准确性和可解释性

除了上述提到的结构上的优势还必须有好的训练算法,MLP通过增加网络宽度和深度提升性能,需要独立训练不同大小的模型,

而KAN提出了网格扩展技术,先粗后精,递进精调,无需重训就能实现模型精度的提升,

除此之外他还提出了新的网络结构自适应算法:在初始网络上通过稀疏化,剪枝,设定特定的激活函数,训练放射参数,符号化等步骤进行优化,大大提升了网络的可解释性让神经网络这个黑河训练的老大难问题得到了极大的缓解

例:求解f(x,y)=xy网络的结构如下图所示

x和y经过直线求和再二次函数对应x加y的平方,而二者直接二次函数激活对应x方和y方,过反斜杠直线相当于求差,简直就是所见即所得,这带来了两大好处,正着用算法可以实现数据内在模式的探索和发现,反着用能把世界模型和学科知识嵌入网络结构,让Sora这样的模型长上翅膀,实现对物理世界的真实模拟

4、当前的缺点和对AI领域的深远影响

官方的代码目前还非常的幼稚。跑起来比较慢,工程化尚且不足,此外数学层面上核心的K-A表示定理能否扩展到深层网络还有待论证,但瑕不掩瑜KAN的出现如同哥伦布发现了新大陆,对AI尤其是深度学习提供了更广阔的空间

对于3中的技术细节详见下一篇《KAN》论文笔记

### 使用自定义数据集进行神经网络训练 为了使用自定义的数据集进行卷积神经网络(CNN)的训练,可以遵循以下方法来准备和加载数据,并构建相应的模型。 #### 数据预处理与加载 对于特定地质样本分类的任务,如区分不同类型的岩石(膏岩、灰岩、灰质膏岩),需要先准备好标注好的图像文件夹结构。假设每种类别有自己的子目录,在这些子目录下放置对应类别的图片。接着创建一个继承`Dataset`类的新类用于读取并换成张量形式输入给CNN: ```python class RockDataset(Dataset): """Rock dataset.""" def __init__(self, root_dir, transform=None): """ Args: root_dir (string): Directory with all the images. transform (callable, optional): Optional transform to be applied on a sample. """ self.root_dir = root_dir self.transform = transform # 获取所有图片路径及其标签 self.image_paths = [] self.labels = [] for label in ['Anhydrite_rock', 'Limestone', 'GrayAnhydrite_rock']: path = os.path.join(root_dir, label) files = os.listdir(path) for file_name in files: img_path = os.path.join(path, file_name) self.image_paths.append(img_path) if label == "Anhydrite_rock": lbl = 0 elif label == "Limestone": lbl = 1 else: lbl = 2 self.labels.append(lbl) def __len__(self): return len(self.image_paths) def __getitem__(self, idx): image = Image.open(self.image_paths[idx]) if self.transform: image = self.transform(image) label = self.labels[idx] return {'image': image, 'label': label} ``` 此部分代码实现了从指定根目录读入各类别下的图像,并将其化为适合传递到深度学习框架中的格式[^1]。 #### 构建与配置模型 接下来定义所使用的卷积神经网络架构以及优化器设置等参数: ```python import torchvision.models as models model = models.resnet18(pretrained=True) num_ftrs = model.fc.in_features model.fc = nn.Linear(num_ftrs, 3) # 输出层调整为三分类问题 if torch.cuda.is_available(): device = torch.device('cuda') else: device = torch.device('cpu') criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(model.parameters(), lr=0.001) model.to(device=device) ``` 这里选择了ResNet-18作为基础模型,并针对具体应用场景修改了最后一层全连接层以适应新的输出维度需求;同时也设置了损失函数和优化算法[^2]。 #### 开始训练过程 最后编写循环迭代批次数据完成整个训练流程: ```python from tqdm import trange n_epochs = 10 batch_size = 128 for epoch in range(n_epochs): running_loss = 0.0 train_loader = DataLoader(RockDataset('./data/train/', transform), batch_size=batch_size, shuffle=True) progress_bar = trange(len(train_loader)) for i_batch, sample_batched in zip(progress_bar, train_loader): inputs = sample_batched['image'].to(device) labels = sample_batched['label'].to(device).long() optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() running_loss += loss.item() progress_bar.set_description(f'Epoch {epoch}/{n_epochs}, Loss: {running_loss/(i_batch+1)}') print('\nFinished Training.') ``` 上述代码展示了完整的训练周期内如何获取批量化的训练样例并通过反向传播更新权重的过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值