做船舶制冷系统的状态监控,时间一长就会有个体会:想靠压缩机和传感器上有限的测点把故障提前看出来,光用硬阈值报警根本不够。最近我在折腾机舱设备健康管理的项目,把原来“超温报警+人工看趋势”的老思路换成“仿真数据+SAE”的故障诊断方案,整套流程跑下来,效果比预期好不少。这篇文章就把这个基于仿真的SAE船舶制冷系统故障诊断方案完整拆开讲,包括仿真模型怎么建、故障数据怎么生成、SAE模型怎么训练、阈值怎么定、仿真到实船怎么迁移。适合做船舶机电设备状态监测、制冷系统运维的工程师,也适合手头故障样本少但想用深度学习方法做异常检测的研究者参考。
先说结论:整套方案并不是什么高不可攀的“黑科技”,核心逻辑就一句话——用仿真模型大量生成正常和故障工况数据,训练一个只见过“正常世界”的栈式自编码器,再用重构误差的大小来判断设备是否跑偏。关键在于,制冷系统的物理规律是明确的,故障对温度、压力、电流的影响是可以被仿真模型复现的,这正好补上了实船故障样本稀缺的短板。
1. 项目背景与技术路线:为什么是“仿真+SAE”
1.1 传统阈值报警有哪些让人头疼的地方
船舶制冷系统的运行工况不是固定的。海水温度会变,航行负载会变,冷库开门次数也会变,这些因素都会让压力、温度、电流在正常范围内大幅漂移。传统阈值报警为了不误报,往往把上下限放到很宽的区间,结果等它报警时,故障往往已经发展到了中后期。更麻烦的是复合故障,冷凝器脏堵的同时再带一点制冷剂欠充注,单看某几个参数很难判断,阈值法面对这种组合问题基本只能报出“异常”,但说不清到底哪里出了问题。
还有一类更隐蔽的情况是传感器性能劣化。温度传感器零漂、压力变送器偏置,这些故障不会让制冷系统本身停机,但会让控制系统误判,进而影响供冷品质。传统阈值法对这种“测量链故障”几乎无能为力,因为设定值本身就是不准的,阈值报警只能和错误数据比来比去。
1.2 自编码器为什么能接住这个问题
自编码器是种神经网络结构,分编码器和解码器两段:输入数据先被压缩到低维的隐藏特征,再从隐藏特征恢复成原始维度。训练时只给它正常工况的数据,让它学会把正常数据尽量无损地复现出来。训练完成之后,正常样本走一遍网络,重构误差很小;故障样本不符合它见过的“正常模式”,网络无法把它重构好,重构误差就会明显放大。这个误差就可以当成“故障分数”。
实际理解可以打个比方:一个保安只见过正常设备的日常声音和样子,一旦设备发出异常响动,他不需要提前知道异常是什么,也能察觉“不对劲”。自编码器干的就是这件事,它不需要把所有故障类型都列全,只要能区分“正常”和“偏离正常”就能工作。SAE在这里按栈式自编码器理解,也就是把多个自编码器的思想叠起来做更深的特征提取,有些文献里的稀疏自编码器也缩写为SAE,核心思路类似,本文统一按前者来讲。
1.3 为什么必须把“仿真”放在前面
实船的故障数据非常难拿。故障不能人为随便制造,等自然故障发生周期又太长,而且一旦故障到了严重程度,维修人员通常就直接换件了,很少有完整的从轻微故障到严重故障的连续数据。仿真模型的价值就在这里——制冷系统的热力学过程是可以用机理模型复现的,压缩机、冷凝器、膨胀阀、蒸发器之间的关系清清楚楚。我可以在仿真里把冷凝器换热系数调低15%,模拟脏堵初期;把制冷剂充注量调低20%,模拟泄漏;往温度传感器上加固定偏置,模拟传感器劣化。想要多少故障样本都行,还能自由控制故障严重程度。
这样做还有一个隐性好处:仿真数据的物理因果关系是干净的。故障注入改的是模型参数,模型内部先发生物理变化,然后才反映到传感器输出上,这比直接往输出序列上叠加一个偏移要真实得多,训练出来的模型也更贴近现场。
2. 制冷系统仿真建模与故障数据生成
2.1 仿真模型搭到什么程度才够用
先说结论:不需要把冷凝器翅片逐根建出来,也不需要对制冷剂流道做三维网格划分。对故障诊断来说,集总参数级模型就够用了。所谓集总参数,就是把整个冷凝器看成一个换热整体,用换热系数、换热面积、温差来计算换热量,忽略内部空间分布差异。模型越精细,标定参数越困难,仿真速度也越慢,对训练深度学习模型反而不利。
我常用的是Modelica环境里的蒸气压缩循环库,或者用Python写一个集总参数动态模型,核心状态量包括压缩机排量、冷凝温度和压力、蒸发温度和压力、膨胀阀开度、制冷剂充注量。模型输出就是实际船上能测到的那些信号:吸气压力、排气压力、蒸发温度、冷凝温度、压缩机电流、过热度、送风温度、回风温度。
关键点是仿真模型一定要能覆盖多个工况,不能只在一个平衡点附近转。船上不会总在一个海水温度下运行,制冷负荷也在变化,模型需要跟着变,否则训练出的诊断模型到实船上一跑就是满屏误报。
2.2 故障类型与注入方式怎么设计
我按船舶制冷系统高频故障整理了一张表,这也是整个数据集设计的核心:
| 故障类型 | 仿真注入方式 | 传感器侧表现 |
|---|---|---|
| 制冷剂泄漏 | 把制冷剂充注量从100%逐步调到60% | 吸气过热度上升,制冷量下降,排气温度偏高 |
| 冷凝器脏堵 | 冷凝器换热系数乘以0.6~0.8 | 冷凝压力升高,排气温度升高,压缩机电流上升 |
| 蒸发器结霜 | 蒸发器空气侧换热系数乘以0.5~0.7 | 送风温度升高,蒸发压力降低,过热度波动 |
| 膨胀阀开度异常 | 设定阀口开度固定偏小或产生周期性卡滞 | 过热度剧烈波动,吸气压力不稳定 |
| 传感器零漂 | 给温度或压力测量值增加恒定偏置 | 单个通道重构残差持续偏高,其余通道正常 |
| 压缩机效率下降 | 压缩机等熵效率乘以0.7~0.9 | 排气温度上升,制冷量下降,电流变化不明显 |
每种故障都要注入从小到大几个等级,比如泄漏严重程度分成5%、10%、15%、20%四档,这样才能训练出对早期故障敏感的模型。故障注入从某一时刻开始,之后持续运行,数据要保留故障发生前的正常段,方便模型学习“突变”特征。
2.3 数据生成过程与划分的实操细节
每个工况仿真要跑够时长,一般30到60分钟,采样周期1秒。正常工况和故障工况都要生成多组不同海水温度、不同负荷条件的数据。生成完成后数据不能直接扔给模型,还需要做几件事:
第一,滑窗切样本。单个样本用一个120秒的窗口,每个窗口包含12路传感器信号,这样单个样本就是12×120的矩阵。第二,特征压缩。全连接网络直接吃原始时间序列容易参数量过大,先把每个通道在窗口内计算均值、峰值、标准差,再额外算过热度变化斜率,得到36维统计特征。第三,标准化。使用Z-score,把每个特征变换到零均值单位方差。注意,均值和方差只能在训练集的正常样本上计算,不能把测试集统计量混进来,这是最容易踩的数据泄漏坑。
第四,数据集划分。划分时按仿真时序切,不能随机打乱所有样本再划分,否则同一条仿真序列里的相邻窗口会同时出现在训练集和测试集里,模型等于提前见过答案,评估结果虚高。我一般按整段仿真记录来划分,训练集占60%、验证集占20%、测试集占20%。
3. SAE模型设计与训练过程中的实操细节
3.1 网络结构和参数选取
输入是36维统计特征,输出也是36维,期望输出等于输入。一个比较稳的结构是四层编码器加一个瓶颈层,再接对称的解码器:
36 → 32(ReLU) → 16(ReLU) → 8(ReLU) → 16(ReLU) → 32(ReLU) → 36(Linear)瓶颈层的维度很关键。太小,正常数据的细节也存不下,重构误差会很大;太大,模型把正常噪声也记住了,故障样本的重构误差又不够明显。实践下来,8到16维对这个量级的输入特征基本够用。
激活函数给编码层用ReLU,解码器的最后一层必须用线性激活,因为输出是连续值,不能截断。如果发现模型对噪声很敏感,可以在损失函数里加一个稀疏正则项,约束瓶颈层平均激活值保持在一个低水平,相当于强迫网络只用少量特征去表达正常模式,这个技巧对降低误报很有帮助,但不是必须的,加不加要看验证集表现。
3.2 损失函数与优化器细节
损失函数用最基本的重构均方误差MSE。优化器首选Adam,学习率从1e-3开始,batch size取256,最大训练轮次50轮,配合早停。早停的监控指标不是训练集loss,而是验证集正常样本的重构误差均值,连续5轮不下降就停,防止网络把验证集的正常数据动态也背下来。
还有一个实操细节:训练时不要只盯着总loss,要看每个特征通道的误差分布。因为不同传感器量纲和动态范围差别很大,比如排气压力波动范围可能有好几兆帕,而送风温度只有十几摄氏度,如果不做分通道监控,量纲大的通道会主导loss,量纲小的通道等于没学。
3.3 训练过程中的三个常见坑
第一个坑是输入特征里有NaN或者偶发的传感器尖峰。造船厂采集系统偶发掉线很常见,我的做法是训练前先对每个通道做中值滤波,然后把超出6倍标准差的点标记为缺失值做插值,不能留着裸奔。第二个坑是学习率设置太大导致训练发散。如果发现loss曲线在前几个epoch直接起飞,不要怀疑模型结构,先把学习率降到3e-4再说。第三个坑是标准化参数必须冻结。测试阶段要用训练集算好的均值和标准差去转换数据,不能每来一批数据重新算一遍,否则线上数据分布和线下不一致,阈值全乱套。
4. 诊断效果评估与阈值设定实操
4.1 评估指标要盯住哪几个
故障诊断不是单纯追求准确率,尤其在船上,误报比漏报更让人头疼。值班员每天被无效报警轰炸几次,就会把系统当作“狼来了”,真正出问题时也不会看了。所以我在评估时重点看这几个指标:
| 指标 | 含义 | 为什么重要 |
|---|---|---|
| 检测率(召回率) | 故障样本中被正确报警的比例 | 漏掉故障会让故障演变成停机事故 |
| 误报率 | 正常样本中被错误报警的比例 | 误报太多导致告警疲劳,系统被关闭 |
| 平均检出延迟 | 故障注入时刻到首个报警时刻的时间差 | 早期故障发现越早,维修窗口越大 |
| ROC-AUC | 阈值变化时检测性能的综合指标 | 用来比较不同模型结构的优劣 |
在模拟项目X的测试集上,我的做法是对每个故障类型分别算这几个指标,而不是把全部样本混在一起算总账。因为不同故障的可检测难度差异很大,传感器零漂很容易检测,而制冷剂轻微泄漏就难得多,混在一起算平均分容易掩盖短板。
4.2 阈值怎么定才稳
阈值不能用“拍脑袋”的固定值。我的标准流程是:先用训练集全部正常样本过一遍训练好的SAE,得到每个样本的重构误差;然后在验证集正常样本上统计误差分布,取99分位数,或者取“均值+5倍标准差”作为初始阈值。两个方法我都试过,p99更稳,受个别尖峰影响小。
更可靠的做法是分通道阈值加全局阈值配合。每个传感器通道单独计算重构误差,设定单通道阈值,再把所有通道误差求和得到全局重构误差,设定全局阈值。只要单通道或全局任一超限,就标记故障。这样既能检测传感器零漂这种单通道异常,也能捕捉多个通道同时微偏的复合故障。
还有一个关键防误报机制:连续确认。故障样本不应由单点触发,要求连续3个时间点的重构误差都超过阈值才确认报警。这个机制能把随机噪声造成的孤立误报滤掉一大半,代价是检出延迟增加几秒,对制冷系统这种慢变化对象完全值得。
4.3 渐进性故障怎么提前发现
制冷系统很多故障是渐进发展的,比如冷凝器脏堵是逐渐加剧的,不是一个突变。早期故障幅度小,重构误差可能在阈值下方徘徊很久。这时要做误差趋势平滑,我用的是一阶指数加权移动平均,相当于把重构误差做平滑后再和阈值比较。平滑系数取0.8左右,让误差曲线既能跟随缓慢变化,又不会被单个样本的噪声带偏。实测下来,对轻微制冷剂泄漏的检出延迟能比直接看原始误差提前10到15分钟。
5. 仿真数据训练出的模型向实船迁移的坑
5.1 仿真和实船的“域差异”问题
仿真模型再努力,也不可能和真船完全一致。传感器安装位置不同,管路走向不同,甚至船体振动都会带来噪声差异。这种“仿真数据训练、实船数据上线”的场景就是典型的域差异问题。常见现象是:仿真里调得很完美的阈值,到了实船正常数据上一跑,误报率立刻飙升。
我的应对思路有三层。第一层,上线前先用一段实船正常历史数据重新标定阈值,不需要很多,几个小时连续正常数据就够。第二层,如果重构误差整体的均值分布都偏移,这说明仿真数据和实船数据的特征分布有系统性差异,可以在实船正常数据上对解码器最后两层微调几个epoch,把模型适配到实船数据分布上。第三层,如果还是不稳,就需要在仿真模型里把传感器噪声和环境扰动加得更充分,让模型在训练阶段就见惯“不干净”的数据。
这三种方法不是三选一,建议按顺序来:先加噪声,再微调,最后重新标定阈值。一上来就重新标定阈值只是治标,模型本身对实船数据分布不敏感的问题还在。
5.2 常见问题与排查速查表
我把实操中踩过的典型坑整理成一张速查表,方便同行排查:
| 现象 | 可能原因 | 排查和解决方向 |
|---|---|---|
| 训练loss不降 | 输入特征有NaN或未归一化;学习率过大 | 先检查数据清洗;把学习率降到3e-4再试 |
| 正常样本重构误差就很大 | 输入有传感器尖峰;特征分布跨度太大 | 做中值滤波;检查标准化是否正确 |
| 故障样本重构误差普遍偏小 | 故障注入强度太低;输入特征里缺少故障敏感指标 | 增大故障严重程度;加入过热度、过冷度、压缩机电流等特征 |
| 实船正常数据误报高 | 仿真数据太干净;阈值过紧 | 仿真加噪声;用实船正常数据重标阈值;微调解码器 |
| 轻微泄漏检测不出来 | 早期温度变化太微弱;重构误差被噪声淹没 | 对误差做指数加权平滑;适当放宽窗口长度 |
| 单通道异常不报警 | 全局误差被其他通道淹没 | 增加分通道独立阈值判断 |
5.3 模型要部署到什么位置
仿真训练和模型验证只是第一步,真正的价值在上线。我把这套流程做成了离线训练加边缘推理的结构:仿真平台和训练服务器离线完成数据生成和模型训练,训练好的权重转成轻量推理模型,部署到机舱的工控机或者集中监控系统里,实时读取传感器数据,每个采样周期计算一次重构误差,超阈值就触发报警。
需要提醒的是,船上工控机性能参差不齐,模型推理要控制计算量。我用的模型结构推理一次只需要几毫秒,哪怕用纯CPU跑也不会有压力。真正要留意的是历史数据要定期存下来,拿回来重新训练模型,让诊断系统随着数据积累越用越准。部署完成后还要做一件事——把报警记录和维修工单联动起来,这样能看到每次报警对应的实际故障原因,用来验证和迭代模型。我自己的体会是,很多项目进展不顺,不是算法不好,而是团队根本没用维修结果反哺过模型。
最后再分享一个小技巧。仿真模型版本要管好,每次修改制冷模型参数时把版本号和改动原因记录下来。听起来像是工程管理上的小事,实际操作中你会发现,数据一多,根本分不清哪些样本是用哪个版本的模型跑出来的,模型迭代时直接抓瞎。版本管理做到位了,整个仿真加诊断的闭环才真正转得起来。这个流程后续往冷藏集装箱集中供冷、渔业加工船速冻装置上扩展都不用大改,核心方法是可以复用的。