
做船舶制冷系统的状态监控时间一长就会有个体会想靠压缩机和传感器上有限的测点把故障提前看出来光用硬阈值报警根本不够。最近我在折腾机舱设备健康管理的项目把原来“超温报警人工看趋势”的老思路换成“仿真数据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跑也不会有压力。真正要留意的是历史数据要定期存下来拿回来重新训练模型让诊断系统随着数据积累越用越准。部署完成后还要做一件事——把报警记录和维修工单联动起来这样能看到每次报警对应的实际故障原因用来验证和迭代模型。我自己的体会是很多项目进展不顺不是算法不好而是团队根本没用维修结果反哺过模型。最后再分享一个小技巧。仿真模型版本要管好每次修改制冷模型参数时把版本号和改动原因记录下来。听起来像是工程管理上的小事实际操作中你会发现数据一多根本分不清哪些样本是用哪个版本的模型跑出来的模型迭代时直接抓瞎。版本管理做到位了整个仿真加诊断的闭环才真正转得起来。这个流程后续往冷藏集装箱集中供冷、渔业加工船速冻装置上扩展都不用大改核心方法是可以复用的。