跳转至

对比学习在传感器数据中的应用

难度:🟡 中级 | 领域:自监督学习、传感器、人体活动识别(HAR) | 阅读时间:约 20 分钟

日常类比

学外语却没有老师批改:你能做的是听同一句话的不同录音(口音、语速),学会"这些是同一句",并区分不同句子。对比学习(Contrastive Learning)即:相似拉近、不同推远。

传感器标注极贵——让人戴手环做海量跑步/走路并标注既贵又不自然。对比学习先用未标注数据学表示,再用极少标签做分类:像先培养"乐感",再听几首示范曲就能分流派[1][4]。

摘要

本文说明 InfoNCE、温度系数、面向惯性/时序的增强策略,以及 SimCLR / BYOL / TS-TCC / CPC 在 HAR 等任务上的适配;强调小 batch 下 BYOL 的优势、线性评估与 few-shot 协议,并列出边缘部署局限与改进[1][2][3]。

1 原理

编码器 \(f\) 使同一样本两视角(正对)近、不同样本(负对)远。常用 InfoNCE(Noise-Contrastive Estimation)损失[6]:

import torch
import torch.nn.functional as F

def info_nce_loss(z_i, z_j, temperature=0.07):
    batch_size = z_i.shape[0]
    z_i, z_j = F.normalize(z_i, dim=1), F.normalize(z_j, dim=1)
    z = torch.cat([z_i, z_j], dim=0)
    sim = torch.mm(z, z.T) / temperature
    labels = torch.cat([
        torch.arange(batch_size, 2 * batch_size),
        torch.arange(batch_size)
    ]).to(z.device)
    mask = torch.eye(2 * batch_size, dtype=torch.bool, device=z.device)
    sim.masked_fill_(mask, -1e9)
    return F.cross_entropy(sim, labels)
温度 \(\tau\) 效果 适用
很小(如 0.01) 梯度盯最难负样本 边界清晰
~0.07 SimCLR 常用默认[1] 通用起点
~0.1 更宽松 噪声数据
很大 难易几乎不分 少用

2 时序传感器增强

图像翻转/裁剪不能照搬:加速度"上下翻转"会改重力语义。需保物理含义的增强[7]。

增强 直觉 注意
Jittering 加传感器噪声 \(\sigma\) 勿过大
Scaling 动作幅度差异 通道可共享或独立
Time warp 执行速度差异 插值保持连续
Permutation 打乱片段 可能伤长程依赖
Rotation 佩戴角度(三轴) 勿随意对非向量通道
Channel dropout 通道故障 概率宜低
Cropping 截取片段 对齐长度

UCI-HAR 类消融常见趋势(示意,非跨实现承诺)[4][5]:

增强组合 线性评估趋势
无增强 基准最低
Jitter 明显升
Jitter+Scale 再升
+TimeWarp 通常更好
随机组合 2 种 常接近最优档

3 SimCLR 适配

用 1D CNN 替 ResNet;投影头仅预训练使用[1][9]。

import torch.nn as nn

class SensorSimCLR(nn.Module):
    def __init__(self, input_channels=6, hidden_dim=256, proj_dim=128):
        super().__init__()
        self.encoder = nn.Sequential(
            nn.Conv1d(input_channels, 32, 8, padding=4), nn.ReLU(), nn.MaxPool1d(2),
            nn.Conv1d(32, 64, 5, padding=2), nn.ReLU(), nn.MaxPool1d(2),
            nn.Conv1d(64, 128, 3, padding=1), nn.ReLU(),
            nn.AdaptiveAvgPool1d(1),
        )
        self.projector = nn.Sequential(
            nn.Linear(128, hidden_dim), nn.ReLU(), nn.Linear(hidden_dim, proj_dim)
        )

    def forward(self, x):
        h = self.encoder(x).squeeze(-1)
        return h, self.projector(h)

SimCLR 依赖大 batch 提供负样本;边缘内存紧时吃力。

4 BYOL:无负样本

BYOL(Bootstrap Your Own Latent):online 网络预测 target(EMA)输出,无需负样本,小 batch 更稳[2]。适合设备端/小批量预训练。

