4、异常检测模型概览:统计方法、机器学习方法(隔离森林、One-Class SVM)、深度学习方法(自编码器、LSTM)在TinyML中的适用性
在TinyML场景下选择异常检测模型,本质上是在“检测精度”“计算开销”“内存占用”和“部署难度”四者之间做权衡。传感器数据通常以时间序列形式存在,异常可能表现为单点突变、趋势漂移、周期性破坏或事件型脉冲。本章从统计方法、经典机器学习方法和深度学习方法三条技术路线出发,逐一分析其核心原理、在MCU级硬件上的适配性,并给出选型建议与实战注意事项。
4.1 统计方法:轻量级基线
核心原理
统计方法假设正常数据服从某种概率分布(通常是正态分布),异常是偏离该分布的小概率事件。最基础的是均值-方差法:计算滑动窗口内的均值μ和标准差σ,当新样本x满足|x-μ| > k·σ(k通常取3)时判定为异常。改进版本包括指数加权移动平均(EWMA),对近期数据赋予更高权重,适合缓慢漂移场景;Grubbs检验则用于检测单变量数据集中的离群点。
判断方法与操作流程
- 数据预处理:去除传感器噪声,必要时做中值滤波或低通滤波。
- 分布检验:用Shapiro-Wilk或KS检验确认数据是否近似正态;若偏态严重,考虑Box-Cox变换。
- 参数估计:在正常工况下采集至少1000个样本,计算μ和σ。
- 阈值设定:根据误报容忍度选择k值(工业场景常用3~5)。
- 在线检测:每个新样本计算z-score,超过阈值即触发报警。
案例拆解:电机振动监测
某工厂在STM32F103上部署电机轴承振动监测。初始使用固定阈值法,但电机启停阶段振动幅值波动大,误报率高达30%。改用EWMA方法后,设置衰减因子λ=0.3,窗口长度N=50,检测灵敏度提升且误报率降至5%。关键参数如下:
| 参数 | 固定阈值 | EWMA |
|---|---|---|
| 误报率 | 30% | 5% |
| 检测延迟 | 2s | 0.8s |
| RAM占用 | 0.2KB | 0.3KB |
| Flash占用 | 1KB | 1.2KB |
常见误区与总结
误区2:窗口大小固定不变。对于周期性信号,窗口应至少覆盖2个完整周期。
误区3:认为统计方法只能处理单变量。实际上可以通过马氏距离扩展到多变量。
统计方法的最大优势是计算量极小(每次检测仅需几次乘加运算),适合在中断服务程序中实时执行。但其局限性在于对非线性关系和复杂时序依赖无能为力。
4.2 机器学习方法:隔离森林与One-Class SVM
核心原理
隔离森林(Isolation Forest)基于“异常点更容易被孤立”的思想,通过随机切分特征空间,异常点所需的切分次数更少,因此路径长度更短。One-Class SVM则试图在特征空间中找到一个超球面,将大部分正常数据包含在内,球外的点即为异常。两者都是无监督方法,只需正常数据训练。
TinyML适配性分析
| 维度 | 隔离森林 | One-Class SVM |
|---|---|---|
| 训练方式 | 离线训练,在线推理 | 离线训练,在线推理 |
| 模型大小 | 100棵树×深度10≈50KB | 支持向量数×特征维度 |
| 推理计算量 | O(log n) 每棵树 | O(n_sv) 核函数计算 |
| 内存占用 | 约10-50KB | 约20-100KB |
| 适合MCU | Cortex-M4及以上 | Cortex-M7或更高 |
操作流程与实战场景
以智能电表电流异常检测为例。采集正常用电模式下的电流波形,提取特征:有效值、峰值因数、谐波畸变率、功率因数。使用隔离森林训练,设置树数量50、子采样大小256。部署到ESP32时,将模型转换为C数组,推理时间约3ms/样本。
// 隔离森林推理伪代码
float isolation_score(float* features, int n_features) {
float path_len = 0;
for (int t = 0; t < n_trees; t++) {
path_len += traverse_tree(&trees[t], features);
}
float avg_path = path_len / n_trees;
float anomaly_score = pow(2, -avg_path / c_factor);
return anomaly_score; // > 0.6 判定为异常
}
常见误区与调优建议
4.3 深度学习方法:自编码器与LSTM
核心原理
自编码器(Autoencoder)通过编码器将输入压缩为低维潜变量,再由解码器重建输入。训练目标是让重建误差最小化,异常样本的重建误差通常远大于正常样本。LSTM自编码器(LSTM-AE)则利用LSTM单元捕捉时间序列的长期依赖,适合具有复杂时序模式的场景。
TinyML部署挑战
- 内存瓶颈:一个简单的自编码器(输入16维,隐藏层8维)需要约200个参数,占用0.8KB;但LSTM单元参数量是前馈网络的4倍。
- 计算开销:LSTM的逐时间步递推计算在MCU上效率较低,需使用CMSIS-DSP库优化矩阵运算。
- 量化需求:浮点模型直接部署会占用大量Flash,需转换为int8量化模型,精度损失控制在2%以内。
案例拆解:工业设备预测性维护
某风电齿轮箱振动监测项目,使用LSTM-AE检测早期故障。传感器以1kHz采样,每10秒生成一个1000点的窗口。在PC上训练LSTM-AE(隐藏单元32,时间步20),重建误差阈值设为训练集误差分布的99.9%分位数。部署到STM32H743时,采用以下优化:
- 将LSTM权重量化为int8,激活函数用查表法实现。
- 使用CMSIS-NN库加速矩阵乘法,推理时间从120ms降至35ms。
- 采用滑动窗口重叠50%,减少计算冗余。
实际运行3个月后,成功提前7天预警轴承磨损,而传统振动阈值法在故障前2天才报警。
常见误区与总结
另一个常见误区是忽视数据标准化。LSTM对输入尺度敏感,必须使用训练时的均值和标准差进行归一化,且这些统计量需存储在设备端。
4.4 选型决策框架与综合对比
在实际项目中,建议按以下步骤决策:
| 评估维度 | 统计方法 | 隔离森林 | One-Class SVM | 自编码器 | LSTM-AE |
|---|---|---|---|---|---|
| RAM需求 | <1KB | 10-50KB | 20-100KB | 5-20KB | 50-200KB |
| Flash需求 | <2KB | 50-100KB | 50-150KB | 20-50KB | 100-300KB |
| 推理延迟(ms) | <0.1 | 1-5 | 5-20 | 2-10 | 20-100 |
| 训练数据量 | 100+ | 1000+ | 500+ | 5000+ | 10000+ |
| 异常类型 | 点异常 | 点/上下文 | 点/上下文 | 点/模式 | 时序/模式 |
| 可解释性 | 高 | 中 | 低 | 低 | 极低 |
决策流程
- 第一步:明确异常类型(点异常、上下文异常、集合异常)。
- 第二步:评估MCU资源上限(RAM/Flash/算力)。
- 第三步:若RAM<10KB且只需点异常检测,选统计方法。
- 第四步:若RAM在10-50KB且特征维度<20,选隔离森林。
- 第五步:若需检测复杂时序模式且RAM>100KB,考虑LSTM-AE并做量化。
最后需要强调的是,模型选择不是一次性的。随着设备运行时间增长,数据分布可能发生漂移,需要设计周期性重训练机制。对于TinyML设备,通常采用“边缘采集+云端训练+OTA更新”的模式,在设备端仅保留推理引擎。