news 2026/10/8 10:33:02

Deep Attention SMOTE:工业时序异常检测中的可学习数据增强方法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Deep Attention SMOTE:工业时序异常检测中的可学习数据增强方法

工业设备预测性维护里最让人头疼的场景,不是模型不够深,而是异常样本少得可怜。一台风机跑三个月,轴承故障可能只出现两次,每次持续几分钟,切出来的窗口样本撑死几十条,而正常工况的样本轻松上万。这种极端不平衡下,任何分类器都会倾向于"全判正常",准确率看着漂亮,召回率惨不忍睹。SMOTE 这类经典过采样方法在图像或通用表格数据上还算能用,但直接搬到工业时序上,插值出来的"合成异常"往往违背了时间维度的物理连续性,反而把决策边界搅乱。Deep Attention SMOTE 想解决的就是这件事:让数据增强本身变成一个可学习的、带注意力机制的过程,而不是在原始特征空间里盲目做线性插值。

1. 工业时序异常检测为什么让传统SMOTE失效

1.1 时序样本的"点"和"段"根本不是一回事

通用SMOTE 的假设是:两个少数类样本之间的线性插值点,仍然属于少数类。这个假设在静态表格数据上大体成立,因为特征之间没有顺序依赖。但工业时序不一样。一个振动信号窗口是 1024 个采样点,相邻点之间有强自相关,频域上还有特定的谐波结构。你在两个故障窗口之间做逐点线性插值,得到的既不是故障也不是正常,而是一个物理上不存在的"中间态"——它的频谱可能同时包含两个故障的特征频率,也可能因为相位错位产生虚假的边带。

我做过一个对比实验:用标准 SMOTE 对轴承内圈故障样本做增强,合成样本喂进 1D-CNN 后,验证集召回率不升反降,从 0.71 掉到 0.63。原因很直接,合成样本在特征空间里落在了正常样本的簇附近,等于给模型灌了噪声标签。

1.2 不平衡比、类内差异和噪声的三重夹击

工业场景的不平衡往往不是简单的 1:100。它有三个叠加的难点:

  • 极端不平衡比:故障样本占比常在 0.1% 到 2% 之间,少数类内部还可能分多种故障模式(内圈、外圈、滚动体),每种模式样本更少。
  • 类内差异大:同一种故障在不同转速、不同负载下波形差异明显,简单插值会把不同工况的样本混在一起。
  • 标签噪声:早期微弱故障和正常工况的边界模糊,人工标注本身就带主观性。

这三者叠加,意味着增强方法不能只做"数量补齐",还得做"质量筛选"和"分布校正"。Deep Attention SMOTE 的核心思路,就是把注意力机制引入增强过程,让模型自己学会"哪些特征维度对区分故障重要",然后只在这些维度上做有约束的插值。

1.3 从"盲目插值"到"可学习增强"的范式转变

传统 SMOTE 的插值系数是随机采样的,特征权重是均等的。Deep Attention SMOTE 把这两件事都交给网络去学:用多头自注意力计算样本对之间的重要性权重,用可学习的插值系数替代随机系数。换句话说,增强不再是预处理阶段的一次性操作,而是嵌入到训练循环里、随模型一起优化的模块。这个转变的意义在于,增强策略能根据当前模型的判别能力动态调整——模型还没学好的时候多生成难样本,模型收敛后减少生成避免过拟合。

2. Deep Attention SMOTE 的机制拆解

2.1 多头自注意力如何给样本对打分

整个方法的第一步,是把少数类样本两两配对,用自注意力算出"这对样本值不值得插值"。具体做法是:对每个少数类样本提取一个嵌入向量(可以是原始时序经过编码器后的隐表示),然后构造 query、key、value 三组投影。注意力分数 softmax 之后,得到的是每个样本对其他样本的关注权重。

这里有个关键设计:注意力不是在全样本集上算,而是在少数类子集内部算。因为我们的目标是生成少数类样本,跨类的注意力没有意义。多头的作用是让不同的头关注不同的模式——有的头关注频域特征,有的头关注时域包络,有的头关注样本间的欧氏距离。实测下来,4 到 8 个头比较合适,再多容易过拟合到训练集的特定噪声上。

2.2 可学习插值系数替代随机采样

标准 SMOTE 的公式是 x_new = x_i + λ(x_j - x_i),λ 从 [0,1] 均匀采样。Deep Attention SMOTE 把 λ 变成一个由注意力分数驱动的量:

λ_ij = sigmoid(W_a · [h_i ; h_j ; |h_i - h_j|])

其中 h_i、h_j 是样本嵌入,W_a 是可学习参数。这样插值系数就反映了两个样本的"兼容性"——如果两个样本来自相似工况,λ 接近 0.5,生成中间样本;如果差异大,λ 会被推向 0 或 1,相当于少生成或不生成。这个设计直接缓解了跨工况混样的问题。

2.3 生成样本的判别式过滤

