4、异常检测基础:回顾TinyML中常用的异常检测方法及其适用条件
TinyML设备(如振动传感器节点、电机监测器、工业数据采集器)长期部署在物理环境中,其采集到的信号往往呈现高度重复的模式。异常检测的核心任务,就是从这些看似“正常”的数据流中识别出偏离预期的模式。在资源受限的MCU上,我们无法运行复杂的深度学习模型,因此需要根据数据特性、算力预算和部署环境,选择最合适的检测策略。本章将系统回顾阈值检测、统计方法、自编码器和孤立森林四类主流方法,并重点分析它们在采样漂移、安装松动和噪声干扰场景下的适用边界。
上图展示了TinyML异常检测方法选型的整体逻辑。传感器数据流经过特性分析(采样漂移、安装松动、噪声干扰)后,结合部署约束(RAM、Flash、实时性),在四种方法中做出选择。下面我们将逐一深入分析每种方法的原理、实现要点和适用场景。
4.1 阈值检测:最直接但最脆弱的防线
核心原理
阈值检测是最基础的异常检测方法,其核心思想是:如果某个特征值(如振动加速度的RMS值、峰值、温度读数)超出预设的上下限,则判定为异常。在TinyML中,这通常表现为对传感器原始数据或简单统计特征(均值、峰值、峰峰值)的实时比较。
// 阈值检测伪代码示例
float threshold_high = 12.5f; // 高阈值
float threshold_low = 2.0f; // 低阈值
float current_rms = compute_rms(sensor_buffer, 128);
if (current_rms > threshold_high || current_rms < threshold_low) {
trigger_alarm();
}
判断方法
- 固定阈值:在部署前通过实验确定阈值,适用于工况稳定的场景。
- 自适应阈值:根据历史数据的滑动窗口动态调整阈值,适应缓慢漂移。
- 多级阈值:设置警告阈值和报警阈值,分级响应。
案例拆解:电机轴承磨损监测
某工厂在电机轴承上部署了加速度传感器,采样率4kHz,每次采集256个样本。初始时,轴承振动RMS值为5.0±0.3。工程师设定高阈值为8.0,低阈值为3.0。运行3个月后,RMS值缓慢上升至7.2,但未触发报警。第4个月,RMS值突然跳变至9.5,触发报警。停机检查发现轴承已严重磨损。
常见误区
- 阈值设置过紧导致频繁误报,过松导致漏报。
- 忽略传感器自身噪声对阈值的影响。
- 未考虑温度变化对振动信号的影响。
4.2 统计方法:利用分布特征识别异常
核心原理
统计方法假设正常数据服从某种概率分布(如高斯分布),通过计算新样本与分布模型的偏离程度来判断异常。常用方法包括:Z-score、Grubbs检验、3σ原则、以及基于滑动窗口的统计过程控制(SPC)。
| 方法 | 计算复杂度 | 内存占用 | 适用场景 |
|---|---|---|---|
| Z-score | O(n) | 低(仅需均值/方差) | 平稳信号,单变量 |
| 滑动窗口SPC | O(n) | 中(需缓存窗口数据) | 缓慢漂移检测 |
| 多元高斯 | O(n²) | 高(协方差矩阵) | 多传感器融合 |
判断方法
- 计算历史正常数据的均值μ和标准差σ。
- 对每个新样本计算Z-score = (x - μ) / σ。
- 若|Z| > 3,则判定为异常(置信度99.7%)。
案例拆解:环境温度补偿
某户外监测节点采集环境温度,用于补偿振动传感器的零漂。正常温度范围为20-30℃,但夏季中午可达35℃。若直接使用固定阈值,35℃会被误判为异常。采用滑动窗口统计方法后,窗口大小为24小时,计算每个时刻的均值和标准差。当温度超过“当前时刻历史均值+2σ”时,才触发异常。这样既避免了误报,又能捕捉到异常温升。
4.3 自编码器:利用重构误差检测异常
核心原理
自编码器是一种神经网络,通过编码器将输入压缩为低维表示,再通过解码器重构输入。训练时仅使用正常数据,使重构误差最小化。推理时,若重构误差超过阈值,则判定为异常。在TinyML中,通常使用1D-CNN或LSTM自编码器处理时序信号。
// 自编码器模型结构(TensorFlow Lite Micro示例)
model = Sequential([
Input(shape=(64, 1)), // 64个时间步,单通道
Conv1D(16, 3, activation='relu'),
MaxPooling1D(2),
Conv1D(8, 3, activation='relu'),
UpSampling1D(2),
Conv1D(1, 3, activation='linear')
])
// 训练后转换为.tflite格式,部署到MCU
判断方法
- 重构误差指标:MSE(均方误差)或MAE(平均误差)。
- 阈值设定:在验证集上计算误差分布,取95%或99%分位数作为阈值。
- 窗口化处理:对连续时间序列,使用滑动窗口(如64个样本)输入模型。
案例拆解:泵体振动异常检测
某水泵站部署了振动传感器,采样率2kHz。使用64点窗口的1D-CNN自编码器,模型大小约12KB,RAM占用8KB。训练数据为正常运行3天的振动信号(约500万样本)。验证集上MSE均值为0.002,标准差0.001。设定阈值为0.005(均值+3σ)。部署后第7天,MSE突然升至0.02,触发报警。检查发现泵体地脚螺栓松动,紧固后MSE恢复正常。
常见误区
- 训练数据中混入异常样本,导致模型“学会”重构异常。
- 未对输入数据进行归一化,导致重构误差被量纲主导。
- 忽略时间相关性,将每个样本独立输入,丢失时序特征。
4.4 孤立森林:高效的多变量异常检测
核心原理
孤立森林基于随机森林思想,通过随机分割特征空间来“孤立”异常点。异常点通常位于特征空间的稀疏区域,因此需要更少的分割次数就能被隔离。在TinyML中,由于内存限制,通常使用简化版(如iForest-Lite)或仅使用少量树(如10棵)。
判断方法
- 构建t棵孤立树,每棵树随机选择特征和分割值。
- 计算每个样本在所有树中的平均路径长度。
- 路径长度越短,异常得分越高。
- 设定异常得分阈值(如0.6)进行判定。
案例拆解:多传感器融合的异常检测
某工业机器人关节部署了6个传感器(3轴加速度+3轴陀螺仪)。使用孤立森林检测异常,每棵树最大深度10,树数量20。特征维度为6,每个特征归一化到[0,1]。训练数据为正常运行100小时的样本(约10万条)。测试时,当机器人碰撞到障碍物时,异常得分从0.2升至0.85,成功触发报警。而使用单变量阈值检测,由于碰撞信号持续时间极短(<50ms),难以捕捉。
常见误区
- 特征未标准化,导致某些维度主导分割。
- 树数量过多,超出MCU内存限制。
- 未考虑时间窗口,将瞬时噪声误判为异常。
4.5 方法对比与选型决策
| 方法 | 算力需求 | 内存需求 | 抗噪能力 | 漂移适应性 | 多变量支持 | 部署难度 |
|---|---|---|---|---|---|---|
| 阈值检测 | 极低 | 极低 | 弱 | 差 | 否 | 极简 |
| 统计方法 | 低 | 低 | 中 | 中 | 有限 | 简单 |
| 自编码器 | 中高 | 中 | 强 | 强 | 是 | 复杂 |
| 孤立森林 | 中 | 中 | 中 | 中 | 是 | 中等 |
选型决策流程
- 第一步:评估数据特性。若数据平稳且单变量,优先选择阈值或统计方法。
- 第二步:评估算力预算。若Flash < 64KB且RAM < 8KB,排除自编码器。
- 第三步:评估异常类型。若异常为突发脉冲,阈值检测可能有效;若为缓慢漂移,统计方法更合适。
- 第四步:考虑多传感器融合需求。若需融合多个信号,孤立森林或自编码器更合适。
4.6 总结与复盘
本章回顾了四种TinyML异常检测方法,每种方法都有其独特的适用边界。阈值检测简单但脆弱,适合工况稳定的场景;统计方法在平稳数据上表现良好,且计算开销低;自编码器能捕捉复杂模式,但需要充足的训练数据和算力;孤立森林擅长多变量异常检测,但需注意内存限制。在实际项目中,没有“万能”的方法,必须根据数据特性、硬件约束和业务需求进行综合选型。