资讯动态

面向边缘部署的自适应多尺度小波编码脉冲神经网络故障诊断方法

发布时间:2026/10/20 2:37:42 来源:尧图企业网站定制
1. 项目背景与技术选型思路1.1 为什么把脉冲神经网络搬进故障诊断做机械故障诊断的同行应该都有同感这几年深度学习方案在轴承、齿轮箱、转子这类旋转机械的状态识别上已经烂大街了。CNN加几个卷积池化堆出一个分类器就能在绝大多数公开故障数据集上刷到99%的准确率。但问题也随之而来传统人工神经网络在算力换精度的路上越走越远模型参数量动辄几十兆推理时还要读整个浮点权重部署到嵌入式传感器节点或者工业边缘设备上功耗和延迟都撑不住。我去年接了一个工业现场的边缘诊断需求现场只能提供一块低功耗板卡卡上资源少得可怜普通CNN跑起来风扇狂转、温度报警这才下定决心彻底换一条技术路线。脉冲神经网络SNN恰好是冲着这个痛点来的。它模仿生物神经元的工作方式信息不是连续的浮点数而是稀疏的离散脉冲序列。SNN里面每个神经元只有发放和不发放两种状态乘法运算可以被替换成累加运算模型推理时功耗极低这种事件驱动特性天然适合边缘部署。我在某实验平台上做过一次粗测同样的特征提取网络结构SNN在能效比上比同规模CNN高出一个数量级。但SNN的短板也很明显传统脉冲神经元的前向传播不可微直接套用BP算法训练不起来。直到近几年替代梯度法Surrogate Gradient流行起来才让SNN真正具备了大模型训练的可能性。可是SNN直接拿来处理机械故障振动信号还有一个隐蔽的适配问题。机械振动信号是非平稳、非线性的故障冲击往往出现在特定频带的某个时间点附近需要同时捕捉时域和频域的信息。传统SNN的输入通常是一段时域波形或者简单地把它当作一个图像任务去处理要么丢失频率特征要么把瞬时冲击信息抹平了。单纯堆叠脉冲卷积层效果反而不如成熟的CNN方案。所以我在想能不能在SNN的输入端加一层专门用于频域感知的小波编码结构用多尺度小波核对原始振动信号做特征预处理把时频信息先翻译成SNN更容易理解的脉冲编码这个想法就是整个项目的最初出发点。1.2 小波核编码与自适应多尺度到底解决了什么问题机械故障诊断领域有个非常经典的处理方法——小波变换。小波变换相比短时傅里叶变换最大的优势在于它的时频窗口是可变的低频部分用更宽的窗口获得较好的频率分辨率高频部分用更窄的窗口获得较好的时间分辨率。这对轴承故障信号来说很关键因为故障冲击通常表现为高频振荡成分叠加在低频旋转谐波上一次性把两者的特征都提取出来传统的固定分辨率变换很难做到。传统做法是把振动信号做连续小波变换CWT生成一张时频图然后把这张图喂给CNN或SNN分类。这么做的问题在于信号经过变换后再作为输入中间多了一步离线预处理时频图的尺度和分辨率是固定的模型没法针对具体工况自适应调整。不同转速、不同负载下故障特征频率会发生偏移固定尺度的小波基就失效了。针对这个情况我引入了多尺度小波核编码的设计思路。所谓多尺度就是并排放置多条不同尺度的小波卷积核通道让每条通道专注于不同频率范围内的特征提取。有的通道用宽基核抓取低频趋势有的通道用窄基核抓取高频冲击。这些小波核的初始参数由小波基函数解析式计算出来但训练过程中允许通过梯度更新调整。其中还有一个自适应的关键点尺度参数并不是一开始就锁死的而是作为一个可学习参数参与反向传播让模型在训练过程中自己寻找当前工况下最合适的时频分辨率组合。这比手工调参要可靠得多因为实际工业现场工况千变万化离线调好的参数换个设备往往就失效了。1.3 注意力增强模块在脉冲网络里承担的角色小波核编码把时频特征提取出来了但是SNN主干的特征表达能力还不够。原因在于脉冲信号的稀疏性一个脉冲神经元在一个时间窗口内只发放几次脉冲信息承载量有限。如果在网络中间某些层模型能自动对关键频带或关键时间点的脉冲特征赋予更高的权重诊断精度会有一个很明显的提升。这就是注意力增强模块设计的动机。注意力机制在Transformer里玩得风生水起但直接把它搬到SNN里会遇到一个麻烦标准注意力对输入做Softmax归一化这会产生一个稠密的实数权重矩阵和SNN稀疏、非负的脉冲表示在语义上不对齐。如果生硬地乘上去等于重新引入了浮点乘法运算SNN的能效优势就打了折扣。所以我采用了一种更易嵌入脉冲结构的注意力设计把注意力权重理解为脉冲特征的发放阈值调制或通道调制因子。在需要重点关注的通道上适当调低神经元发放阈值或放大输入强度让这些通道更容易产生脉冲在无关通道上提升发放阈值抑制无效脉冲。这样既保留了注意力增强的效果又不破坏SNN的事件驱动特性。1.4 技术栈为什么选Pytorch全栈搭建脉冲神经网络的训练生态目前还不算成熟很多专门框架存在两个问题一是文档不够完整遇到问题改起来费劲二是和工业界的部署链路不兼容。Pytorch的生态优势很明显社区量大自定义算子方便TorchScript和ONNX导出链路成熟。更重要的是Pytorch可以很方便地实现替代梯度训练只需要在反向传播过程中用一个代理函数替换脉冲函数的梯度即可其他部分完全复用Pytorch的自动求导机制。这个项目里从信号编码到SNN主干再到注意力模块全部基于Pytorch实现没有依赖任何第三方SNN框架这样移植和调试起来反而最顺手。2. 核心模块设计与实现2.1 振动信号的小波核编码从原始时域波形到多通道张量小波核编码模块放在整个网络最前端输入是原始振动信号片段。假设我们采集了一个长度为1024点的一维振动信号由于机械信号通常包含较强的噪声干扰输入之前要做一次轻量级的归一化把幅值压缩到0到1之间避免不同测点、不同传感器灵敏度带来的幅值差异干扰模型训练。编码模块的核心是几个不同尺度的小波卷积核分支。每个分支的卷积核由小波基函数离散化后初始化。小波基函数选择Morlet小波因为它在时频局部性上表现稳定对振动冲击信号的匹配度也最高。Morlet小波的数学形式是复指数乘以高斯包络但实际做卷积核通常只取实部否则输出带有虚部处理起来徒增复杂度。每个分支的小波卷积核可以写成如下离散形式kernel[n] A * exp(-0.5 * ((n - center) / scale)^2) * cos(freq * (n - center))其中scale和freq是当前分支对应的尺度参数和中心频率参数A是归一化系数。这看起来像一个带通滤波器组但它和普通FIR滤波器的区别在于卷积核参数在整个训练过程中会通过梯度不断更新尺度参数和频率参数都被纳入学习范围。这就是自适应在编码层的具体体现。多尺度分支数量的选择上我经过反复尝试最终采用了8条分支。少于4条分支时高频细节提取不足多于16条分支时信息冗余明显且训练时间大幅上升。8条分支的中心频率从低到高等间隔分布覆盖了轴承故障诊断中常见的特征频带范围。每条分支输出一个128维的特征向量把8条分支拼接起来就得到了一个8通道的编码特征图后续将这个特征图作为脉冲编码层的输入。实际实现中有一个细节值得特别注意小波卷积核的初始化参数不能随机化必须严格按照小波基函数的解析式计算出来。如果随机初始化前期梯度信号混乱模型很难收敛到有物理意义的时频特征。我第一次实现时图省事用了均匀分布的随机初始化训练了二三十轮后准确率始终在50%左右徘徊换回小波解析初始化后同样的训练轮数直接跳到90%以上。这个对比非常直观。2.2 脉冲神经元与替代梯度训练机制脉冲神经元是整个SNN主干的基石。这里采用的是最常用的泄漏积分发放神经元LIFLeaky Integrate-and-Fire。LIF神经元的状态可以通俗地理解为一个小水桶输入信号像水流一样不断注入水桶水桶底部有个小孔水会不断流失当水位达到阈值时水桶就会溢出发放一个脉冲然后重置水位。这个漏水的特性让神经元具备时间记忆能力对序列信号的处理效果天然要优于传统神经元的逐点映射。离散时间步长的LIF神经元更新公式可以简化为membrane[t] decay * membrane[t-1] input[t] if membrane[t] threshold: spike[t] 1, membrane[t] 0 else: spike[t] 0其中decay是膜电位衰减系数阈值通常设为1.0。这个公式看起来简单实际训练时最棘手的问题是脉冲发放函数的阶梯特性导致梯度几乎处处为零。处理方式是用替代梯度前向传播时仍然根据膜电位是否达到阈值来决定脉冲是否发放但反向传播时用一个平滑的代理函数来计算梯度最常见的代理函数是Sigmoid曲线或Fast Sigmoid曲线。这样就绕过了不可微的障碍让整个网络能正常使用反向传播训练。替代梯度的选择直接决定训练稳定性。我实验过几种不同的替代函数最终选定的是带宽度参数的可调Sigmoid。宽度参数太大梯度过于平缓训练速度慢宽度参数太小梯度集中在阈值附近训练时数值震荡明显。把这个宽度参数固定在0.5左右整个训练过程就非常平滑了。还有一个细节是膜电位衰减系数decay的取值它控制了神经元的时间窗口长度decay越小神经元对历史信息的记忆越短对高频冲击更敏感。针对振动信号这类瞬态冲击明显的输入decay取0.25附近效果最好既保留了时间上下文又不会让之前的噪声积累影响后续判断。2.3 注意力增强模块在脉冲域中谨慎操作注意力增强模块插在SNN主干的最后几层之间目标是让网络学会关注差异最大的特征成分。我在整个网络里一共用了两个注意力模块一个放在时频编码层之后用于对8条小波分支的通道进行重要性加权另一个放在SNN主干最后一层之前用于对高层语义特征做通道间调制。第一个注意力模块比较简单采用的是类似SENet的压缩-激励结构。具体做法是把编码层的输出特征先做全局平均池化得到一个通道描述向量然后经过两个全连接层得到每个通道的权重系数最后和原特征相乘。但这个模块输入的是多尺度特征图不是脉冲序列所以可以直接用标准注意力机制。这个问题不值得避讳因为注意力模块计算量占比很小对整体能效损耗可以忽略。第二个注意力模块就要小心了它的输入是脉冲特征图标准的浮点注意力操作在这里不太合适。我采用的方式是阈值调制把SE模块得到的通道权重映射到一个衰减系数或增益系数上然后作用到下一层LIF神经元的发放阈值上。简单来说重要性越高的通道下一层神经元发放阈值设得越低同样的输入强度更容易发放脉冲不重要通道阈值调高脉冲发放密度下降。这样一来注意力增强效果体现在脉冲发放的时序模式上没有引入额外的稠密浮点乘法。实验中我对比了直接乘法和阈值调制两种方案阈值调制的验证集准确率略低0.3%左右但推理速度提升了差不多15%功耗表现也更好。考虑到SNN的核心优势是低功耗这个取舍是划算的。2.4 整体网络结构设计整个网络从输入到输出的完整流水线可以拆成如下几段第一段一维小波卷积编码层8条多尺度分支每条分支输出128维特征。第二段通道注意力模块一由全局池化加两个全连接层组成。第三段脉冲卷积模块两层脉冲卷积加池化每层使用LIF神经元。脉冲卷积的卷积核尺寸设为7步长为1输出通道数依次为32和64。第四段注意力增强模块二阈值调制方式对最后一个脉冲卷积层的输出做通道重要性加权。第五段全局平均池化和全连接分类头输出对应故障类别的脉冲计数分布。脉冲卷积模块里有两个容易被忽略的细节。第一是时间步的维度处理一个输入样本在SNN里不是一次性过完的它会被拆成T个时间步依次送入网络T通常取8到16。在Pytorch里实现时常见的做法是先把输入张量的形状重排为[B, T, C, L]然后在循环里逐个时间步计算膜电位更新。第二是复位方式LIF神经元触发脉冲后的复位有两种方式——硬复位和软复位。硬复位直接把膜电位清零软复位则先减去阈值再保留剩余部分。机械振动信号中故障冲击往往连续出现软复位能保留一部分累积信息实际诊断效果比硬复位好所以这里选了软复位。分类头不对脉冲序列直接做Softmax而是对T个时间步的输出脉冲次数做累加再进入Softmax这样可以稳定地输出类别概率。3. 训练流程与核心配置细节3.1 数据准备与故障样本增强策略训练用了一个公开可获取的轴承故障模拟数据集包含滚动体故障、内圈故障、外圈故障、正常状态共四类。采样频率设为25.6kHz每个样本截取1024个采样点对应大约40毫秒的振动信号。这个时间窗口长度不是随手定的轴承的故障特征频率通常在几十赫兹到几百赫兹之间40毫秒窗口至少能包含若干个完整的故障冲击周期不会因为窗口太短丢失关键特征。数据预处理方面我严格控制了一个原则训练集和测试集的样本不能来自同一段连续信号。如果随机切分相邻样本之间的重叠太多会造成严重的数据泄漏测试准确率高得没有参考价值。正确做法是先把原始长信号划分成互不重叠的若干段然后按一定比例分别归入训练集和测试集确保两个集合中的样本来源完全不交叉。样本增强方面我主要用了三种手段一是对原始振动信号添加不同强度的随机噪声噪声强度控制在使信噪比不低于3dB的范围二是对样本做随机小幅度的时序偏移模拟故障冲击在窗口内的位置变化三是对训练集做分频段幅度扰动模拟不同负载下振动幅值的差异。增强后的训练集样本量约为原始数据的6倍模型对噪声和工况变化的鲁棒性明显提升测试集准确率提升了约3个百分点。但如果把增强强度调得过大比如信噪比降到1dB以下模型特征学习就会受到干扰反而掉点这里要掌握好度。3.2 超参数设置与优化器选择训练配置的核心参数如下表所示这些都是我反复实验后找到的一个比较稳妥的平衡点参数项设置值备注时间步长 T8实验范围4~168步效果和16步接近速度翻倍学习率1e-3用余弦退火调度从1e-3衰减到1e-5批量大小64显存占用适中优化器AdamW在SNN上比冲量SGD收敛更稳定权重衰减1e-4抑制脉冲噪声导致的权重震荡训练轮数100大约40轮后准确率趋于平稳替代梯度宽度0.5Sigmoid代理函数中控制梯度平滑性特别说一下学习率调度的选择。SNN训练比CNN更容易出现梯度震荡因为脉冲神经元的膜电位更新带有阈值判定梯度信号天然不平稳。如果使用固定学习率后期模型的准确率会在训练过程中反复抖动换用余弦退火调度后前期学习率较高网络能快速找到有效特征区域后期低学习率平滑收敛到极小值整个训练过程明显稳定下来。另外AdamW是最稳健的选择比SGD冲量在收敛速度上快不少比普通Adam多了权重衰减解耦处理正则化效果更干净。3.3 性能验证与CNN基线方案的对比为了检验这套SNN方案的真实水平我搭了一个结构相似的CNN基线模型卷积层参数数量与SNN主干基本对齐两者的可训练参数量均控制在2M左右。在同样训练集和测试集划分下CNN基线的测试准确率达到了97.6%SNN方案达到了96.2%。准确率差距只有1.4个百分点考虑到SNN模型使用二进制脉冲信息传递这个差距完全可以接受。在某些特定故障类型上比如内圈故障和滚动体故障两者准确率几乎没有差异。原因在于内圈和滚动体故障的特征频率较高多尺度小波核编码对高频成分的捕获能力相对更强弥补了SNN信息表达能力上的不足。参数量和推理延迟是一个更值得关注的方向。在CPU上对比单批推理100个样本的延迟SNN在8个时间步条件下的推理时间是CNN方案的0.88倍。主要瓶颈在于LIF神经元的时间步循环无法完全并行。在GPU上SNN的优势会被放大到接近CNN的1.5倍在嵌入式低功耗设备上SNN的能效优势就更为显著了这正是SNN最大的价值点。所以这套方案不适合宣称精度全面超越CNN但可以说在精度损失可控的前提下获得了显著的低功耗优势让边缘诊断从可做变成了做得好。4. 踩坑记录与优化心得4.1 脉冲网络训练的梯度泄漏与死亡神经元初次训练SNN时遇到一个很典型的坑训练到某个轮次后几乎全部神经元的脉冲发放率突然降为0网络输出变成固定值准确率直接崩盘。排查后发现这是因为脉冲神经元在训练过程中发放率太高远超预期阈值膜电位频繁重置导致梯度在多个时间步反向传播时出现严重泄漏最终所有神经元被推入持续发放的饱和区替代梯度函数输出的梯度趋近于零形成了不可恢复的死亡状态。解决办法分三步一是把LIF神经元的阈值从一个固定的1.0改成了可学习的参数让每个通道的神经元自适应调整敏感度二是对膜电位初始化做了约束确保初始膜电位在一个较低的范围内避免进入立即发放的饱和区三是在训练过程中监控每一层神经元的平均发放率当发现某层发放率超过0.8就对模型训练进行干预将发放率通过权重衰减方式拉回正常区间。在0.4到0.6这一中间区间观察的稳定性最好。这些措施的叠加让整个训练过程的鲁棒性大幅提升。4.2 小波核参数更新中的尺度漂移问题自适应多尺度小波核编码有一个训练过程中极易出现的隐患尺度参数在梯度更新下会向某个方向极端漂移导致部分通道的小波核完全失去带通滤波特性。有一次训练后我检查了所有通道的小波核参数发现其中三个通道的尺度参数变得极大小波核几乎退化成了纯直流滤波器对应的有效频率范围完全偏离了机械信号的特征频带。原因在于梯度方向对小波核的参数敏感性不一致频率较高的通道梯度噪声更大容易在训练中被带偏。解决思路有两个方向。第一种做法是在loss中加入对小波核参数的正则约束限制离散度这种方法稳定但是增加了超参数。另一种是我实际采用的更直接做法在训练过程中对尺度参数做投影操作每个训练步结束后把参数投影到一个预设的物理合理区间内。比如中心频率参数限制在25Hz到6000Hz之间尺度参数限制在5到50之间。这种做法相当于是给参数更新加了一个物理边界锚波内核始终保持带通属性训练稳定性和可解释性都得到了提升。4.3 注意力模块在脉冲域中的失效场景注意力增强模块不是任何时候都有效的。我在一次实验中把注意力模块加在脉冲卷积层之后去掉了阈值调制直接改用浮点乘法结果因为脉冲特征图的稀疏性导致大部分通道乘积结果为0。注意力权重的作用面过窄几乎覆盖不到有效信息准确率不升反降。后来我调整了注意力模块的插入位置把它放在脉冲卷积层之前也就是特征还未经过脉冲编码的阶段效果立刻改善了很多。但前文的最终网络结构里我把第二个注意力模块仍然放在了脉冲层之后原因是那里需要处理的是高层语义特征的通道重要性。为了让这个模块真正起作用我对脉冲特征图做了一步处理不直接在原始脉冲序列上计算注意力权重而是先对脉冲特征做时间维度的均值池化得到每个通道的发放频率估计再基于这个频率估计计算注意力权重。这样注意力计算不受单脉冲稀疏性的干扰各通道的权重也能稳定区分整个模块才算真正在脉冲域中落地。4.4 时间步长的取舍与推理速度优化时间步长T是SNN里一个牵一发动全身的参数。T太小神经元没有足够的时间积累膜电位时域特征表达不充分T太大推理时循环次数增多延迟成倍上升。我做了实验T等于4时准确率勉强达到88%T等于8时准确率到96%T等于16时准确率到96.6%左右但推理时间是T等于8时的2倍。从工程交付的角度看T等于8是性价比最优的选择。推理速度还能从另一条路径上优化时间步方向上存在冗余计算很多脉冲层的输出在连续时间步中是相同或接近的可以用提前发放终止的判断策略。具体做法是每个LIF神经元在连续三个时间步内都没有发放脉冲时后续时间步跳过该神经元的计算。这个策略在负载较低、故障不明显的工况下收益明显实际推理中能减少30%左右的计算量代价是准确率下降不到0.5%。因为在振动信号中不是每个时间步都包含故障冲击大量时间步确实可以跳过工程上值得一试。5. 部署经验与后续扩展思路5.1 模型导出与嵌入式设备部署的实际路径训练好的SNN模型要落地第一步是完成Pytorch模型到嵌入式推理框架的转换。因为SNN的特殊性常规的ONNX导出流程会遇到不少兼容性问题比如时间步循环在ONNX中会被展开成静态图导致动态计算图结构变得庞大。我的做法是把SNN做成一个静态展开的结构将时间步循环手动展开成多个并行的子模块然后通过ONNX导出。文件名不会暴露出具体业务内容用统一编号管理。部署端的另一个关键点是量化。SNN的脉冲可以用单比特表示这是SNN相对于传统CNN最大的量化优势。脉冲特征图在嵌入式设备上可以存储为位图每个脉冲用一个位来表示内存占用降低32倍。膜电位等连续状态量则根据取值范围量化到int8或int16。实测量化后诊断准确率几乎没有下降推理时延反而进一步降低因为逐位的操作在边缘计算单元上效率极高。5.2 这套思路还可以向哪些方向延伸机械故障诊断只是这套技术架构的第一个应用场景。从更普适的视角来看自适应多尺度小波核编码 注意力增强 SNN这条流水线本质上是处理非平稳信号分类任务的通用框架。类似的如电机定子电流分析、齿轮箱润滑状态监测、液压系统压力波形诊断等工业场景都可以按同样的思路构建模型只需要把输入信号的采样率和窗口长度调整到对应工况即可。另一个值得探索的方向是在线学习与增量诊断。SNN的事件驱动特性天然适合在线流式数据处理。传统CNN处理流式数据时往往需要固定窗口的缓冲和重计算而SNN可以直接在时间轴上不断累积膜电位和发放脉冲状态是增量更新的。基于这个特性后续可以把模型改造为在线诊断模式信号不断流入模型不断输出当前时刻的故障概率现场设备不重启不重训练就能持续监测。这套方案在当前品种越来越多、换产越来越快的产线场景里价值会进一步提升。5.3 项目维护与迭代中的几点实际体会最后分享几个实际项目维护中的感悟。首先小波核初始化决定了模型训练的天花板训练时就算允许参数自适应更新初始的物理意义仍要严谨对待。我建议准备一套单独的工具脚本训练前先对小波核的频率响应做可视化观察每个通道的带通范围是否符合预期再启动训练。这一步虽然耗时不多但能避免不少无效训练尝试。其次注意力模块不是加得越多越好。在脉冲网络中每个额外模块都会引入更多可训练参数和更复杂的梯度流。我在早期的一次设计方案里嵌入三个注意力模块最终性能不升反降。后来回退为两个效果反而明显好了。设计注意力模块时要克制要围绕解决一个问题来加不是为了跟随潮流堆砌。最后一点关于模型对比的公平性问题。很多论文里的SNN准确率是用了各种数据增强和时间编码技巧刷出来的和CNN单次前向推理并不在同一条件下假设。我在做方案宣传和内部汇报的时候始终要求所有模型都按照同一套数据处理流程和同一套评测口径来对比只有这样的对比结果才具有工程参考价值不然对比得再好看上线部署后也会出问题。如果你也在尝试用SNN做工业信号处理建议把第一个目标放在小波编码层SNN主干这个最小可行版本上先把精度和稳定性跑通再逐步加入注意力机制和优化技巧。一步到位往往让人在调试各种不可预知的问题时非常被动。踩过足够多的坑之后你会发现SNN在工业诊断这类对低功耗、强实时性有硬需求场景里的独特价值是非常值得投入的。

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

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

免费获取报价 →
↑