光生成还不够,得筛。方法里通常配一个判别器(可以是简单的二分类头),对生成的样本打一个"真实性分数"。分数低于阈值的样本直接丢弃,不参与后续训练。这个判别器可以和主分类器共享底层特征,只加一个轻量头,计算开销可控。我在自己的项目里把阈值设在 0.6 左右,过滤掉大约 30% 的合成样本,剩下的样本质量明显更稳。

2.4 与训练循环的耦合方式

增强模块不是独立预训练的,而是和主分类器交替优化。一个典型的训练节奏是:

  1. 用原始不平衡数据预热主分类器 5 个 epoch;
  2. 冻结主分类器,用当前特征训练注意力增强模块 2 个 epoch;
  3. 用增强后的数据(原始 + 合成)更新主分类器;
  4. 重复 2-3,直到收敛。

这种交替训练的好处是增强模块始终对齐当前模型的特征空间。如果一次性预训练增强模块,模型更新后特征漂移,合成样本就失效了。

3. 从零搭建一套可跑的增强流水线

3.1 数据切窗与少数类定义

工业时序第一步永远是切窗。假设采样率 12.8kHz,故障特征频率在 1kHz 以下,那么窗长取 1024 点(约 80ms)比较合适,重叠率 50%。标签方面,我建议不要只标"正常/异常",而是标到具体故障模式,因为 Deep Attention SMOTE 在类内做增强,模式分得越细,合成样本越有针对性。

少数类的定义要动态看:如果某类样本少于总样本的 5%,就纳入增强范围。但要注意,如果某类只有 3 条样本,注意力机制根本学不出有效权重,这时候得先用传统方法或物理仿真补到至少 20 条再上 Deep Attention SMOTE。

3.2 编码器选型:1D-CNN 还是 Transformer

编码器的作用是把原始时序压成嵌入向量。两种主流选择:

编码器类型优势适用场景注意事项
1D-CNN参数少、训练快、局部特征强样本量中等、故障特征以局部冲击为主感受野要覆盖至少一个冲击周期
Transformer全局依赖建模强、可解释性好样本量较大、故障表现为长程调制需要位置编码,小样本易过拟合

我的经验是:样本总数低于 5000 条时优先 1D-CNN,高于 5000 条再考虑 Transformer。如果非要用 Transformer,把层数压到 2-3 层,头数 4,加 dropout 0.3 以上。

3.3 注意力模块的实现细节

下面是一个简化版的多头注意力增强模块核心代码,用 PyTorch 写:

import torch import torch.nn as nn import torch.nn.functional as F class AttentionSMOTE(nn.Module): def __init__(self, embed_dim=128, num_heads=4, dropout=0.2): super().__init__() self.embed_dim = embed_dim self.num_heads = num_heads self.head_dim = embed_dim // num_heads self.q_proj = nn.Linear(embed_dim, embed_dim) self.k_proj = nn.Linear(embed_dim, embed_dim) self.v_proj = nn.Linear(embed_dim, embed_dim) self.lambda_proj = nn.Sequential( nn.Linear(embed_dim * 3, embed_dim), nn.ReLU(), nn.Linear(embed_dim, 1), nn.Sigmoid() ) self.dropout = nn.Dropout(dropout) def forward(self, h): # h: [N, embed_dim] 少数类样本嵌入 N = h.size(0) q = self.q_proj(h).view(N, self.num_heads, self.head_dim) k = self.k_proj(h).view(N, self.num_heads, self.head_dim) v = self.v_proj(h).view(N, self.num_heads, self.head_dim) attn = torch.einsum('nhd,mhd->nhm', q, k) / (self.head_dim ** 0.5) attn = F.softmax(attn, dim=2) attn = self.dropout(attn) # 用注意力权重加权聚合,得到每个样本的上下文表示 context = torch.einsum('nhm,mhd->nhd', attn, v).reshape(N, self.embed_dim) # 构造样本对,计算可学习插值系数 h_i = h.unsqueeze(1).expand(N, N, self.embed_dim) h_j = h.unsqueeze(0).expand(N, N, self.embed_dim) pair_feat = torch.cat([h_i, h_j, torch.abs(h_i - h_j)], dim=2) lam = self.lambda_proj(pair_feat).squeeze(2) # [N, N] return context, lam

这段代码里,lam就是样本对之间的插值系数矩阵。实际生成时,对每个样本 i,选注意力权重最高的 top-k 个邻居 j,用 lam[i,j] 做插值。

3.4 生成与过滤的完整流程

拿到 lam 之后,生成流程分四步:

  1. 邻居选择:对每个少数类样本,按注意力分数取 top-5 邻居,避免和远距离样本插值。
  2. 插值生成:x_new = x_i + lam_ij * (x_j - x_i),在原始时序空间或嵌入空间做都行。我倾向在嵌入空间做,然后过一个解码器还原成时序,这样合成样本更平滑。
  3. 判别过滤:用判别器给每个合成样本打分,低于阈值的丢弃。
  4. 配额控制:合成样本总量不超过原始少数类的 3 倍,否则容易过拟合到合成分布。

4. 实测中的坑与调参经验

4.1 注意力塌缩:所有样本关注同一个邻居

