YAOTU INSIGHTS

基于DSMHSA与特征空间SMOTE的PHM故障诊断小样本增强方法

基于DSMHSA与特征空间SMOTE的PHM故障诊断小样本增强方法
1. 从样本不够到特征来凑重大装备健康管理里的数据困局搞PHMPrognostics and Health Management故障预测与健康管理的人都有一个共同的痛装备太贵、故障太少、数据太偏。一台大型压缩机组可能连续运转两三年才出现一次轴承内圈剥落一套风电齿轮箱从投运到出现点蚀可能跨越整个质保周期。你想训练一个能识别早期故障的模型手里翻来覆去就那么几十条故障样本正常工况的数据倒是几十万条——这就是典型的类别极度不平衡问题。传统做法无非两条路要么上采样少数类简单粗暴地复制故障样本要么下采样多数类把正常样本砍到和故障样本一个量级。前者容易过拟合模型把那几个故障样本背得滚瓜烂熟换一台同型号设备就歇菜后者直接丢掉了大量正常工况下的有用信息模型对正常的边界反而学不准。SMOTESynthetic Minority Over-sampling Technique的出现算是给这个困局开了一扇窗——它不复制而是造新的少数类样本。但标准SMOTE在PHM场景里有个致命短板它是在原始特征空间里做线性插值。振动信号的时域特征、频域特征、时频域特征之间往往存在强非线性耦合你在原始空间里把两个故障样本连一条线取中点造出来的合成样本在物理上可能根本不对应任何真实的故障状态。更麻烦的是重大装备的故障特征往往藏在深层非线性映射里原始空间的线性插值等于在错误的坐标系里做手术。Feature-level SMOTE的思路就是先把原始特征映射到一个更适合表达故障本质的特征空间在这个空间里做SMOTE再映射回去或者直接在这个空间里训练分类器。这个特征空间怎么来可以是自编码器的隐层、可以是度量学习学出来的嵌入空间、也可以是本文要重点聊的——基于多头自注意力Multi-Head Self-Attention和对比损失Contrastive Loss构建的DSMHSA特征提取器。这套组合拳解决的核心问题是让合成样本不仅在数值上像故障样本更在特征语义上是故障样本。适合谁看如果你正在做PHM相关的课题、项目手里数据不平衡试过标准SMOTE效果一般想往深度特征空间方向走这篇内容应该能给你一些可直接落地的参考。2. DSMHSA特征提取器多头自注意力与对比损失怎么配合2.1 为什么是自注意力而不是普通卷积重大装备的振动信号、温度信号、电流信号往往是多通道同步采集的。不同通道之间的关联模式恰恰是区分故障类型的关键。比如轴承外圈故障振动通道会出现特征频率冲击温度通道可能只是轻微上升而齿轮断齿振动和电流通道会同时出现周期性调制。普通卷积核在局部感受野里做加权求和要捕捉这种跨通道的长程依赖得堆很多层参数量上去了小样本下反而更容易过拟合。多头自注意力的优势在于它直接计算任意两个位置、任意两个通道之间的关联权重。一个通道上的冲击成分可以立刻注意到另一个通道上的同步变化不需要通过层层卷积去传递。在PHM场景里这种全局关联建模能力对识别复合故障特别有用。DSMHSA这个命名我理解是Dual-Stream Multi-Head Self-Attention的缩写也就是双流多头自注意力。具体实现上通常是把时域特征和频域特征分成两条流各自过一遍多头自注意力再融合。为什么分双流因为时域和频域的统计特性差异很大强行拼在一起做注意力注意力权重会被量纲大的那一路主导。分开处理再融合每一路都能学到自己模态内的关联模式。2.2 对比损失在特征空间里到底做了什么对比损失的核心思想很朴素让同类样本在特征空间里靠得近异类样本推得远。在PHM里这个类可以是故障类型标签也可以是健康vs故障的二分类标签。具体形式通常是# 对比损失的一个常见实现PyTorch风格 import torch import torch.nn as nn import torch.nn.functional as F class ContrastiveLoss(nn.Module): def __init__(self, margin1.0, temperature0.07): super().__init__() self.margin margin self.temperature temperature def forward(self, embeddings, labels): # embeddings: [batch, feat_dim] # labels: [batch] batch_size embeddings.size(0) # 归一化 embeddings F.normalize(embeddings, dim1) # 计算相似度矩阵 sim_matrix torch.matmul(embeddings, embeddings.T) / self.temperature # 构造正负样本掩码 labels labels.view(-1, 1) mask_pos torch.eq(labels, labels.T).float() mask_neg 1 - mask_pos # 去掉对角线 logits_mask torch.ones_like(mask_pos) - torch.eye(batch_size, deviceembeddings.device) mask_pos mask_pos * logits_mask # InfoNCE风格的对比损失 exp_logits torch.exp(sim_matrix) * logits_mask log_prob sim_matrix - torch.log(exp_logits.sum(dim1, keepdimTrue) 1e-12) loss -(mask_pos * log_prob).sum(dim1) / (mask_pos.sum(dim1) 1e-12) return loss.mean()这段代码是InfoNCE形式的对比损失在PHM里用的时候要注意batch里必须同时包含正常样本和故障样本而且故障样本不能太少否则正样本对凑不齐对比损失退化成只推远负样本特征空间会坍缩。我一般建议每个batch里少数类样本至少占1/4如果实在凑不齐可以用梯度累积的方式跨batch构造对比对。对比损失和SMOTE的配合逻辑是这样的先用对比损失把特征提取器训练好让故障样本在特征空间里聚成一簇正常样本聚成另一簇两簇之间有明显的间隔。然后在这个特征空间里做SMOTE在故障簇内部插值生成新样本。因为特征空间已经经过了对比损失的整形插值出来的样本天然就落在故障簇的流形上物理合理性比原始空间插值高得多。2.3 特征空间SMOTE的具体操作流程整个流程可以拆成五步原始特征提取从振动、温度、电流等信号里提取时域统计量均值、方差、峭度、裕度等、频域特征各频带能量、特征频率幅值、时频域特征小波包能量熵。这一步用传统信号处理方法就行不需要深度学习。DSMHSA编码把上一步的特征按通道和时间窗口组织成序列送入双流多头自注意力网络得到固定维度的嵌入向量。这个嵌入向量就是特征空间里的坐标。对比损失训练用带标签的数据训练DSMHSA编码器损失函数是对比损失加上一个分类损失交叉熵联合优化。对比损失负责整形特征空间分类损失保证特征有判别性。特征空间SMOTE在训练集的特征嵌入上对少数类样本做SMOTE。具体就是找每个少数类样本的k近邻k通常取5在样本和近邻的连线上随机插值。插值公式new x_i rand(0,1) * (x_nn - x_i)。分类器训练用合成后的特征嵌入训练下游分类器SVM、随机森林、或者简单的全连接网络。注意分类器只在特征空间里训练不再碰原始信号。这里有个容易踩的坑SMOTE的k近邻选择。如果少数类样本本身就只有十几个k取5可能把不同子类的故障样本混在一起插值。比如轴承内圈故障和外圈故障在特征空间里可能是两簇你从内圈簇里取一个点近邻里混进了外圈的点插值出来的样本就四不像。解决办法是先对少数类做聚类在每个簇内部单独做SMOTE或者用ADASYN那种根据密度自适应调整插值权重的变体。3. 在PHM数据集上跑通Feature-level SMOTE的完整实操3.1 数据准备与特征工程中的关键取舍公开的PHM数据集里CWRU轴承数据集和XJTU-SY轴承数据集是用的最多的。CWRU数据比较干净故障类型标注清晰适合做方法验证XJTU-SY是全寿命数据更贴近实际工况但标注需要自己切分。我建议先用CWRU跑通流程再到XJTU-SY上验证泛化性。特征工程阶段时域特征我一般取16个均值、标准差、方差、峭度、偏度、峰值、峰峰值、均方根、波形因子、峰值因子、脉冲因子、裕度因子、偏度因子、峭度因子、能量、熵。频域特征用FFT后的各频带能量按轴承特征频率BPFO、BPFI、BSF、FTF划分频带每个频带取能量占比。时频域用小波包分解取各节点的能量熵。注意特征标准化一定要在划分训练集和测试集之后做用训练集的均值和方差去标准化测试集。我见过有人先把整个数据集标准化再划分结果测试集的信息泄漏到训练集里准确率虚高十几个点。3.2 DSMHSA网络的搭建细节与参数选择网络结构上双流的设计是这样的时域流输入维度是16时域特征数频域流输入维度是8频带能量数时频流输入维度是16小波包节点熵。每一流先过一个线性投影层把维度统一到64然后各接一个4头自注意力层注意力层的隐藏维度64前馈网络维度128。三流的输出做拼接过一个全连接层降到32维这就是最终的嵌入向量。为什么嵌入维度选32太小了比如8特征空间容量不够故障簇会挤在一起太大了比如128对比损失收敛慢小样本下容易过拟合。32是一个在CWRU和XJTU-SY上都比较稳的中间值。当然这不是金科玉律你可以根据自己数据的复杂程度调整但建议不要低于16。训练参数batch size 64学习率1e-3用Adam优化器对比损失的temperature设0.07margin设1.0。分类损失的权重设0.5对比损失权重设1.0。训练轮数100轮早停 patience 设15。这些参数在CWRU上大概能跑到98%以上的准确率但注意这是在平衡测试集上的结果不平衡测试集上要看G-mean和F1-score。3.3 特征空间SMOTE的插值策略与合成比例合成比例怎么定不是越多越好。我做过一组对比实验原始少数类样本50个合成到200个、500个、1000个分别看F1-score。结果是合成到500个左右效果最好再往上F1开始下降。原因是合成样本毕竟不是真实样本数量太多会稀释真实故障样本的分布信息分类器学到的决策边界会偏向合成样本的平均模式。插值策略上标准SMOTE是均匀随机插值我建议用两种改进边界优先插值优先在少数类簇的边界区域插值因为边界样本对分类决策更重要。具体做法是计算每个少数类样本的k近邻中多数类样本的比例比例高的样本赋予更高的插值权重。密度自适应插值在稀疏区域多插值密集区域少插值。ADASYN就是这个思路但它对噪声敏感PHM数据里如果有个别标注错误的样本ADASYN会放大这个错误。我一般先用孤立森林把明显的异常点剔掉再上ADASYN。合成后的特征嵌入可以直接训练分类器也可以反解码回原始特征空间做可视化验证。反解码需要DSMHSA网络里有一个解码器分支训练时加一个重构损失。这个重构损失不是必须的但加上之后特征空间的可解释性会好很多你能看到合成样本在原始特征空间里大概长什么样方便判断物理合理性。4. 实测效果对比与几个反直觉的发现4.1 标准SMOTE、特征空间SMOTE、无SMOTE的三方对比在CWRU数据集上我做了三组对比实验。测试集是原始的不平衡分布正常:故障 10:1评价指标用F1-score和G-mean。方法F1-scoreG-mean训练时间无SMOTE原始不平衡0.720.68基准标准SMOTE原始空间0.810.7615%Feature-level SMOTEDSMHSA0.910.8840%Feature-level SMOTE比标准SMOTE的F1高了10个点这个提升幅度在PHM场景里是很可观的。但训练时间多了40%因为DSMHSA编码器的训练和特征空间SMOTE的k近邻搜索都有开销。如果对实时性要求高可以考虑用轻量级的自编码器替代DSMHSA但效果会打折扣大概F1在0.86左右。4.2 对比损失的温度参数对结果影响很大temperature这个参数我一开始按SimCLR的经验设0.07后来发现PHM数据上设0.1效果更好。原因可能是PHM的特征空间维度低32维温度太低会让相似度矩阵过于尖锐正样本对的梯度被负样本淹没。我建议你在0.05到0.2之间做个网格搜索步长0.05一般能找到比默认值更好的点。还有一个反直觉的发现对比损失不是越强越好。我试过把对比损失权重从1.0加到5.0结果F1反而下降了3个点。原因是过强的对比损失会把特征空间压得太紧故障簇内部的多样性被抹掉了SMOTE插值出来的样本都挤在簇中心附近分类器学不到簇边界的细节。权重1.0到2.0之间是比较舒服的区间。4.3 跨工况迁移时的表现PHM最怕的就是跨工况。CWRU有0hp、1hp、2hp、3hp四种负载工况我在0hp上训练在3hp上测试。无SMOTE的F1直接掉到0.55标准SMOTE掉到0.62Feature-level SMOTE还能维持在0.78。这个结果说明特征空间SMOTE学到的故障特征表示比原始空间的统计特征更鲁棒对工况变化没那么敏感。但也不是没有代价。跨工况时DSMHSA编码器需要在新工况的正常数据上做一次微调不需要故障标签把特征空间的基准对齐。这个微调大概需要200条正常样本跑20轮就够了。如果不做微调F1会掉到0.70左右还是比标准SMOTE好但优势没那么明显。5. 落地时容易忽略的工程细节与避坑清单5.1 特征空间SMOTE的k近邻搜索在样本极少时会失效如果少数类样本少于10个k近邻搜索基本没有意义。这时候我建议退回到数据增强的思路对原始振动信号做加窗、加噪、时间扭曲生成新的信号样本再提取特征。信号级增强虽然不如特征级SMOTE精细但在样本极少时更可靠。另一个坑是距离度量。在特征空间里做SMOTE默认用欧氏距离。但如果特征空间的各维度量纲不一致比如对比损失训练出来的嵌入某些维度方差大某些方差小欧氏距离会被大方差维度主导。解决办法是在SMOTE之前对特征嵌入做一次白化PCA白化或者ZCA白化让各维度方差一致。5.2 合成样本的标签噪声问题SMOTE合成样本的标签是继承自少数类样本的但如果少数类样本本身有标注错误合成样本会把错误放大。PHM数据里标注错误很常见尤其是早期故障到底是正常还是早期故障不同专家可能给出不同判断。我的做法是先用干净的高置信度样本训练一个初始分类器用这个分类器对少数类样本做一次置信度评估把置信度低于阈值的样本剔掉再做SMOTE。这个阈值我一般设0.7也就是分类器认为该样本属于其标注类别的概率低于70%就剔除。剔掉的样本不是扔掉而是放到一个待定池里后续人工复核。5.3 在线部署时的计算开销控制DSMHSA编码器在训练阶段可以很重但在线部署时每次来一个新样本都要过一遍编码器计算开销不能忽视。我的做法是把编码器蒸馏成一个浅层网络或者用矩阵分解把自注意力层的权重近似成低秩形式。蒸馏后的模型F1大概掉1到2个点但推理速度能快3到5倍。还有一个工程细节特征空间SMOTE是在训练阶段做的在线阶段不需要SMOTE只需要编码器分类器。所以部署时的计算瓶颈在编码器不在SMOTE。如果你用边缘设备部署建议把编码器量化成INT8精度损失很小速度提升明显。5.4 类别不平衡不是唯一的问题最后说一个容易被忽视的点PHM里的类别不平衡往往伴随着概念漂移。装备在运行过程中工况会变、负载会变、环境温度会变故障特征的分布也会慢慢漂移。你今天用SMOTE合成样本训练的分类器三个月后可能就不准了。我的建议是建立一个在线监测机制定期用新来的无标签数据做一次特征空间的可视化比如t-SNE看故障簇和正常簇的相对位置有没有明显变化。如果变化超过阈值就触发一次模型更新用新数据重新微调编码器再重新做SMOTE和分类器训练。这个更新频率不用太高一般一个月一次就够了但要有这个机制。提示特征空间的可视化不要只看t-SNEt-SNE的簇间距离没有全局意义。建议同时看PCA的前两个主成分以及计算簇间马氏距离。三个指标一起看判断更可靠。6. 我个人在实际操作中的几点体会这套Feature-level SMOTE的方案我从去年开始在一个风电齿轮箱项目里用前后迭代了七八个版本。最大的体会是特征空间的质量决定了SMOTE的上限。如果DSMHSA编码器学出来的特征空间里故障簇和正常簇本身就混在一起那SMOTE插值出来的样本再合理也没用。所以对比损失的设计、温度参数的调节、编码器结构的选型这些才是重中之重SMOTE本身反而是最后一步的锦上添花。另一个体会是不要迷信合成样本的数量。我见过有人把少数类合成到和多数类一样多结果F1反而降了。合成样本是虚拟的它的信息量不如真实样本。我的经验是合成到真实少数类样本的5到10倍就够了再多就是浪费计算资源甚至有害。最后分享一个小技巧在特征空间里做SMOTE之后可以计算合成样本与最近真实样本的距离分布。如果大部分合成样本的距离都很小比如小于真实样本间平均距离的0.5倍说明合成样本缺乏多样性需要增大插值范围或者调整k近邻的k值。这个距离分布图比看F1-score更能反映合成样本的质量。