尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

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

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 与训练循环的耦合方式增强模块不是独立预训练的而是和主分类器交替优化。一个典型的训练节奏是用原始不平衡数据预热主分类器 5 个 epoch冻结主分类器用当前特征训练注意力增强模块 2 个 epoch用增强后的数据原始 合成更新主分类器重复 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_dim128, num_heads4, dropout0.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, dim2) 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)], dim2) lam self.lambda_proj(pair_feat).squeeze(2) # [N, N] return context, lam这段代码里lam就是样本对之间的插值系数矩阵。实际生成时对每个样本 i选注意力权重最高的 top-k 个邻居 j用 lam[i,j] 做插值。3.4 生成与过滤的完整流程拿到 lam 之后生成流程分四步邻居选择对每个少数类样本按注意力分数取 top-5 邻居避免和远距离样本插值。插值生成x_new x_i lam_ij * (x_j - x_i)在原始时序空间或嵌入空间做都行。我倾向在嵌入空间做然后过一个解码器还原成时序这样合成样本更平滑。判别过滤用判别器给每个合成样本打分低于阈值的丢弃。配额控制合成样本总量不超过原始少数类的 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-PRPR 曲线下面积。AUC-PR 对不平衡最敏感是判断增强是否有效的核心指标。实测中Deep Attention SMOTE 相比标准 SMOTEAUC-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 好很多尤其是跨工况验证时不会崩。真正让我愿意继续用它的原因是增强过程可解释——注意力权重能告诉我哪些样本对模型最重要这在做故障归因时很有价值。
返回列表