3、窗口化概念:什么是滑动窗口、窗口长度与步长的定义、窗口与样本的关系

TinyML 时序建模的第一步,往往不是选择模型,而是决定“如何把连续的时间序列切成模型能吃的形状”。传感器数据以固定采样率持续产生,而神经网络通常只能处理固定长度的输入张量。滑动窗口(Sliding Window)正是连接“无限连续流”与“有限输入维度”之间的桥梁。理解窗口长度(Window Length)、步长(Step/Stride)以及窗口与样本(Sample)之间的映射关系,是后续所有特征工程、模型训练与部署优化的基础。若此环节设计不当,后续模型精度再高也难以在真实硬件上落地。

滑动窗口机制:长度、步长与样本生成 原始传感器流 t₀ tₙ 窗口 1(长度 L=6) 窗口 2(步长 S=2) 窗口 3(步长 S=2) 生成的样本集 样本1: x[0:6] → y₁ 样本2: x[2:8] → y₂ 样本3: x[4:10] → y₃ 样本4: x[6:12] → y₄ ... 样本数 ≈ (N-L)/S + 1 样本总数 = ⌊(N − L) / S⌋ + 1  |  N=序列长度, L=窗口长度, S=步长

上图展示了滑动窗口的核心机制:一个长度为 L 的窗口在原始时间序列上以固定步长 S 滑动,每滑动一次便截取一段子序列,形成一个独立的训练样本。窗口长度决定了模型每次“看到”的时间范围,步长则控制相邻样本之间的重叠程度。两者共同决定了从原始数据中能生成多少个样本,以及样本之间的信息冗余度。下面从定义、关系、设计方法与实战案例四个维度展开。

3.1 核心概念与数学定义

滑动窗口(Sliding Window)是一种数据切片技术,它将连续的时间序列 x[0], x[1], ..., x[N-1] 按固定宽度 L 切分为多个子序列。每个子序列可以表示为 x[i : i+L],其中 i 为窗口起始索引。窗口在时间轴上不断右移,每次移动的距离称为步长(Stride/Step),记作 S。当 S=1 时,相邻窗口完全错开一个采样点,重叠度最高;当 S=L 时,窗口之间无重叠,样本完全独立。

窗口长度(Window Length, L)是模型输入的时间维度大小,直接对应神经网络输入张量的 shape 第二维(第一维为 batch)。例如,一个 3 轴加速度计以 50Hz 采样,若 L=100,则每个样本包含 2 秒的加速度数据,输入张量为 (batch, 100, 3)。L 的选择需权衡:过短则丢失关键周期信息,过长则引入噪声且增加计算量。

步长(Stride, S)控制样本生成的密度。S 越小,样本重叠越多,数据增强效果越强,但训练样本间相关性高,容易导致过拟合;S 越大,样本越稀疏,可能丢失关键状态转换信息。在实时推理场景中,步长还决定了系统的响应延迟——每经过 S 个新采样点,模型才执行一次推理。

样本数量公式:给定原始序列长度 N、窗口长度 L、步长 S,生成的样本总数为:

num_samples = floor((N - L) / S) + 1

例如:N=1000, L=128, S=32 → num_samples = floor((1000-128)/32) + 1 = 28 个样本。若 S=1,则生成 873 个样本,数据量扩大 31 倍。

3.2 窗口长度与步长的设计方法

设计窗口参数需要结合信号特性、任务类型与硬件约束,遵循以下判断流程:

  1. 确定信号的最小周期/关键事件时长:窗口长度至少应覆盖 1-2 个完整周期。例如,人体步频约 1.5-2Hz,若采样率 50Hz,则一个周期约 25-33 个采样点,L 建议取 50-100(即 1-2 秒)。
  2. 评估任务的时间依赖范围:对于异常检测,窗口应包含异常发生前后的上下文;对于预测任务,窗口需覆盖输入序列与预测目标之间的时间跨度。
  3. 根据硬件内存与延迟约束调整:MCU 的 RAM 通常有限,L 越大,模型输入层参数越多,中间特征图占用内存也越大。例如,Cortex-M4 级别 MCU 上,L=256 且多通道时可能超出内存预算。
  4. 选择步长策略:训练阶段常用 S=1 或 S=2 进行数据增强;部署阶段常用 S=L/2 或 S=L/4 以平衡延迟与精度。若系统要求实时响应,则 S 越小,推理频率越高,功耗越大。
