资讯详情

MS-DACAN跨工况轴承故障诊断:多尺度与类条件对齐的迁移学习方案

📅 2026/9/16 7:06:13 | 华诺云谱 👁 阅读
MS-DACAN跨工况轴承故障诊断:多尺度与类条件对齐的迁移学习方案
搞轴承故障诊断的人这两年应该都有同一种感觉在实验室数据上训出来的模型一拉到现场工况就“水土不服”。转速变一下、负载调一下准确率从99%直接跌到及格线以下甚至乱分一通。这就是跨工况诊断最头疼的地方——源域和目标域的分布不一样了模型学到的判别边界在新数据上不成立。迁移学习就是在这种情况下被推到前台的而把迁移学习和轴承故障诊断结合最核心的需求只有一个把源域里学到的故障模式迁移到没有标签或者标签很少的目标工况上去。MS-DACANMulti-Scale Domain Adaptive Class-Conditional Alignment Network就是冲这个需求去的。它不是简单的“加个域判别器”完事而是在多尺度特征提取、全局域对齐、类条件对齐三个层面同时做约束专门解决跨工况下特征偏移导致的诊断失效问题。这篇文章我会把它的设计动机、网络结构、损失函数、实验配置以及我在复现过程中踩过的坑一次讲清楚适合正在做迁移诊断方向的学生和工程人员也适合想快速上手复现一个可用方案的研究者。1. 跨工况诊断到底难在哪1.1 一个问题工况一变模型就废轴承故障诊断的本质是从振动信号里找到能区分正常、内圈故障、外圈故障、滚动体故障的特征。传统深度学习方法假设训练数据和测试数据是独立同分布的但现实里几乎没有这种好事。一台设备开机转速可能是800转过一会儿变成1500转负载从空载变成满载环境噪声从车间安静变成旁边有空压机在响。这些变化都会让原始振动信号的幅值、频率成分、能量分布发生明显改变。你可以把模型学到的特征想象成用一套固定钥匙开锁在源工况下这把钥匙刚好能对上锁芯到了目标工况锁芯里的弹子换了位置钥匙就不灵了。准确率下滑不是模型“变笨”了而是它看到的输入分布变了。这是本质性的domain shift问题加大训练数据量、堆模型层数效果都有限。1.2 迁移学习在这里的定位迁移学习的思路很直接源域有完整标签目标域没有或只有少量标签我们要把源域的知识迁移过去。轴承故障诊断里最常见的设定是直推式迁移学习——训练的时候能拿到目标域的数据但拿不到它的标签。这就给了模型一个机会让它在源域标签的监督下学习分类同时在特征层面把源域和目标域的分布拉近。但这里有一个很多人容易忽略的细节仅仅做全局分布对齐是不够的。全局对齐的意思是“源域整体和目标域整体看起来差不多”它不保证“源域的内圈故障对上了目标域的内圈故障”。如果两类故障的特征分布本身就有交叠全局对齐甚至可能把不同类别硬拉到一起导致分类器无所适从。这也是为什么现在做迁移诊断的研究者越来越关注类条件对齐——也就是“每一类都要对齐”而不是笼统地“整体对齐”。2. MS-DACAN 的整体设计思路2.1 网络框架总览MS-DACAN 的整个框架可以拆成四个角色共享特征提取器、多尺度特征模块、故障分类器、域判别器。另外还有一个隐性的类条件对齐模块它和域判别器相互配合共同决定特征空间长什么样。训练流程大致是把带标签的源域样本和不带标签的目标域样本一起送进特征提取器得到多尺度融合后的特征然后兵分两路一路接分类器用交叉熵做监督分类另一路接域判别器做对抗对齐同时在特征层面计算类条件分布差异让源域和目标域同一个类别的特征分布尽可能靠近。这个思路的好处是“监督信息”和“分布信息”同时起作用不会因为只顾着拉近分布而丢掉故障类别之间的区分度。2.2 为什么一定要引入多尺度轴承故障的振动信号有个显著特点不同故障类型、不同损伤位置产生的冲击成分会出现在不同的频带和尺度上。内圈故障的冲击特征在低频段能量集中外圈故障的表现又和转频高度相关滚动体故障往往要关注更高频的共振带。只用单一尺度卷积核提取特征就像用一台固定焦段的相机拍全景总有照顾不到的细节。多尺度设计的核心就是并行的不同感受野分支。常见的做法是并行的卷积核大小不同比如1×1、3×3、5×5然后做通道拼接或者加权融合。对一维振动信号来说就是不同长度的卷积核在时间轴上滑动等效于在不同的时间跨度上捕捉冲击和调制特征。这样提取出来的特征既包含短时冲击也包含周期性调制对跨工况场景更鲁棒。2.3 类条件对齐比全局对齐强在哪拿深度域自适应里常用的MMD最大均值差异举例。全局MMD只要求源域和目标域在高维再生核希尔伯特空间里的均值嵌入接近换句话说就是两个分布的“重心”接近。但“重心近”不代表逐类对应。如果源域的A类特征恰好落在目标域的B类特征附近全局MMD非但不会纠正这种错位反而可能把这种情况当作“正常”。类条件对齐的思路就不一样。它的前提是找到源域和目标域每个样本的类别归属源域直接用标签目标域用分类器的软预测作为伪标签。然后计算同一类别内部、跨域的分布差异再把这个差异作为损失去优化。这样做能保证源域的“内圈故障”尽量靠近目标域的“内圈故障”而不是靠近“滚动体故障”。这是MS-DACAN最值得借鉴的设计点。3. 核心模块与损失函数拆解3.1 多尺度特征提取模块怎么搭我复现时采用的是一个比较轻量的多尺度结构三个并行分支卷积核长度分别是16、32、64步长设成1padding做相应设置保证输出长度一致。为什么要选这三个数因为轴承振动信号在采样率12kHz到48kHz不等16个点大概能覆盖0.3到1.3毫秒的局部冲击64个点能够覆盖一个转频周期内的部分调制波尺度差异足够拉开又不会让参数量爆炸。每个分支后面接一个BN层和一个MaxPooling层然后三个分支的输出在通道维度上拼接。拼接之后的特征再过一个1×1卷积做压缩融合。1×1卷积在这里特别重要它不改变序列长度只做跨通道的信息混合相当于给拼接后的特征做一次“降维和整合”避免直接拼接导致后续全连接层参数量过大。这里有个工程细节要注意多尺度分支的初始化会影响早期的训练稳定性。我建议各分支的卷积权重使用相同的标准差初始化并在前几个epoch冻结域判别器只训练分类部分先把特征提取器拉到一个还能分类的状态再开启对抗对齐。否则一开始特征空间就是乱的域对抗会在无意义的特征上强行对齐反而拖慢收敛。3.2 域判别器与对抗损失域判别器的作用是判断一个特征来自源域还是目标域。它本质上是一个二分类器输入是特征提取器的输出输出是0到1的域标签。对抗训练的时候特征提取器要尽量“骗过”域判别器让域判别器分不清特征来自哪个域域判别器则反过来要努力分清。两者博弈的结果就是源域和目标域的特征分布被拉近。实现对抗训练有两种常见做法一是用梯度反转层GRL在前向传播时原样输出反向传播时把梯度乘以一个负数这样同一套优化器就能同时更新特征提取器和域判别器二是分别定义两个优化器交替更新。我实测下来GRL在稳定性和代码简洁性上都更好但需要注意把GRL的缩放系数从0慢慢升到1否则前期梯度反转太猛特征提取器容易被带偏。域对抗损失我自己倾向于用最小平方误差的形式就是LSGAN那种公式更稳定。传统二分类交叉熵在对抗训练后期容易出现梯度消失LSGAN把判别器输出当作回归目标训练更顺滑。3.3 类条件分布对齐怎么做类条件对齐是本方案里最细的一层约束。它不满足于“整体分布一致”而是要求“每一类都跨域一致”。具体操作分两步。第一步给目标域样本生成伪标签。直接用当前分类器输出的软概率作为权重就可以了不需要做hard label。软权重的优势在于保留不确定性模型对某个样本没把握的时候概率在各个类别之间比较平均它对对齐损失的贡献会被天然压低不容易把不确定样本强行拉向某个错误类别。第二步用加权的MMD或LMMD局部最大均值差异计算同一类别下源域和目标域的分布距离。简单说就是先根据样本属于第c类的权重分别计算源域和目标域第c类样本的特征均值然后计算两个均值向量的距离所有类别求和。权重越大说明这个样本对这个类别的对齐责任越大。这一步有个很容易踩的坑如果目标域某类样本非常少甚至等于0那这个类别的对齐项会完全由几个不可靠的样本主导。我的解决方法是给每个类别的对齐损失乘一个置信度系数这个系数由目标域该类伪标签的最大概率均值来决定。低置信度的类别自动降低对齐力度避免负迁移。3.4 故障分类器与总损失故障分类器就是一个全连接层加Softmax输入是多尺度融合特征输出是故障类别概率。源域样本有真实标签所以这一路用标准的交叉熵损失。总损失可以写成[ \mathcal{L} \mathcal{L}{cls} \lambda{adv} \mathcal{L}{adv} \lambda{cond} \mathcal{L}_{cond} ]其中 (\mathcal{L}{cls}) 是源域分类损失(\mathcal{L}{adv}) 是全局域对抗损失(\mathcal{L}{cond}) 是类条件对齐损失。两个超参数 (\lambda{adv}) 和 (\lambda_{cond}) 控制三个目标之间的平衡。实操的时候我通常是先固定 (\lambda_{adv}0.1)、(\lambda_{cond}0.5) 作为初始值。(\lambda_{cond}) 可以稍微大一点因为它直接作用于类别层面的分布对齐和分类任务最相关(\lambda_{adv}) 如果太大特征提取器会把大量容量花在“骗过”域判别器上导致类别可分性下降。训练时更新顺序也有讲究。我建议在一个batch内先计算总损失反向传播更新特征提取器和分类器然后用特征图更新域判别器最后单独更新类条件对齐模块涉及的参数。如果顺序乱了比如先更新域判别器再用同一批特征更新特征提取器容易出现震荡。3.5 损失计算伪代码下面这段是我复现时候的核心思路用PyTorch风格写了个简化版方便对照实现。# 伪代码省略了具体网络结构定义 for epoch in range(total_epochs): for (x_s, y_s), (x_t, _) in zip(source_loader, target_loader): # 提取多尺度特征 f_s, f_t ms_feature_extractor(x_s), ms_feature_extractor(x_t) # 1. 源域分类损失 logits_s classifier(f_s) loss_cls CrossEntropyLoss(logits_s, y_s) # 2. 域对抗损失两个域标签分别为0和1 dom_pred domain_discriminator(torch.cat([f_s, f_t], dim0)) dom_label torch.cat([zeros_like(y_s), ones_like(y_s)], dim0) loss_adv LSGANDiscLoss(dom_pred, dom_label) # 3. 类条件对齐损失LMMD p_s softmax(classifier(f_s)) p_t softmax(classifier(f_t)) loss_cond LMMD(f_s, f_t, p_s, p_t) # 4. 总损失GRL控制对抗反向梯度 loss loss_cls lambda_adv * loss_adv lambda_cond * loss_cond optimizer.zero_grad() loss.backward() optimizer.step()我特别提醒一下伪代码里的lambda_adv和lambda_cond别直接用固定值跑完整个训练。通常的做法是用一个sigmoid或者线性增长的warm-up曲线让模型先用源域分类任务“热热身”再逐步加大对齐力度。我习惯在前10个epoch只训练分类器之后用30个epoch把两个lambda从0渐增到目标值。这个细节直接关系到最终准确率的上限。4. 实验设计与实操复现4.1 数据集与迁移任务划分数据这块实验室研究最常用的是凯斯西储大学CWRU轴承数据集也有不少人在用XJTU-SY数据集。CWRU的好处是故障类型齐全、采样率可选、损伤直径分三档非常适合做跨工况迁移实验。XJTU-SY更接近工程实际包含加速寿命试验数据不过它的故障阶段划分需要自己处理复现成本高一些。为了验证“跨工况迁移”我们要构造不同工况下的源域和目标域。以CWRU为例可以在三种负载工况0hp、1hp、2hp之间两两组合迁移任务比如0hp→1hp表示源域是0hp负载下的全类别带标签样本目标域是1hp负载下的无标签样本测试时在目标域上报告分类准确率。这里我强烈建议不要只跑一个迁移任务就下结论。一个可行的评价方案是跑全部六个方向的任务0→1、0→2、1→0、1→2、2→0、2→1再算平均准确率。因为不同工况之间的分布差异大小不一样只看单个方向很容易被偶然性误导。4.2 网络参数配置参考我复现时用的一组参数可以拿来直接起步参数项取值输入信号长度2048点采样率12 kHz批量大小32特征提取器多尺度CNN3分支16/32/64核域判别器3层FC中间维度256丢弃率0.5分类器1层FC Softmax优化器Adamlr1e-3学习率调度每30个epoch衰减10倍训练轮数80损失权重(\lambda_{adv}0.1)(\lambda_{cond}0.5)输入信号长度选择2048而不是1024是因为CWRU数据中故障特征在频域上比较密集太短的时间窗会丢掉周期调制信息。如果显存不够可以降到1024但准确率通常会掉两三个点。还有一个容易被忽视的细节必须把源域和目标域数据都做相同的标准化处理标准化参数只从源域统计得到。如果用了目标域的均值方差来归一化等于在训练阶段偷看了目标域分布虽然测试准确率“更好看”但在工程上不可靠论文里也容易被审稿人抓住。4.3 训练流程完整记录我这边的训练流程是第1步加载源域和目标域数据每段振动信号随机裁剪成2048点做滑动窗口增强。CWRU每类故障样本量有限不做窗口切片的话样本太少容易过拟合。第2步初始化网络。特征提取器用Kaiming初始化BN层的权重不要动保持默认。第3步前10个epoch关闭域对齐分支只训练分类器。这一步是为了给特征提取器一个合理的起点。第4步第10个epoch开始开启域判别器和类条件对齐模块。GRL的缩放系数从0开始按线性增长到1。第5步每个epoch结束后在目标域测试集上评估一次准确率保存最优模型。建议用准确率最高的checkpoint而不是最后一个epoch的结果因为对抗训练后期偶尔会出现一个小幅波动。整个流程80个epoch在单张中端显卡上大约需要20到40分钟取决于数据量。跑完以后目标域准确率通常能从源域模型的40%到60%提升到90%以上前提是你的超参数没有明显出问题。4.4 评估指标怎么选分类准确率是最直观的指标但单看准确率不够。迁移诊断里我习惯同时看Macro-F1因为它对类别不平衡更敏感。有些故障类型在数据集中天然占比高准确率上去了但少数类全错了Macro-F1能暴露这个问题。另外两个可视化工具值得一说。第一个是混淆矩阵。我想看目标域样本被错分到了哪些类别这比单一数字更有信息量。比如内圈故障样本经常被错分成滚动体故障说明特征提取器在这两个类别上的区分度不够那就需要检查多尺度模块的高频分支是否提取到了足够的冲击特征。第二个是t-SNE或者PCA降维可视化。把所有源域和目标域样本的特征画在二维平面里如果源域和目标域的同类样本抱在一起不同类分开说明对齐效果不错。如果看到源域和目标域同类样本是两个完全分离的簇那说明类条件对齐没生效问题大概率出在伪标签质量或者对齐权重的设置上。5. 常见问题与排查技巧5.1 域判别器太强特征被“对齐”到不可分这个现象我碰到过很多次对抗损失一直在降但分类准确率不升反降。原因是域判别器学得太快把特征提取器逼着把所有样本都映射到同一个区域这样源域和目标域分布确实重合了但类别信息也被破坏掉了。解决手段有三个方向。第一把域判别器的容量降低本来三层FC改成两层隐藏层维度从256降到128。第二加大 (\lambda_{cond}) 的比重让类条件对齐把类别结构拽回来。第三给域判别器加梯度惩罚或者谱归一化限制它的复杂度。我最常用的是前两种组合效果最明显。5.2 目标域伪标签噪声大类条件对齐依赖目标域的伪标签伪标签错了对齐自然错。这个问题在训练前期特别严重因为分类器还没定型。处理办法我总结成几个防线在开启类条件对齐之前先用源域数据把分类器训练到至少95%的准确率。使用软标签而不是硬标签降低错误标签的置信度。对目标域样本的置信度做阈值筛选只有最大类别概率超过0.8的样本才参与类条件对齐。这会导致参与对齐的样本变少但质量高很多。如果计算资源允许用EMA指数滑动平均维护一套缓慢更新的“教师模型”来生成伪标签比直接用在线分类器稳定不少。我在实际项目中把这三个防线全用上了最终准确率比只用软标签高了约4个百分点尤其在高负载差异的迁移任务上提升明显。5.3 训练震荡loss上下乱跳对抗训练本身就是一个不稳定博弈再加上类条件对齐整体动态更复杂。出现loss震荡时我一般从这几个地方查。学习率首当其冲。域判别器和特征提取器对抗的时候学习率太大会导致双方“用力过猛”。我习惯把特征提取器和分类器的学习率设为1e-3把域判别器的学习率调成1e-4让判别器“慢半拍”。然后是batch size。小batchsize会让伪标签的分布波动大类条件对齐目标不稳定。如果显存允许batch size尽量上64。最后是同类问题就是GRL缩放系数。前文说让GRL系数从0开始线性增长这个策略本身就能很大程度缓解震荡。如果已经震荡了可以检查是不是GRL系数增长太快把增长周期从30个epoch拉长到50个epoch再试。5.4 结果提升不明显怀疑模型没用如果有读者复现后发现效果和“普通CNN域对抗”差不多我建议先不要怀疑类条件对齐本身而是检查特征分布的实际对齐情况。最常见的原因是数据预处理不一致。源域和目标域使用了不同的滤波参数、不同的标准化方式或者信号裁剪的起始点对齐方式不同都会导致特征空间里本来就存在一个很大的“伪偏移”这个偏移不是分布层面的而是数据工程层面的。先把数据预处理统一再做迁移学习才有意义。另一个原因是多尺度模块的尺度设计不合理。不同数据集的故障特征分布不一样16/32/64的卷积核组合未必处处适用。我曾经在某个高速轴承数据集上调参发现把核长改成32/64/128之后准确率直接提高了3个百分点。原因是这个数据集的故障冲击周期更长需要更大感受野才能捕获完整的调制包络。5.5 常见问题速查表现象可能原因排查与解决准确率低于源域模型负迁移对齐过度降低 (\lambda_{adv})提高 (\lambda_{cond})域判别器loss快速归零判别器容量过大减少判别器层数加谱归一化类条件对齐loss不下降伪标签噪声大置信度过滤教师模型生成伪标签训练后期准确率回落学习率过大学习率按epoch衰减保存最优checkpoint特征可视化同类不聚拢多尺度感受野不足增大卷积核长度调整分支组合6. 一点个人经验与扩展方向做迁移诊断这几年我最大的体会是论文里的网络结构其实没那么神秘真正的难点在“怎么让损失函数按预期工作”。MS-DACAN这个方案核心思想就一句话——全局对齐保底类条件对齐纠偏多尺度特征保信息。但想把这句话变成能稳定复现的代码需要处理非常多细节伪标签质量怎么控制、GRL缩放怎么调度、两个损失权重怎么配合这些论文里往往不会写全只有在复现和调参中才能摸到门道。如果你打算把这个方法用到自己的项目里我建议先从公开数据集上复现一个基准把可视化工具链混淆矩阵、t-SNE跑通然后再动你自己的数据。别看这步不起眼它能帮你节省后面几倍的调试时间。这套思路的扩展性也挺好。我自己试过把类条件对齐部分直接移植到齿轮箱故障诊断任务上只需要把输入信号维度调整一下多尺度卷积核长度重新选一遍其他部分几乎不用改。如果你手头有电机、泵、风机这类旋转机械的振动数据完全可以沿着同样的框架去迁移不用重新设计一套复杂网络。最后分享一个调参小技巧把训练过程的“源域分类准确率”“目标域准确率”“域判别器loss”“类条件对齐loss”四条曲线打在同一张图上。哪条曲线不对劲问题往往就出在哪条曲线对应的模块上。这套“曲线定位法”帮我解决过不下十个疑难问题比单纯盯着最终准确率高效得多。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。