每个做预测性维护的团队,早晚都会撞上同一堵墙:新产线没有数据。
我自己的经历是这样的。前年我们在一条包装产线上做轴承故障检测,数据攒了八个月,模型调到准确率不错,老板很高兴,大手一挥:"厂里还有六条产线,都推过去!"然后现实就给了我一巴掌——那六条产线要么是不同厂家的设备,要么转速、载荷不一样,传感器装的位置也不同。新产线的数据积累得从零开始,等八个月,黄花菜都凉了。
这就是迁移学习要解决的问题:把A产线学到的"故障知识",搬运到B产线。
为什么不能直接拿去用
有人会问:故障模式不是差不多吗?轴承内圈故障、外圈故障、齿轮断齿,物理机理一样,模型直接用不行吗?
不行,或者说不完全行。原因在于模型学的从来不是纯物理机理,而是"机理+数据分布"的混合体。换个产线:
- 转速从1200rpm变成1800rpm,故障特征频率全变了;
- 传感器从轴承座正上方挪到了侧面,传递路径不同,幅值和相位都漂移;
- 负载谱不同,正常状态的振动基线就不在一个水平上。
模型见过的"正常"和新的"正常"对不上,输出的故障概率基本是随机数。我们直接搬过去试过,A产线95%准确率的模型,到B产线直接掉到50%多——还不如掷硬币。
迁移学习怎么搬
实践中我用过的路子,按见效快慢排序:
路子一:特征对齐(域自适应)。核心思想是让两个产线的特征分布尽量对齐。经典方法如DANN(域对抗神经网络):特征提取器后面挂两个头,一个做故障分类,一个做"这个样本来自哪条产线"的域判别,训练时故意让域判别分不出来——逼着特征提取器学到产线无关的故障特征。
# 域对抗的核心损失(伪代码,PyTorch风格) loss = loss_cls(pred, label) \ - loss_domain(domain_pred, domain_label) * 0.3 # 分类损失要降,域判别损失要"升"(梯度反转实现) # 效果:特征里保留"是不是故障",抹掉"是哪条产线"路子二:只迁冻结部分,微调末端。更朴素的办法:把A产线模型的前几层(学通用特征的卷积层)冻住,只重新训练最后几层。B产线只需要少量标注数据——几百个样本往往就够。上线快,风险低,我的第一推荐。
路子三:物理量归一化。严格说这不算机器学习意义的迁移,但特别实用:把所有振动信号按转速做阶次归一化,按载荷做幅值归一化,让不同产线的特征落在同一坐标系里。做了这一步,迁移的难度直接降一半。这个步骤便宜到没理由不做。
实际效果和坑
去年那六条产线,我们最终是"物理归一化+冻结迁移+末端微调"的组合拳。每条产线只人工标注了大概两周的数据,模型收敛后准确率能到88%-91%。跟从零训练的八个月比,这个性价比没法拒绝。
坑也有三个,都是钱换来的经验:
- 负迁移。如果两条产线设备原理差异太大(比如滚珠轴承换成滑动轴承),硬迁移反而把模型带偏。判断标准很简单:微调后的效果还不如B产线从零训练的小模型,就是负迁移,果断放弃迁移路线;
- 标签体系要统一。A产线的"轻微磨损"和B产线的"轻微磨损"标准可能不是一回事,迁移前先把标签定义对齐,不然学的是错的;
- 别指望一劳永逸。迁移过去的模型照样会漂移,在线监控和定期重训一个都不能少。
写在最后
我现在越来越觉得,预测性维护项目的瓶颈早就不是算法了,是数据冷启动。迁移学习配合少样本标注,是打破"每条产线重干一遍"这个魔咒的最现实路径。
如果你正在被"新产线没数据"折磨,建议从路子三+路子二开始,成本最低,两周内能看到结果。
你们厂几条产线是各自为战还是统一建模?搬过模型的朋友,评论区交流下战果。