场景窗口长度 L步长 S说明
关键词唤醒(KWS)40ms-100ms(如 16kHz 下 640-1600 点)10-20ms短窗口保证低延迟唤醒
人体活动识别(HAR)2-5 秒(100-250 点 @50Hz)0.5-1 秒覆盖完整动作周期
工业振动异常检测5-10 个旋转周期1 个周期需包含足够频域分辨率
ECG 心拍分类1-2 个心拍(约 0.8-1.2 秒)0.2-0.5 秒需对齐 R 波位置

实际操作中,建议先以信号周期为基准粗选 L,再通过交叉验证微调。步长则根据训练样本量与推理延迟需求折中。若样本量不足,可减小 S 以增加样本;若训练时间过长或过拟合,则增大 S。

3.3 案例拆解:基于 3 轴加速度计的跌倒检测窗口设计

某可穿戴设备项目需在 Cortex-M4 内核 MCU(主频 80MHz,RAM 64KB)上实现跌倒检测。传感器为 3 轴加速度计,采样率 50Hz,原始数据流持续写入环形缓冲区。目标:跌倒事件发生后 1 秒内触发报警,误报率低于 5%。

初始参数与约束:MCU 可用 RAM 约 20KB 用于模型输入与中间计算;模型为 1D-CNN,输入层为 (L, 3),卷积后特征图尺寸约为输入长度的 1/4。若 L=100,则输入占 100×3×2字节=600B,中间特征图约 25×16×2=800B,总内存占用可接受。若 L=200,则内存占用翻倍,且推理时间增加约 60%。

分析过程:跌倒动作通常持续 0.5-1.5 秒,包含失重、撞击、静止三个阶段。窗口长度需覆盖完整跌倒过程,故 L 取 75-100(1.5-2 秒)。步长 S 决定系统响应延迟:若 S=25(0.5 秒),则每 0.5 秒推理一次,最坏延迟 0.5 秒+推理时间,满足 1 秒要求;若 S=50(1 秒),则最坏延迟 1 秒+推理时间,可能超限。因此选择 S=25。

实际操作:使用 2000 条跌倒样本与 5000 条日常活动样本进行训练。对比三组参数:

  • L=50, S=10:样本数最多,但窗口过短,模型无法区分跌倒与快速蹲下,误报率 12%。
  • L=100, S=25:窗口覆盖完整动作,样本重叠 75%,训练收敛快,误报率 4.2%,延迟约 0.5 秒。
  • L=150, S=50:窗口过长,包含过多跌倒前后无关数据,模型注意力被分散,误报率 6.8%,且内存占用超限。

结果与复盘:最终采用 L=100, S=25。该配置在 64KB RAM 下运行稳定,推理耗时 35ms,满足实时性。复盘发现,步长 S=25 使相邻样本重叠 75%,训练时模型见过大量相似样本,需配合 Dropout 防止过拟合。此外,部署时采用环形缓冲区存储最近 100 个采样点,每新增 25 个点触发一次推理,避免重复拷贝数据。

经验提醒:窗口长度并非越大越好。当 L 超过事件本身长度时,多余的时间点会成为噪声,反而降低模型精度。建议通过“时间-精度曲线”确定拐点:逐步增大 L,观察验证集精度变化,选择精度趋于平稳的最小 L。

3.4 常见误区与总结复盘

误区一:窗口长度等于采样率乘以固定秒数即可。实际需考虑信号的非平稳性。例如,跑步时加速度幅值变化大,但步频相对稳定;而跌倒检测中,事件持续时间因人而异,固定秒数可能不适用。应基于事件物理时长而非简单秒数。

误区二:步长越小越好。虽然小步长增加样本量,但相邻样本高度相关,导致训练集有效信息量并未显著增加,反而增加训练时间与过拟合风险。经验上,训练阶段 S 可取 L/4 至 L/2,部署阶段 S 取 L/2 至 L。

误区三:忽略窗口边界效应。当窗口滑动到序列末尾时,若剩余长度不足 L,通常采用丢弃或填充策略。在实时系统中,末尾不完整窗口应直接丢弃,等待足够数据再推理,避免填充造成虚假样本。

误区四:训练与部署步长不一致。训练时用 S=1 生成密集样本,部署时却用 S=L 导致推理结果抖动。正确做法是:训练时采用多种步长(数据增强),但部署步长需与验证时一致,或确保模型对步长不敏感(可通过多步长训练实现)。

风险提示:在 TinyML 设备上,窗口参数直接影响功耗。推理频率 = 采样率 / S。若 S=1,则每采样点推理一次,MCU 可能无法在采样间隔内完成推理,导致数据积压。务必计算最坏情况下的推理耗时,确保小于 S/采样率。