这是最常见的问题。训练几个 epoch 后,注意力权重全集中到某几个"典型"样本上,生成的样本高度同质化。根因是 softmax 的过度自信。解决办法有三个:加温度系数(把 softmax 前的 logits 除以 1.5 到 2)、加熵正则项鼓励注意力分散、对注意力权重做 dropout。我一般先加温度系数,效果最直接。

4.2 合成样本的边界越界问题

插值系数如果学得不好,合成样本可能落到正常样本的区域。检测方法是:对合成样本算它到最近正常样本的距离,如果小于到最近少数类样本的距离,就标记为越界。越界比例超过 15% 时,说明 lam 的约束不够,需要加一个边界惩罚项,把 lam 往 0.3-0.7 的区间拉。

4.3 判别器太强导致生成崩溃

判别器和生成器(这里是增强模块)的博弈要平衡。如果判别器太强,几乎所有合成样本都被判假,增强模块收不到有效梯度。我的做法是判别器学习率设为主分类器的 0.3 倍,并且每轮只更新判别器一次,增强模块更新两次。

4.4 评估指标不能只看 F1

不平衡场景下 F1 会被多数类主导。我建议同时看三个指标:少数类召回率、少数类精确率、以及 AUC-PR(PR 曲线下面积)。AUC-PR 对不平衡最敏感,是判断增强是否有效的核心指标。实测中,Deep Attention SMOTE 相比标准 SMOTE,AUC-PR 通常能提升 8 到 15 个百分点,但前提是注意力模块训练充分。

4.5 计算开销与工程折中

多头注意力在样本对上是 O(N²) 复杂度。少数类样本 200 条时没问题,2000 条时显存就吃紧了。工程上的折中是:先用聚类把少数类分成若干子簇,只在子簇内部算注意力,复杂度降到 O(N²/K)。K 取 5 到 10 比较合适,既降开销又不破坏类内结构。

5. 这套方法适合什么、不适合什么

Deep Attention SMOTE 不是万能药。它适合的场景有几个明确特征:少数类样本至少有几十条、故障模式可以分簇、有足够的计算资源做交替训练。如果少数类只有个位数样本,或者故障是突发性的、没有可学习的模式,那它帮不上忙,这时候应该转向物理仿真生成或半监督方法。

另外,这套方法对标签质量很敏感。如果正常和异常的边界本身就模糊,注意力会学到噪声模式,合成样本反而有害。上这套方法之前,先花时间清洗标签、确认故障模式的可分性,比调参重要得多。

我在两个项目里落地过这个思路:一个是风电齿轮箱,少数类样本 80 条,AUC-PR 从 0.42 提到 0.58;另一个是化工泵,少数类 150 条,AUC-PR 从 0.51 提到 0.63。提升幅度不算惊艳,但稳定性比标准 SMOTE 好很多,尤其是跨工况验证时不会崩。真正让我愿意继续用它的原因,是增强过程可解释——注意力权重能告诉我哪些样本对模型最重要,这在做故障归因时很有价值。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/8 10:32:35

SmarTest 8 中 Data Logging 机制与 STDF 解析实践

做芯片测试这行,只要你跟过产线、调过测试程序,就一定绕不开 Data Logging。SmarTest 8 作为 V93000 测试机的上层软件平台,最让新人头疼的往往不是测试项本身怎么写,而是“测试跑完了,数据到底去哪了、格式对不对、能…

作者头像 李华
网站建设 2026/10/8 10:32:12

SpringBoot+Vue个人运动健康管理系统:Java毕设全栈项目实战拆解

做毕设最怕的就是选题看着很“高端”,结果自己根本驾驭不了,最后赶在答辩前疯狂降级。如果你正在Java方向找项目,今天拆的这套个人运动健康管理系统,是我认为很值得参考的样本:技术栈是SpringBoot Vue MySQL&#xf…

作者头像 李华
网站建设 2026/10/8 10:30:49

Hydra Windows版配置与txt字典规范实战指南

简介:本资源为Hydra密码爆破工具的Windows平台完整适配包,面向网络安全初学者、渗透测试实践者及CTF备赛人员,解决在Windows环境下快速部署与调用Hydra进行弱口令检测的实际需求。压缩包共99个文件,包含37个高频密码字典&#xff…

作者头像 李华
网站建设 2026/10/8 10:28:59

10款降AI率工具实测:专科生论文如何通过AIGC检测

先说个我自己比较深的感受:这几年每年毕业季,总有大四学生因为论文被判定“AI痕迹过重”被打回重写,其中专科生的比例尤其高。专科论文本来就不要求像本科那么强的理论原创性,很多同学习惯用AI写初稿、自己再调格式,提…

作者头像 李华
网站建设 2026/10/8 10:27:09

p53蛋白与TP53基因:结构功能、突变热点及实验室检测要点

p53 这个蛋白,做肿瘤生物学的同行应该都绕不开,实验室里几乎天天要打交道。它是 TP53 基因编码的明星抑癌蛋白,人称“基因组守护者”,在 DNA 损伤、细胞周期阻滞、凋亡调控等一大堆关键事件里都站在舞台中央。我最早做 Western bl…

作者头像 李华