3、异常检测基础:异常的定义、类型与常见方法对比
在进入TinyML时序自编码器部署之前,必须先厘清一个根本问题:我们究竟要检测什么?异常检测(Anomaly Detection)并非一个单一算法,而是一套针对“非正常行为”的识别方法论。在工业传感器、可穿戴设备、边缘网关等资源受限场景中,异常往往意味着设备故障、数据篡改、环境突变或安全威胁。本章将系统梳理异常的本质定义、三种核心类型(点异常、上下文异常、集合异常),并横向对比统计方法、机器学习方法与深度学习方法的适用边界,为后续自编码器模型的设计与部署建立理论基石。
上图展示了异常检测的核心知识框架。从定义出发,异常类型决定了检测策略的选择,而方法对比则指导我们在TinyML约束下做出合理的技术选型。接下来,我们将逐一深入每个模块。
3.1 异常的定义与本质特征
异常(Anomaly)在工程语境中通常指“与预期行为模式显著不同的观测值或观测序列”。但“显著不同”是一个模糊概念,需要从三个维度量化:偏差程度(偏离正常范围的距离)、持续时间(瞬时突变还是持续漂移)、影响范围(单点影响还是系统级影响)。在TinyML场景中,异常定义还受限于传感器物理特性和边缘设备的计算能力。例如,一个工业振动传感器在正常工况下输出均值为5mm/s,标准差为0.5mm/s,当瞬时值达到8mm/s时,这属于统计意义上的显著偏差,但若该偏差仅持续10ms且无后续关联,可能只是噪声而非真实故障。
3.2 异常类型:点异常、上下文异常与集合异常
理解异常类型是选择检测算法的前提。不同类型的异常需要不同的特征提取方式和模型结构。
3.2.1 点异常(Point Anomaly)
点异常是指单个数据点相对于整体分布呈现显著偏离。这是最简单、最直观的异常类型。例如,温度传感器在室温25°C环境下突然读到80°C,或者电机电流在稳定5A运行时瞬间跳变到15A。点异常检测的核心是建立正常数据的概率分布模型,然后计算新样本的似然概率。在TinyML中,常用的点异常检测方法包括:基于均值和标准差的Z-score方法、基于分位数的箱线图方法(IQR)、以及基于距离的K近邻方法。
点异常检测的工程实现需要注意:数据预处理(去噪、归一化)直接影响检测效果;阈值选择需要平衡误报率和漏报率;滑动窗口可以平滑瞬时噪声,但会增加延迟。例如,在电池管理系统(BMS)中,单体电压的瞬时跌落可能指示内阻增大,但若仅持续一个采样周期(如100ms),可能是接触不良导致的测量噪声,此时需要结合前后窗口的电压变化率来综合判断。
3.2.2 上下文异常(Contextual Anomaly)
上下文异常是指单个数据点在全局分布中可能正常,但在特定上下文(如时间、空间、工况)下却异常。最典型的例子是温度传感器:夏季白天30°C是正常的,但冬季夜间30°C则异常;电机在启动瞬间电流达到10A是正常的,但在稳定运行阶段出现10A则异常。上下文异常检测必须引入上下文特征,如时间戳、工况标签、前序观测值等。
在TinyML时序场景中,上下文异常通常通过滑动窗口特征来捕捉。例如,使用过去N个时间步的观测值作为上下文,然后检测当前值是否偏离基于上下文的预测值。自编码器天然适合此类任务——它学习的是“给定上下文窗口,重建当前值”的映射关系,重建误差大则表明上下文异常。另一种常见做法是使用LSTM预测下一个时间步的值,将预测误差作为异常分数。
3.2.3 集合异常(Collective Anomaly)
集合异常是指一组数据点作为一个整体表现出异常行为,但单个点本身可能完全正常。例如,一个振动传感器在10秒内连续输出小幅波动(每个点都在正常范围内),但整体波动频率从50Hz变为5Hz,这指示机械共振或轴承磨损。集合异常检测需要分析序列的统计特征(如均值、方差、频谱能量、自相关系数)或模式变化(如隐马尔可夫模型的状态转移概率)。
在TinyML中,集合异常检测通常需要更长的上下文窗口和更复杂的特征提取。一种实用方案是:在边缘设备上计算短时傅里叶变换(STFT)或小波特征,然后将这些特征输入自编码器。例如,在预测性维护场景中,正常轴承的振动频谱在1kHz处有稳定峰值,当频谱能量从1kHz迁移到2kHz时,即使每个频点的幅值都在正常范围内,整体频谱形态已发生异常。
| 异常类型 | 定义 | 典型场景 | 检测策略 | TinyML适用性 |
|---|---|---|---|---|
| 点异常 | 单点显著偏离全局分布 | 传感器尖峰、电流突变 | Z-score、IQR、KNN | 高(计算量小) |
| 上下文异常 | 在特定上下文中偏离 | 温度昼夜模式、工况相关 | 滑动窗口+预测误差 | 中(需窗口存储) |
| 集合异常 | 群体行为模式异常 | 频谱漂移、序列模式变化 | 特征提取+序列模型 | 低(需较大内存) |
3.3 常见异常检测方法对比
异常检测方法可分为三大类:统计方法、机器学习方法和深度学习方法。每类方法在检测能力、计算开销、可解释性和部署难度上各有优劣。在TinyML场景中,我们需要在检测精度和资源消耗之间寻找平衡点。
3.3.1 统计方法
统计方法假设正常数据服从某种概率分布(如高斯分布、泊松分布),然后通过假设检验或置信区间来判断新样本是否异常。最经典的是3σ原则:若数据服从正态分布,则99.7%的样本落在均值±3σ范围内,超出此范围即为异常。另一种常用方法是IQR(四分位距):将数据按大小排序,计算Q1(25%分位)和Q3(75%分位),IQR=Q3-Q1,异常定义为小于Q1-1.5×IQR或大于Q3+1.5×IQR的值。
统计方法的优势在于计算量极小(仅需存储均值和方差或分位数)、可解释性强(异常分数有明确的统计含义)、无需训练(可直接在线更新)。但局限性也很明显:对高维数据效果差(难以建模联合分布)、对非线性关系无能为力、对非平稳分布(如设备老化导致的漂移)适应性差。
3.3.2 机器学习方法
机器学习方法通过训练一个模型来学习正常数据的边界或密度。常用的方法包括:孤立森林(Isolation Forest)——通过随机切分特征空间来隔离异常点,异常点更容易被隔离;One-Class SVM——在特征空间中寻找一个超球面或超平面来包围正常数据;K近邻(KNN)——计算样本到其K个最近邻的平均距离,距离大则异常。
机器学习方法相比统计方法能处理更高维的数据和非线性边界,但需要离线训练,且模型参数(如SVM的支持向量、孤立森林的树结构)需要存储在设备上。在TinyML中,孤立森林因其低内存占用(每棵树只需存储分裂特征和阈值)和快速推理(平均O(log n)复杂度)而受到关注。例如,在Cortex-M4上部署一个包含10棵树的孤立森林,每棵树深度为5,仅需约2KB内存,推理时间小于1ms。
3.3.3 深度学习方法
深度学习方法(尤其是自编码器)通过神经网络学习正常数据的压缩表示和重建能力。自编码器由编码器(将输入压缩为低维潜变量)和解码器(从潜变量重建输入)组成。训练时仅使用正常数据,使重建误差最小化。推理时,若重建误差超过阈值,则判定为异常。在时序场景中,可以使用LSTM自编码器或卷积自编码器来捕捉时间依赖。
深度学习方法的最大优势是自动特征提取——无需人工设计特征,适合高维、复杂、非线性的数据。但代价是训练成本高(需要大量正常数据和GPU资源)、模型体积大(全精度模型可能数百KB到数MB)、推理计算量大(需要多次矩阵乘法)。在TinyML中,需要通过量化(将FP32权重转为INT8)、剪枝(移除不重要的连接)和知识蒸馏(用小模型模仿大模型)来压缩模型。
| 对比维度 | 统计方法 | 机器学习方法 | 深度学习方法 |
|---|---|---|---|
| 数据维度 | 低(1-3维) | 中(10-100维) | 高(100+维) |
| 非线性处理 | 弱 | 中 | 强 |
| 训练需求 | 无(在线更新) | 需离线训练 | 需大量数据+GPU |
| 推理内存 | <1KB | 2-20KB | 50KB-1MB(量化后) |
| 推理延迟 | <0.1ms | 0.1-1ms | 1-10ms(MCU) |
| 可解释性 | 高(统计量明确) | 中(可查看分裂规则) | 低(黑盒) |
| 适用场景 | 简单阈值监控 | 中等复杂度特征 | 高维时序、图像、音频 |
3.4 案例拆解:工业泵振动监测的异常检测方案选型
为了将上述理论落地,我们以一个实际的工业泵振动监测项目为例,展示如何根据约束条件选择异常检测方法。
背景与约束:某化工厂有50台离心泵,每台泵配备一个三轴加速度传感器(采样率2kHz),需要实时监测轴承磨损和叶轮不平衡。边缘设备采用STM32L4系列MCU(Cortex-M4,80MHz,256KB Flash,64KB RAM),通过BLE将告警上传至网关。电池供电,要求平均功耗低于5mW,即MCU大部分时间处于睡眠模式,每次唤醒需在10ms内完成检测。
初始现象与目标:传统阈值报警(如振动速度超过4.5mm/s)导致大量误报——泵在启动和停机阶段振动天然偏高,但并非故障。目标是将误报率从每月15次降至每月少于2次,同时漏报率低于1%。
关键输入数据与参数:每轴振动加速度时域信号,每帧采集256个采样点(128ms),计算RMS值、峰值因子、频谱能量(通过FFT)。正常工况下,RMS值在2-3mm/s之间,频谱在1倍频(25Hz)处有主导峰值。
分析判断过程:
- 初步评估统计方法:仅使用RMS值的3σ阈值,发现启动阶段RMS可达6mm/s(正常),导致误报。若增加“转速上下文”(通过转速传感器或从频谱基频估计),可将上下文异常纳入考虑,但统计方法难以建模多变量联合分布。
- 尝试机器学习方法:使用孤立森林,输入特征为RMS、峰值因子、频谱质心、1倍频幅值、2倍频幅值。在PC上训练(使用历史正常数据2000帧),模型大小约8KB。部署后误报率降至每月4次,但仍高于目标。分析发现,孤立森林对时序相关性不敏感——轴承磨损初期表现为频谱的缓慢漂移,单帧特征仍在正常范围内。
- 转向深度学习方法:设计一个轻量级自编码器:输入为128维(每轴取128个采样点),编码器为两层全连接(128→32→8),解码器对称(8→32→128)。使用TensorFlow训练,然后通过TFLite Micro转换为INT8量化模型,模型大小约12KB。推理时,计算重建误差(MSE),阈值设为正常数据重建误差的99.9%分位数。
实际操作步骤:
// 伪代码:TinyML自编码器推理流程
void detect_anomaly(float* accel_x, float* accel_y, float* accel_z) {
// 1. 预处理:归一化到[-1, 1]
for (int i = 0; i < 128; i++) {
input[i] = (accel_x[i] - mean_x) / scale_x;
input[128 + i] = (accel_y[i] - mean_y) / scale_y;
input[256 + i] = (accel_z[i] - mean_z) / scale_z;
}
// 2. 自编码器推理(TFLite Micro)
interpreter->SetInput(input);
interpreter->Invoke();
float* output = interpreter->GetOutput();
// 3. 计算重建误差
float mse = 0;
for (int i = 0; i < 384; i++) {
float diff = input[i] - output[i];
mse += diff * diff;
}
mse /= 384;
// 4. 阈值判断
if (mse > threshold) {
trigger_alarm();
}
}
结果对比:部署自编码器后,误报率降至每月1.2次,漏报率0.8%。但代价是推理时间从孤立森林的0.3ms增加到4.2ms(仍满足10ms预算),Flash占用增加12KB(总占用约80KB,仍在256KB内)。功耗方面,每次唤醒(采样+推理)消耗约0.8mJ,以每分钟唤醒一次计算,平均功耗约0.013mW,远低于5mW预算。
风险与代价:自编码器对未见过的正常工况(如泵转速变化)可能产生误报。解决方案是定期(每24小时)在网关上用新数据微调模型,然后通过OTA更新MCU上的权重。另一个风险是INT8量化带来的精度损失——在测试中,量化模型的AUC从0.97降至0.94,但通过将阈值降低5%可以补偿。
3.5 常见误区与总结
在异常检测基础学习中,有几个常见误区需要特别警惕:
- 误区一:将异常等同于故障。异常是统计意义上的偏离,故障是工程意义上的失效。例如,传感器校准漂移会导致持续偏差(异常),但设备本身可能正常。在TinyML中,需要结合业务逻辑(如维护记录、工况标签)来区分。
- 误区二:忽视数据分布的非平稳性。设备老化、环境温度变化都会导致正常数据的分布缓慢漂移。静态阈值或静态模型会逐渐失效。解决方案包括:定期更新模型、使用自适应阈值(如EWMA)、或设计在线学习机制。
- 误区三:在MCU上直接训练复杂模型。MCU的算力和内存无法支撑反向传播。正确的做法是:在PC/云端训练,然后通过量化、剪枝、蒸馏压缩模型,最后部署到MCU。若需在线适应,可使用简单的统计更新(如更新均值和方差)或仅更新自编码器的最后一层。
- 误区四:忽略数据预处理的重要性。在TinyML中,传感器原始数据往往包含噪声、缺失值和量纲差异。未归一化的数据会导致自编码器训练不稳定,未滤波的数据会导致误报。建议在MCU上实现轻量级滤波(如移动平均、中值滤波)和在线归一化(维护运行均值和方差)。