4、重复样本检测:基于特征相似度、哈希、距离度量的重复样本识别方法
TinyML 场景中,传感器数据采集往往具有高频率、长时间、多通道的特点,重复样本的产生几乎不可避免。无论是设备重启后的缓存残留、多传感器协同采集时的重叠窗口,还是数据增强操作引入的近似复制,重复样本都会导致训练集有效信息密度下降,模型对重复模式过拟合,并显著拉长边缘设备上的训练时间。本章围绕重复样本检测的三种核心思路——特征相似度、哈希指纹、距离度量——展开,帮助学习者在资源受限条件下选择最合适的去重策略。
4.1 核心原理:为什么重复样本会“隐形”伤害模型
重复样本并非总是以完全相同的字节形式出现。在 TinyML 数据流水线中,重复样本通常表现为三种形态:完全重复(字节级一致)、近似重复(数值微小波动但语义相同)、结构性重复(不同样本来自同一物理事件的不同窗口切片)。完全重复可以通过哈希直接识别,但后两种形态需要借助特征相似度和距离度量才能有效捕获。
从信息论角度看,重复样本不增加数据集的熵,却会放大模型对特定模式的权重。例如,在关键词唤醒(KWS)任务中,如果某个“Hey Device”音频片段被重复 50 次,模型会过度拟合该片段的噪声特性,导致真实场景下泛化能力下降。更严重的是,在联邦学习或增量训练场景中,重复样本会扭曲梯度更新方向,使模型收敛到局部最优。
4.2 哈希指纹法:最快但最“严格”的去重手段
哈希指纹法的核心思想是为每个样本计算一个固定长度的哈希值,通过比较哈希值判断样本是否重复。在 TinyML 场景中,常用的哈希算法包括 MD5、SHA-1 以及针对传感器数据优化的感知哈希(pHash)。
4.2.1 精确哈希 vs 感知哈希
| 维度 | 精确哈希(MD5/SHA-1) | 感知哈希(pHash/aHash) |
|---|---|---|
| 匹配粒度 | 字节级完全一致 | 感知级别近似一致 |
| 计算开销 | 极低(微秒级) | 中等(需特征提取) |
| 抗噪声能力 | 无(1 bit 变化即不同) | 较强(容忍小幅噪声) |
| 适用场景 | 缓存数据、日志去重 | 图像、音频、传感器波形 |
| 误判风险 | 极低(碰撞概率可忽略) | 中等(相似但不同样本可能误判) |
在 TinyML 实践中,精确哈希适合处理采集日志中的重复记录,而感知哈希更适合处理传感器信号。以加速度计数据为例,同一动作的两次采集可能因采样抖动产生微小差异,精确哈希无法识别,但感知哈希通过离散余弦变换(DCT)提取低频分量,可以稳定捕获“形状相似”的波形。
// 伪代码:感知哈希计算流程(适用于 IMU 窗口数据)
function computePHash(windowData):
// 1. 将窗口数据归一化到 0-255
normalized = normalize(windowData, 0, 255)
// 2. 缩放到 32x32 网格(降采样)
resized = resize(normalized, 32, 32)
// 3. 计算 DCT(离散余弦变换)
dct = applyDCT(resized)
// 4. 取左上角 8x8 低频系数
lowFreq = dct[0:8][0:8]
// 5. 计算中值,生成 64-bit 哈希
median = computeMedian(lowFreq)
hash = (lowFreq > median) ? 1 : 0
return hash
4.3 特征相似度法:平衡精度与计算成本
当重复样本存在非线性变形或通道间偏移时,哈希方法往往力不从心。特征相似度法通过提取样本的统计特征或嵌入特征,在低维空间中计算相似度,从而识别“语义重复”的样本。
4.3.1 常用特征与相似度指标
- 统计特征:均值、方差、峰值、过零率、频谱质心等。对于 1D 传感器信号,这些特征计算简单,适合 MCU 实时处理。
- 降维特征:PCA 主成分、自编码器中间层输出。适合在网关或云端预处理后,将低维特征下发到边缘设备。
- 相似度指标:余弦相似度(Cosine Similarity)、皮尔逊相关系数(Pearson Correlation)、Jaccard 相似度(适用于二值特征)。
余弦相似度是最常用的指标,其计算公式为:
cosine_similarity(A, B) = (A · B) / (||A|| * ||B||)
当余弦相似度大于阈值(如 0.98)时,判定两个样本为重复。阈值的选择需要根据数据分布动态调整——对于高噪声的振动信号,阈值可能需要降低到 0.95;而对于稳定的温度读数,0.99 以上才应判定为重复。
4.4 距离度量法:处理时序信号与多通道数据
对于加速度计、陀螺仪、麦克风等时序信号,样本的重复往往体现在时间轴上的“形状相似”而非逐点相等。距离度量法通过计算样本间的距离来判断重复性,其中欧氏距离和动态时间规整(DTW)是最常用的两种。
4.4.1 欧氏距离与曼哈顿距离
欧氏距离适用于长度相同且已对齐的样本窗口。假设两个窗口分别为 A 和 B,每个窗口包含 N 个采样点,则欧氏距离为:
euclidean_distance = sqrt( Σ (A[i] - B[i])² ) for i = 1 to N
曼哈顿距离则使用值之和,对异常值更鲁棒,计算量也更小(无需平方根运算),适合在 MCU 上使用整数运算实现。
4.4.2 动态时间规整(DTW)
DTW 允许两个序列在时间轴上“扭曲”对齐,非常适合识别同一动作因速度变化产生的重复样本。但 DTW 的时间复杂度为 O(N²),在资源受限设备上需要限制窗口长度或使用下界剪枝(如 LB_Keogh)加速。
| 方法 | 时间复杂度 | 内存占用 | 适用场景 |
|---|---|---|---|
| 欧氏距离 | O(N) | O(1) | 对齐良好的窗口 |
| 曼哈顿距离 | O(N) | O(1) | 整数运算环境 |
| DTW(完整) | O(N²) | O(N²) | 离线去重 |
| DTW(LB_Keogh) | O(N) | O(N) | 在线近似去重 |
4.5 案例拆解:IMU 跌倒检测数据集的重复样本清洗
某团队开发基于 IMU 的跌倒检测模型,数据集包含 10 名受试者的 5,000 个动作窗口,每个窗口 128 个采样点(三轴加速度 + 三轴角速度,共 6 通道)。训练时发现模型在验证集上准确率尚可,但在真实场景测试中误报率高达 15%。初步分析怀疑是训练集中存在大量重复样本。
初始排查:使用 MD5 精确哈希对 5,000 个窗口进行去重,发现仅 120 个完全重复样本(2.4%)。但进一步分析发现,同一受试者的同一动作类型(如“向前跌倒”)在不同试验中产生的波形高度相似,属于近似重复。
分析过程:团队采用两阶段去重策略:
- 阶段一:计算每个窗口的 6 个统计特征(每通道的均值、方差、峰值),组成 36 维特征向量,使用余弦相似度进行粗筛,阈值设为 0.97。
- 阶段二:对粗筛后剩余的候选重复对,使用 DTW 计算原始波形的距离,阈值设为窗口能量的 5%。
关键参数:余弦相似度阈值 0.97 是通过绘制相似度分布直方图确定的——正常样本对的相似度集中在 0.85-0.95,而重复样本对集中在 0.97-1.0,存在明显分界。
执行结果:两阶段去重共识别出 1,150 个重复样本(23%),删除后保留 3,850 个唯一样本。重新训练后,真实场景误报率从 15% 降至 6.8%,模型大小从 48KB 压缩至 41KB。
风险与代价:DTW 计算耗时较长,在 PC 上处理 5,000 个窗口耗时约 40 分钟。团队通过随机抽样 500 对进行人工验证,确认去重准确率约 98%,误删的 2% 样本为“相似但语义不同”的动作(如同为“跌倒”但方向不同)。
4.6 常见误区与总结复盘
误区一:只做精确哈希去重。精确哈希只能识别字节级重复,对传感器数据中的微小噪声无能为力。在 TinyML 场景中,近似重复往往占重复样本的大多数。
误区二:盲目使用 DTW 处理所有数据。DTW 虽然强大,但计算成本高。对于已经对齐的窗口,欧氏距离或余弦相似度足够;只有存在明显时间扭曲时才需要 DTW。
误区三:忽略标签一致性。去重时如果两个样本特征相似但标签不同(如“跌倒”与“下蹲”),不应直接删除,而应标记为“标签冲突”并人工复核。这类样本往往是标注错误的高发区。
误区四:在设备端执行全量去重。TinyML 设备内存有限,建议采用“滑动窗口 + 增量哈希”策略:设备端只保留最近 N 个样本的哈希值,新样本先与缓存比较,再决定是否上传到云端进行深度去重。
总结:重复样本检测是 TinyML 数据清洗的第一道防线。哈希法适合快速过滤完全重复,特征相似度法适合捕获近似重复,距离度量法适合处理时序变形。实际工程中,建议采用“哈希粗筛 → 特征相似度精筛 → 距离度量兜底”的三级流水线,并根据数据特性动态调整阈值。去重完成后,务必检查各类别的样本分布,确保去重没有引入类别不平衡问题。