5 HAR 案例

数据集如 UCI-HAR(多用户、多活动)。标注极少时,对比预训练 + 线性/微调常显著优于同比例纯监督[4][5]。

设定 方法 趋势
全标注监督 CNN 上界
预训练+全量线性 SimCLR 等 接近上界
预训练+1%–10% 标注 对比+线性 远好于同比例纯监督
跨用户 few-shot 原型/KNN 迁移关键能力

6 表示评估与方法对比

评估 优点 缺点
线性探测 隔离表示质量 低估非线性
KNN 无需再训头 算距离贵
全微调 接近部署上限 混入适应效应
t-SNE / Silhouette 直观/无标签 定性或敏感
数据集(示意) 全监督 SimCLR BYOL TS-TCC[3] CPC[6]
UCI-HAR 最高档 接近 接近 常略优 略低
PAMAP2 等 最高档 接近 接近 时序建模强 依赖预测视野

TS-TCC 显式做时间/上下文对比,传感器上常优于原版视觉 SimCLR[3]。

7 实践要点

  • 必选增强:Jitter + Scale;推荐 Time warp;慎用 Permutation;避免无物理意义的翻转。
  • \(\tau\) 从 ~0.07 起;SimCLR batch 尽量大,否则转 BYOL。
  • 预训练 epoch 数百量级常见(数据量通常小于视觉)。
  • 标注 <10% 或要跨设备/用户迁移时优先对比预训练[5]。

8 局限、挑战与可改进方向

1. 增强可能破坏语义

局限:Permutation/过强 warp 把"走路"扭成不像走路,正对变假正对。 改进:按模态白名单增强;用标签子集做增强毒性抽检;物理约束(重力轴)。

2. 负样本与小 batch

局限:端侧 batch 小,InfoNCE 退化;假负对(同活动不同窗)伤害表示。 改进:BYOL/SimSiam;内存队列负样本;时间邻近排除假负[2][3]。

3. 域偏移(设备/佩戴位置)

局限:手机裤袋 vs 手表预训练,线性评估虚高、现场崩。 改进:多位置混合预训练;测试时适配;明确报告跨域协议[5]。

4. 算力与能耗

局限:双视角前向约 2× 监督一轮,MCU 难承受长时间预训练。 改进:网关/云上预训练、端上只微调头;蒸馏到小编码器;降投影维与通道。

5. 评测泡沫

局限:只报全数据线性准确率,掩盖 few-shot 与漂移。 改进:固定 1%/5%/10% 与跨用户协议;报告置信区间与种子[5][10]。

参考文献

[1] T. Chen et al., "A Simple Framework for Contrastive Learning of Visual Representations," ICML, 2020. [2] J.-B. Grill et al., "Bootstrap Your Own Latent: A New Approach to Self-Supervised Learning," NeurIPS, 2020. [3] E. Eldele et al., "Time-Series Representation Learning via Temporal and Contextual Contrasting," IJCAI, 2021. [4] C. I. Tang et al., "Exploring Contrastive Learning in Human Activity Recognition," arXiv:2011.11542, 2020. [5] H. Haresamudram et al., "Assessing the State of Self-Supervised Human Activity Recognition," IMWUT, 2022. [6] A. van den Oord et al., "Representation Learning with Contrastive Predictive Coding," arXiv:1807.03748, 2018. [7] T. T. Um et al., "Data Augmentation of Wearable Sensor Data for Parkinson's Disease Monitoring," ICMI, 2017. [8] A. Saeed et al., "Multi-task Self-Supervised Learning for Human Activity Detection," IMWUT, 2019. [9] B. Khaertdinov et al., "Contrastive Self-Supervised Learning for Sensor-Based HAR," IEEE JBHI, 2022. [10] H. Yuan et al., "Self-Supervised Contrastive Learning for Medical Time Series: A Systematic Review," Sensors, 2024. [11] J. Y. Franceschi et al., "Unsupervised Scalable Representation Learning for Multivariate Time Series," NeurIPS, 2019. [12] K. Sohn, "Improved Deep Metric Learning with Multi-class N-pair Loss," NeurIPS, 2016.