4、重复样本检测:基于特征相似度、哈希、距离度量的重复样本识别方法

TinyML 场景中,传感器数据采集往往具有高频率、长时间、多通道的特点,重复样本的产生几乎不可避免。无论是设备重启后的缓存残留、多传感器协同采集时的重叠窗口,还是数据增强操作引入的近似复制,重复样本都会导致训练集有效信息密度下降,模型对重复模式过拟合,并显著拉长边缘设备上的训练时间。本章围绕重复样本检测的三种核心思路——特征相似度、哈希指纹、距离度量——展开,帮助学习者在资源受限条件下选择最合适的去重策略。

重复样本检测方法体系 原始数据集(含重复样本) 哈希指纹法 MD5 / SHA-1 / 感知哈希 精确匹配 · 计算快 对噪声敏感 特征相似度法 统计特征 / 降维特征 余弦相似度 / 皮尔逊 适合近似重复 距离度量法 欧氏距离 / 曼哈顿距离 DTW / 马氏距离 适合时序信号 去重后数据集 保留唯一样本 · 标注重复簇ID 精确去重 近似去重 时序去重

4.1 核心原理:为什么重复样本会“隐形”伤害模型

重复样本并非总是以完全相同的字节形式出现。在 TinyML 数据流水线中,重复样本通常表现为三种形态:完全重复(字节级一致)、近似重复(数值微小波动但语义相同)、结构性重复(不同样本来自同一物理事件的不同窗口切片)。完全重复可以通过哈希直接识别,但后两种形态需要借助特征相似度和距离度量才能有效捕获。

从信息论角度看,重复样本不增加数据集的熵,却会放大模型对特定模式的权重。例如,在关键词唤醒(KWS)任务中,如果某个“Hey Device”音频片段被重复 50 次,模型会过度拟合该片段的噪声特性,导致真实场景下泛化能力下降。更严重的是,在联邦学习或增量训练场景中,重复样本会扭曲梯度更新方向,使模型收敛到局部最优。

核心洞察:去重的目标不是简单删除数据,而是识别并保留每个“信息等价类”的代表样本。对于 TinyML 而言,去重还能直接减少存储占用和训练时间——在 32KB RAM 的 MCU 上,每减少 100 个重复样本,就可能节省数秒的训练时间。

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 以上才应判定为重复。

工程经验:在 TinyML 设备上,建议先计算 4-6 个统计特征(均值、方差、峰值、RMS、过零率、频谱质心),然后使用余弦相似度。这比直接计算原始波形的距离快 10-20 倍,且对采样率不敏感。

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%)。但进一步分析发现,同一受试者的同一动作类型(如“向前跌倒”)在不同试验中产生的波形高度相似,属于近似重复。

分析过程:团队采用两阶段去重策略:

  1. 阶段一:计算每个窗口的 6 个统计特征(每通道的均值、方差、峰值),组成 36 维特征向量,使用余弦相似度进行粗筛,阈值设为 0.97。
  2. 阶段二:对粗筛后剩余的候选重复对,使用 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 数据清洗的第一道防线。哈希法适合快速过滤完全重复,特征相似度法适合捕获近似重复,距离度量法适合处理时序变形。实际工程中,建议采用“哈希粗筛 → 特征相似度精筛 → 距离度量兜底”的三级流水线,并根据数据特性动态调整阈值。去重完成后,务必检查各类别的样本分布,确保去重没有引入类别不平衡问题。