尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

一维序列预训练实战:双塔对比学习与时间序列特征表示

发布时间:2026/9/29 16:13:08

资讯中心
01
ARTICLE

一维序列预训练实战:双塔对比学习与时间序列特征表示

一维序列预训练实战:双塔对比学习与时间序列特征表示
做一维序列预训练的人多少都有过这种体会数据集不像图像那么好找增强手段模型稍大一点就过拟合下游任务五花八门每个都要单独调一套网络。我去年下半年一直在折腾一个项目代号就叫Gemini-PT 1D。名字有点唬人其实就是把“双塔结构”和“预训练”Pre-Training结合起来专门处理一维数据流的轻量级方案。1D指的是它面对的对象——时间序列、传感器信号、任意长度的embedding序列凡是排成一排的数据它都能上手。这篇文章把整个项目从设计到实现再到训练中踩过的坑完整梳理一遍给同样在做序列预训练的朋友一个可直接参考的蓝本。这个项目适合谁两类人。一类是刚接触自监督预训练想做点实验但不想一上来就碰大模型的另一类是有明确的一维数据场景比如设备故障诊断、金融序列、生物电信号觉得分类模型太“单薄”想用预训练加微调这套打法提升效果的人。我会把关键步骤的取舍逻辑讲清楚代码也会贴出来照着改就能用。1. Gemini-PT 1D 项目概述与核心思路1.1 名字里的门道Gemini、PT、1D分别意味着什么先拆名字。Gemini在英文里是“双子座”的意思用在模型架构里通常指双塔结构——两个结构相同、参数不共享或部分共享的编码器分别处理不同的输入视角。PT是Pre-Training的缩写代表这套方案不是直接面向某个具体任务训练而是先在大规模无标注数据上做自监督学习学出一套通用的序列表征。1D则是数据维度所有输入都是长度为L的一维序列每个位置上是一个标量或一个固定维度的向量。把这三个词拼在一起项目定位就很清楚了用双塔结构做一维序列的自监督预训练输出通用的序列特征供下游任务微调或直接作为特征提取器。这个定位在工程上非常实用因为一维数据场景太常见了——工业传感器每秒产生几千个采样点监控指标按时间顺序排列交易数据是连续的价格序列。图像预训练如SimCLR、MAE已经非常成熟但一维序列领域还没有一个“默认选项”Gemini-PT 1D就是想填补这个空白。选双塔而不是单塔核心原因是自监督学习需要“对比”或者“互信息”来构造学习信号。单塔模型当然也能做预训练比如BERT的掩码预测但对连续的一维信号来说掩码重建容易退化成“记忆均值”学到的特征判别性不足。双塔结构天然适合对比学习一个塔看原始序列另一个塔看增强后的序列或相邻片段然后拉近相同样本的表示、推开不同样本的表示。这样学到的特征天然具有“相似样本靠近、不同样本远离”的性质下游做分类、检索、异常检测都会顺手很多。1.2 为什么选择一维数据作为切入点做预训练很多人第一反应是上大模型、海量数据、分布式训练。但实际落地的时候你会发现绝大多数团队手里的数据是一维的而且量没那么大。图像领域那种“先在大规模数据集预训练、再在具体任务上微调”的打法到了一维序列领域需要重新设计很多细节因为数据特性和增强方式完全不同。一维数据的独特之处在于时间依赖性和局部结构。一个传感器序列里相邻几个点的关系远比相隔很远的点重要一段心电信号里P波、QRS波群这些局部形态是诊断的关键一段音频里短时频谱的局部纹理决定了音色。这些特性意味着预训练任务的构造必须尊重序列的局部性不能像图像那样随意裁剪拼贴。另外一维数据的“通道”概念也很微妙——多通道传感器数据可以视为多个并行序列也可以展平成单通道长序列不同的处理方式对模型学习效率影响巨大。我之前用标准Transformer直接做一维序列预训练效果很不理想原因之一就是Transformer的全局注意力对局部时序特征不够敏感。后来参考了时序卷积和相对位置编码的思路把编码器改成“CNN下采样加Transformer精修”的混合结构才真正跑出效果。Gemini-PT 1D的整个设计都是围绕这几个观察展开的局部优先、层次化建模、对比学习驱动。这也是我建议任何人做类似项目时先想清楚的问题——你的数据局部性体现在哪里你的预训练任务是否匹配这种局部性。1.3 整体架构选型权衡双塔对比学习 vs 单塔掩码重建项目立项时我对比了三条技术路线。第一条是单塔掩码重建也就是BERT路线的一部分随机遮住序列中的某一段让模型重建被遮住的内容。第二条是双塔对比学习借鉴SimCLR和MoCo的思路同一序列的不同视角作为正样本对不同序列作为负样本用InfoNCE损失拉近正样本、推开负样本。第三条是生成式路线类似MAE只对掩码部分计算损失但编码器只处理可见部分让模型必须学会从局部推断全局。我的结论是单塔掩码重建适合数据量大、任务以“理解”为主的场景比如NLP里BERT做阅读理解双塔对比学习适合数据量中等、任务以“区分”为主的场景比如故障分类、异常检测生成式路线效果最好但实现复杂需要额外设计掩码策略和解码器训练稳定性也难控制。Gemini-PT 1D最终选了双塔对比学习作为主框架原因很直接——我要面对的下游任务绝大多数是分类和检索对比学习学到的特征分布更紧凑类间距离更大微调阶段收敛更快。但纯对比学习也有个问题它不擅长捕捉序列内部的细粒度结构。比如一段心电信号对比学习能很好地区分正常和异常但很难回答“异常的形态是什么样”。所以我在预训练目标里加了一个辅助的时序预测分支让模型同时预测序列未来的趋势方向。这样做的好处是对比损失提供判别性预测损失提供时序连贯性两者互补。实测下来加了辅助分支之后下游任务的F1分数普遍提升了2到3个百分点。这个“主对比、辅预测”的混合目标设计是整个项目里最重要的架构决策。2. 核心细节解析一维数据管道的设计与实现2.1 数据来源与标准化处理Gemini-PT 1D在项目里测试了三类数据工业设备振动传感器数据、公开的人体活动识别数据集、以及合成的金融时间序列。这三类数据覆盖了一维序列最常见的形态高频采样、多通道并行、长尾分布。预处理的第一步是清洗去掉采样缺失的片段、剔除幅度超过物理阈值的异常尖峰、对齐时间戳。千万别小看这一步原始数据里如果有几个极端值对比学习会把它们当成“容易区分的样本”导致模型偷懒特征学得粗糙。第二步是标准化。一维序列最常用的标准化方式是z-score归一化也就是每个通道减均值除标准差。但要注意时间序列的统计量会随着时间漂移——上午的振动幅度和晚上的可能完全不同。所以我在项目里用的是“局部标准化”而不是全局标准化以每个样本窗口为单位计算均值和标准差再做归一化。这样做的目的是让模型关注波形形态而不是绝对幅值因为对于很多故障诊断场景波形形态才是真正的判别特征。还有一个细节是重采样和对齐。不同设备采样率不一样有的1000Hz有的256Hz直接混在一起训练模型会混淆时间尺度。我统一重采样到256Hz再按固定窗口长度切分。窗口长度的选择也有讲究太短局部模式看不到太长样本数量变少且训练变慢。经过实验对比振动数据用512个采样点约2秒效果最好活动识别数据用128个点就够了。这个参数直接决定后续所有设计的复杂度一定要根据数据的物理特性来定不要拍脑袋。2.2 序列切片与Token化策略Transformer类模型处理一维序列一般有两种思路。第一种是把每个采样点当作一个token输入维度是L乘以通道数这个方案的问题是序列太长注意力计算复杂度太高。第二种是先做下采样或者切patch把一段连续序列压缩成一个token类似ViT把图片切成16x16的patch。Gemini-PT 1D选了第二种但做了改进不用固定长度的patch而用“重叠滑窗加投影”的方式构造token。具体做法是窗口长度为W步长为SS小于W这样相邻token之间有重叠区域。每个窗口内的数据先经过一个一维卷积层把原始采样点压缩成d维的embedding。为什么要有重叠因为序列的分割边界往往是任意的重要的模式可能恰好跨在两个窗口之间重叠窗口能缓解这个问题。我测试过SW/250%重叠和SW/475%重叠后者效果更好但计算量增加了约30%。最终我选了50%重叠作为速度和精度的平衡点实测效果已经足够。token的维度d也是一个关键超参数。d太小序列信息被压缩得厉害细节丢失d太大模型参数膨胀小数据集容易过拟合。我的经验是从64开始根据数据量往上调。对于1万条左右的预训练数据d128比较合适如果有10万条以上可以上256。项目最终的配置是窗口长度64步长32投影维度128这样一条512点的序列会生成15个tokenTransformer的序列长度压力很小计算效率很高。2.3 数据增强策略一维序列的专属技巧对比学习的核心是构造正样本对——同一个序列的两个“不同视角”。图像领域有随机裁剪、颜色抖动、旋转一维序列领域也需要自己的增强组合。我在项目里实现并测试了五种增强方式按重要性排序如下缩放抖动对序列乘以一个在[0.8, 1.2]范围内随机采样的系数模拟传感器灵敏度差异。这个增强最简单但效果最好因为它直接改变了数据的“全局能量”。时间扭曲对时间轴做轻微的非线性拉伸比如把前30%的序列压缩、后70%的序列拉伸。时间扭曲模拟的是采集过程中速度的不均匀性对振动信号和音频特别有效。局部加噪在随机位置添加高斯噪声噪声强度是序列标准差的5%到10%。这个增强让模型不过度依赖单个采样点的精确值。通道随机掩码对于多通道数据随机遮蔽30%的通道迫使模型从剩余通道推断缺失信息增强跨通道鲁棒性。平滑滤波对序列做一次轻度的移动平均模拟低频信号的变化。使用增强时有个关键原则正样本对之间的增强强度不能太大否则两个视角差异过大模型会学不到共性也不能太小否则对比学习的任务太简单特征退化成原始输入。我在项目里做了一组消融实验单独用缩放抖动时对比损失下降最快加上时间扭曲后下游任务表现最好。所以最终的增强组合是“缩放抖动 时间扭曲 通道随机掩码”三者叠加但不做局部加噪因为加噪对高频振动信号干扰太大会让模型把噪声当成信号学进去。3. 模型实现从零搭建双子塔预训练模型3.1 双塔编码器结构详解双子塔在Gemini-PT 1D里的具体实现是一个online encoder在线塔和一个target encoder目标塔。两个塔的结构完全相同但参数不同步。online塔的梯度正常更新target塔的参数不通过梯度下降更新而是用online塔参数的指数移动平均EMA缓慢跟随。这个设计借鉴了BYOL和MoCo的思路目的是让对比学习的目标保持稳定——如果两个塔同时快速更新模型容易崩塌也就是所有样本的输出都变成同一个向量。具体的编码器结构我设计为四级第一级是前面提到的卷积投影层把原始序列窗口变成embedding第二级是两个一维卷积块每块包含Conv1d、LayerNorm、GELU激活和最大池化负责提取局部模式第三级是一个轻量级Transformer编码器层数设为2注意力头数4在这一层捕捉长距离依赖第四级是全局池化层把整个序列的表示聚合成一个固定长度的向量。这个向量就是双塔输出的“表征”对比损失直接在这个向量上计算。你可能要问为什么不用纯Transformer因为一维序列通常很长纯Transformer的注意力矩阵是序列长度的平方512个token时已经很吃力了。先用CNN做两轮下采样序列长度可以缩减到原来的四分之一Transformer只需要处理比较短的序列计算量大幅下降。同时CNN的局部感受野天然匹配一维序列的局部模式比Transformer更容易学到时间上的位置关系。这个混合结构在一维数据上的效果实测比纯Transformer快两倍精度还高一点属于典型的“结构先验”优势。3.2 预训练损失函数设计Gemini-PT 1D的预训练损失由两部分组成对比损失和时序预测损失。对比损失用的是InfoNCE核心思想是给定一个查询样本要从K个候选样本中找出它的正样本其他K-1个都是负样本。损失函数如下import torch import torch.nn.functional as F def info_nce_loss(q, k, tau0.07): # q: [batch_size, d] # k: [batch_size, d]来自target塔的输出 batch_size q.shape[0] # 归一化特征向量 q F.normalize(q, dim-1) k F.normalize(k, dim-1) # 相似度矩阵 [batch_size, batch_size] logits q k.T / tau # 对角线元素是正样本对其余都是负样本 labels torch.arange(batch_size).to(q.device) loss F.cross_entropy(logits, labels) return loss这里的temperature参数tau很重要。tau太大logits分布变平滑模型很难区分正负样本tau太小logits分布过于尖锐模型只关注最难的负样本训练容易震荡。经验值在0.05到0.1之间我在项目里用了0.07这是对比学习文献里最常见的设置。时序预测损失的设计稍微复杂一点。我让online塔除了输出序列表征还输出一个“趋势预测头”输入是序列的前80%目标是预测后20%的均值方向上升、下降、持平三种类别。这个损失用交叉熵计算权重设为0.3。为什么要加这个分类式的预测而不是直接回归未来的数值因为直接回归数值对异常值非常敏感而且不同序列的幅度差异很大模型很难收敛。预测趋势方向就稳定得多而且已经能提供足够的时序连贯性信号。两部分损失相加总损失 info_nce_loss 0.3 * trend_loss。3.3 训练配置与关键参数训练配置这块我踩了不少坑才稳定下来。优化器选了AdamW初始学习率3e-4使用余弦退火调度器。batch size是256训练200个epoch。双塔对比学习对batch size非常敏感——batch越大负样本越多对比学习效果越好。但受限于单卡显存我把batch size压在256配合memory bank机制来扩充负样本池维护一个包含4096个历史特征向量的队列每个step用当前batch的特征更新队列头部这样等效负样本数远大于batch size。训练还需要注意两个参数。EMA的momentum系数我设置为0.99。这个系数的含义是target塔每步更新时90%权重来自自身历史值10%来自online塔的新参数。momentum太接近1target塔更新太慢跟不上online塔的学习进度太小两个塔差异太小对比学习的困难度不够。另外梯度裁剪设为全局范数的1.0防止长序列训练中梯度爆炸。混合精度训练AMP是必须开的一维序列模型的显存开销主要在激活值上半精度训练能看到接近两倍的显存节省而且因为序列模型的计算密度相对低几乎不损失精度。完整训练循环的一个关键片段如下for batch in dataloader: x batch[seq].to(device) # [B, C, L] # 生成两个增强视角 x1 augment(x) x2 augment(x) # online塔正常前向 z1 online_encoder(x1) z2 online_encoder(x2) # target塔用停梯度模式 with torch.no_grad(): t1 target_encoder(x1) t2 target_encoder(x2) # 计算对比损失交叉匹配视角 loss_cl (info_nce_loss(z1, t2) info_nce_loss(z2, t1)) / 2 # 时序预测损失 trend_pred trend_head(z1) loss_trend ce_loss(trend_pred, trend_labels) loss loss_cl 0.3 * loss_trend loss.backward() optimizer.step() # EMA更新target塔 with torch.no_grad(): for p_online, p_target in zip(online_encoder.parameters(), target_encoder.parameters()): p_target.data momentum * p_target.data (1 - momentum) * p_online.data4. 实操过程与踩坑记录4.1 第一次训练失败的教训项目第一次跑到完整200个epoch损失曲线看起来非常漂亮——InfoNCE损失从最开始接近4.6平稳降到零点几以下。但等我拿预训练权重去微调下游任务时效果直接崩溃下游分类准确率只有46%跟不预训练随机初始化的模型差不多。这个现象让我排查了很久最后定位到问题在数据增强强度上。我最初用了“缩放抖动 局部加噪 平滑滤波”的组合增强强度设得很大。对比学习确实把两个增强视角的表示拉得很近但代价是什么模型学会了“忽略细节、只看整体”。因为增强后的正样本对被搞得差异很大模型为了降低对比损失只能丢弃细节信息保留最粗粒度的特征。这些特征对下游细粒度分类完全没用。这个教训非常典型对比损失下降不代表特征质量高必须定期用下游任务做验证。后来我把增强强度调低尤其是去掉局部加噪只保留缩放和时间扭曲下游效果立刻回升到82%。我在项目里加了一个“监控探针”的机制每训练5个epoch就在一个固定的下游小任务上跑一次线性分类评估把准确率记录下来。这比只看损失曲线靠谱得多。探针任务的规模不大2000条样本几十秒就能跑完但它能实时反映预训练特征的真实质量。建议所有做自监督预训练的人都加这一步不要等到全部训练完才发现方向错了。4.2 对比学习崩溃的排查方法第二个坑是训练中段模型崩塌。具体表现是训练到大概60个epoch时InfoNCE损失突然从0.5附近飙到2.0以上然后所有样本的表征都缩到一个极小的区域内相似度矩阵全部接近1/tau。这是对比学习最常见的失败模式俗称“表征坍缩”。网络找到了一个捷径把所有输入都映射到同一个输出这样对比损失的难度无穷大模型无论如何也无法降低损失。排查后发现两个原因叠加。第一EMA的momentum系数设得太小0.99target塔参数量快速变化给对比学习提供了不稳定的目标导致训练震荡后坍缩。第二学习率没有配合EMA做调整模型在训练中后期仍然以较大步长更新冲进了坍缩区域。解决办法是把momentum系数提到0.995并且让学习率在前10个epoch做线性warmup、之后余弦衰减。这两个改动之后坍缩问题再没出现过。还有一个容易忽略的细节就是最后的特征归一化。对比学习通常要求输出特征经过L2归一化后再算相似度这个归一化不只是数学上的便利更是防坍缩的关键——如果不做归一化特征向量的模长可以无限增长模型可以靠放大模长来压低损失而不是真正学到有意义的分布。我建议在编码器最后一个全连接层之后加一个layer normalization再做L2归一化两道保险。4.3 核心超参数的调优经验如果说只能给三个超参数调整建议我的选择是temperature、EMA momentum、增强强度。这三个参数直接决定对比学习的成败而且它们之间还有交互。温度tau太大模型对所有负样本“一视同仁”训练信号弱太小模型只关注最难分的负样本容易被噪声样本带偏。我做过一组扫描实验tau从0.03到0.15间隔0.02结果在0.07和0.09时下游效果最好0.03时训练完全崩溃0.15时特征区分度明显下降。EMA的momentum系数与训练时长要匹配。200个epoch的训练0.995是一个不错的起点。如果你只打算训练50个epoch建议调到0.99以下让target塔更新更快跟上学习进度如果训练500个epoch以上可以调到0.998。一个实用的判断方法是观察两个塔输出特征的相关性如果相关性长期大于0.99说明target塔更新太慢如果低于0.9说明更新太快。增强强度的调优建议用“控制变量法”先固定一种增强调温度到最佳再固定温度调增强组合。不要同时改多个超参数否则你根本不知道是谁导致了效果变化。我最后确定的黄金组合是tau0.07momentum0.995增强组合为缩放抖动0.8-1.2 时间扭曲 30%通道掩码。这套组合在三个不同数据集上表现一致稳定可以作为参考起点。5. 常见问题速查与后续扩展5.1 训练与推理的常见问题速查表下面这张表总结了项目过程中遇到的高频问题按症状、原因、解决方案的格式排列方便你直接对照排查。症状可能原因解决方案损失训练前期不降学习率过低或warmup阶段过长检查初始学习率是否在1e-4到3e-4范围缩短warmup到5个epoch以内损失骤降后长期不降模型陷入局部最优温度tau过大导致梯度太平滑调低tau到0.05-0.07同时检查负样本数量是否足够表征坍缩相似度矩阵全等EMA momentum过小、未做特征归一化momentum调到0.995编码器输出加L2归一化必要时降低学习率下游微调效果差但预训练损失很低数据增强过强导致模型丢失细节增强组合只保留缩放和时间扭曲去掉强噪声类增强多通道数据效果不如单通道通道间没有做随机掩码或对齐加入30%通道掩码增强预处理时做通道级标准化GPU显存不足batch size过大或序列过长使用梯度累积模拟更大batch或先降低序列长度再逐步调回这里再补充一个推理阶段的心得预训练模型在下游任务微调时一定不要用太高的学习率。因为预训练特征已经比较好微调只是让特征适应分类边界学习率设置为预训练阶段的十分之一约3e-5到5e-5效果最好。学习率太高微调过程会破坏预训练学到的特征结构反而导致效果下降。我见过很多人在这里翻车明明预训练特征很好结果微调完还不如随机初始化。5.2 下游任务适配的三种模式Gemini-PT 1D的下游适配分为三种模式按场景复杂度递增线性探针、全量微调、特征提取加轻量分类器。线性探针最简单固定预训练编码器参数只在表征向量后面接一个线性层训练几轮就能达到不错的效果。这种方式适合数据量很小的场景比如只有几百条标注样本全量微调必然过拟合线性探针反而更稳。全量微调适合中等数据量的场景比如几千到一万条标注样本。这时预训练模型作为一个初始化权重所有参数都参与训练。需要注意的点是全量微调时编码器的骨干部分学习率要设低而新加的分类头学习率可以正常设置。我常用分组学习率骨干部分1e-5分类头1e-3这样既保留了预训练特征又让分类头快速收敛。特征提取加轻量分类器是我最推荐的工业落地模式用预训练编码器离线抽取所有训练数据的表征然后只训练一个浅层分类器比如逻辑回归或者一个两层MLP。因为预训练特征已经足够好这个模式在测试集上的表现和全量微调很接近但训练时间从小时级降到秒级而且部署时不需要带整套模型。这个模式在异常检测场景里尤其好用——正常样本的特征分布可以实时用高斯分布拟合新样本的特征距离超过阈值就判为异常整个过程不需要任何标注。5.3 后续扩展方向与个人建议Gemini-PT 1D目前还只是单模态的一维序列预训练。后续最自然的扩展是把它改成多模态对齐的底座比如把同一时间段内的传感器数据和文本描述对齐双塔变成三塔其中一塔处理文本另外两塔分别处理两种序列模态。这个方向的难点不在模型结构而在数据对齐——不同模态的数据采样频率和语义粒度不一样如何构造细粒度的对齐关系才是关键。另一个值得探索的方向是生成式预训练分支的加强。前面提到辅助的趋势预测只是最小实现后续可以把它升级成masked autoencoder式重建对序列的一部分做掩码让模型重建被掩码的原始采样点。这需要增加一个解码器分支但能捕捉更细粒度的序列结构对异常检测场景价值很大。生成分支和对比分支的权重平衡也需要重新调整建议从生成分支权重0.5开始实验而不是我之前用的0.3。根据我个人的实际操作体会一维序列预训练这个方向还远没有到饱和阶段。相比图像和文本领域成熟的预训练范式序列数据因为形态多样、缺乏统一的增强标准很多工作还处于“自己造轮子”的阶段。Gemini-PT 1D的价值不在于它有多强的效果而在于它提供了一套可复现的组合方案双塔结构、混合局部瓶颈、辅助预测损失、分层增强策略。你完全可以把其中任何一个模块替换成更适合自己数据的组件。最后再分享一个小技巧如果你不想自己实现所有细节先把数据增强和tuning好的温度参数复现出来再用自己的数据跑一遍你会惊讶于这两个组件单独就能带来多大的效果提升。祝各自的序列数据都能跑出好结果。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。