4、异常检测模型概览:统计方法、机器学习方法(隔离森林、One-Class SVM)、深度学习方法(自编码器、LSTM)在TinyML中的适用性

在TinyML场景下选择异常检测模型,本质上是在“检测精度”“计算开销”“内存占用”和“部署难度”四者之间做权衡。传感器数据通常以时间序列形式存在,异常可能表现为单点突变、趋势漂移、周期性破坏或事件型脉冲。本章从统计方法、经典机器学习方法和深度学习方法三条技术路线出发,逐一分析其核心原理、在MCU级硬件上的适配性,并给出选型建议与实战注意事项。

TinyML异常检测模型选型全景图 统计方法 机器学习方法 深度学习方法 均值/方差 3σ / IQR EWMA Grubbs检验 隔离森林 One-Class SVM KNN距离 HBOS 自编码器 LSTM-AE TCN Transformer TinyML部署约束评估 RAM占用 Flash占用 推理延迟 训练数据需求 可解释性 统计方法 ★★★ 机器学习 ★★☆ 深度学习 ★☆☆ ★ 越多表示在典型MCU(如Cortex-M4, 128KB RAM)上越容易部署

4.1 统计方法:轻量级基线

核心原理

统计方法假设正常数据服从某种概率分布(通常是正态分布),异常是偏离该分布的小概率事件。最基础的是均值-方差法:计算滑动窗口内的均值μ和标准差σ,当新样本x满足|x-μ| > k·σ(k通常取3)时判定为异常。改进版本包括指数加权移动平均(EWMA),对近期数据赋予更高权重,适合缓慢漂移场景;Grubbs检验则用于检测单变量数据集中的离群点。

判断方法与操作流程

  1. 数据预处理:去除传感器噪声,必要时做中值滤波或低通滤波。
  2. 分布检验:用Shapiro-Wilk或KS检验确认数据是否近似正态;若偏态严重,考虑Box-Cox变换。
  3. 参数估计:在正常工况下采集至少1000个样本,计算μ和σ。
  4. 阈值设定:根据误报容忍度选择k值(工业场景常用3~5)。
  5. 在线检测:每个新样本计算z-score,超过阈值即触发报警。

案例拆解:电机振动监测

某工厂在STM32F103上部署电机轴承振动监测。初始使用固定阈值法,但电机启停阶段振动幅值波动大,误报率高达30%。改用EWMA方法后,设置衰减因子λ=0.3,窗口长度N=50,检测灵敏度提升且误报率降至5%。关键参数如下:

参数固定阈值EWMA
误报率30%5%
检测延迟2s0.8s
RAM占用0.2KB0.3KB
Flash占用1KB1.2KB

常见误区与总结

误区1:直接对原始信号计算均值方差,忽略传感器漂移和温度影响。建议先做差分或归一化。
误区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
适合MCUCortex-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 判定为异常
}

常见误区与调优建议

经验:隔离森林对特征维度敏感,建议先用PCA降维到5-10维。One-Class SVM的核函数选择至关重要,RBF核的γ参数需通过交叉验证确定。在MCU上部署时,可将SVM的核计算查表化,用分段线性近似替代exp函数。
风险:两类方法都假设训练数据纯净。若训练集中混入异常,模型会“学习”异常模式。建议训练前用统计方法做一次粗筛。

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时,采用以下优化:

  1. 将LSTM权重量化为int8,激活函数用查表法实现。
  2. 使用CMSIS-NN库加速矩阵乘法,推理时间从120ms降至35ms。
  3. 采用滑动窗口重叠50%,减少计算冗余。

实际运行3个月后,成功提前7天预警轴承磨损,而传统振动阈值法在故障前2天才报警。

常见误区与总结

关键认知:深度学习并非TinyML异常检测的首选。只有当数据具有强非线性、时序依赖复杂且MCU资源充足(≥512KB Flash,≥256KB RAM)时才值得考虑。对于大多数传感器监测场景,统计方法或隔离森林已能取得满意效果。

另一个常见误区是忽视数据标准化。LSTM对输入尺度敏感,必须使用训练时的均值和标准差进行归一化,且这些统计量需存储在设备端。

4.4 选型决策框架与综合对比

在实际项目中,建议按以下步骤决策:

评估维度统计方法隔离森林One-Class SVM自编码器LSTM-AE
RAM需求<1KB10-50KB20-100KB5-20KB50-200KB
Flash需求<2KB50-100KB50-150KB20-50KB100-300KB
推理延迟(ms)<0.11-55-202-1020-100
训练数据量100+1000+500+5000+10000+
异常类型点异常点/上下文点/上下文点/模式时序/模式
可解释性高中低低极低

决策流程

  1. 第一步:明确异常类型(点异常、上下文异常、集合异常)。
  2. 第二步:评估MCU资源上限(RAM/Flash/算力)。
  3. 第三步:若RAM<10KB且只需点异常检测,选统计方法。
  4. 第四步:若RAM在10-50KB且特征维度<20,选隔离森林。
  5. 第五步:若需检测复杂时序模式且RAM>100KB,考虑LSTM-AE并做量化。
工程建议:无论选择哪种模型,都应先在PC端用历史数据做离线验证,计算AUC-PR曲线,确定最优阈值。部署后保留前两周的原始数据用于模型校准,因为实际部署环境的噪声分布可能与训练数据存在差异。

最后需要强调的是,模型选择不是一次性的。随着设备运行时间增长,数据分布可能发生漂移,需要设计周期性重训练机制。对于TinyML设备,通常采用“边缘采集+云端训练+OTA更新”的模式,在设备端仅保留推理引擎。