资讯详情

资讯详情

无源域适配遇上多变量时间序列?TERSE:同时建模时间与空间依赖

KDD 2025 上有一篇关于多变量时间序列无源域适配的工作方法名叫 TERSE标题写得很直白破解多变量时间序列无源域适配难题同时建模时间与空间依赖。如果你做过域适配又恰好碰过传感器、能源、金融、医疗这类多变量时序数据应该能立刻 get 到这句话的分量——源域数据在部署时往往已经拿不到了只有预训练好的源模型目标域数据又没有标签与此同时每个变量自己的历史轨迹很重要变量之间的联动关系也很重要但很多方法只顾一头结果越适配越偏。这篇文章我会从问题拆解开始讲清楚无源域适配为什么遇到多变量时间序列会特别棘手然后梳理 TERSE 这类方案的核心设计思路再补充我在复现类似方法时踩过的坑以及排查经验。如果你正准备做时序数据的无源域适配或者想参考一个能同时处理时间依赖和变量间依赖的框架这篇笔记应该能帮你少走不少弯路。1. 无源域适配为什么这么难多变量时间序列的双重依赖拆解1.1 无源域适配到底“无源”在哪常规域适配里我们假设源域数据是可见的可以同时拿源样本和目标样本一起做对抗训练、MMD匹配或重建式对齐。但实际部署场景往往不是这样源数据可能因为隐私、存储成本或者协议约束已经不可访问能拿到的只有预训练好的源模型参数甚至只有一个预测接口。这就是无源域适配Source-Free Domain Adaptation的基本设定——训练阶段只有目标域数据加一个从源域搬过来的模型源域样本永远不出现。这个设定带来的直接后果是传统的域间分布对齐方法全部失效。你不能计算源域和目标域的MMD因为你没有源样本你不能做对抗域判别因为判别器也需要两个域的样本来区分。能用的信息源只剩两个方向一是目标域自身的结构比如无标签数据上的统计分布二是源模型内部残留的源域记忆比如BN层的运行均值方差、权重参数、预测输出的置信度分布。所以大多数无源方法都依赖伪标签和自我训练通过源模型在目标域上产出一批高置信度伪标签再用这些伪标签微调模型。但多变量时间序列有自己的特殊性。图像数据可以整体看把一张图当作一个样本而多变量时间序列里每个样本本身是一个长度 L 的窗口窗口内有 T 个时间步每个时间步有 C 个变量通道。这意味着数据不仅有通道维度上的“空间”结构还有时间维度上的动态演变。伪标签的鲁棒性、分布漂移的表现形式都会比图像场景更复杂。1.2 多变量时间序列里的“时间依赖”和“空间依赖”我用一个简单的生产设备监控来举例。一个旋转机械上有温度、压力、振动、转速四个传感器每秒钟记录一次形成四个通道的时间序列。时间依赖是指同一个通道内部前后时刻的关联。比如温度今天升高明天大概率还会继续升高而不是随机跳变振动信号有周期性的峰值。这种依赖可以通过循环神经网络、卷积神经网络或者Transformer来捕捉。但无源域适配里时间依赖还会发生漂移比如源域采集于夏季设备温度整体偏高目标域在冬季整体水平变了但局部波动的模式可能相似也可能是传感器采样频率变了导致相邻时间步的相关性密度发生改变。空间依赖在多变量时间序列里通常指变量通道之间的相互关系。比如温度升高时压力往往也会上升振动幅度受转速影响很大。这种跨变量依赖不是静态的可能随着时间变化比如启动阶段和稳定运行阶段变量之间的耦合关系完全不同。如果模型没有显式建模变量间关系它就只能依赖全局特征对齐很难适应目标域中“变量间关系重排”的情况。与此同时时间依赖和空间依赖往往互相耦合。变频器启动时转速先上升随后温度和振动才跟着变化这是一个时间滞后下的跨通道关系。如果只把整个窗口拉平成一个向量送入分类器这种时间滞后的跨变量关系就完全丢失了如果时间分支和空间分支完全割裂也就是各做各的信息又无法互通。1.3 现有方法的三个盲区让一个刚接触这个方向的人快速理解 TERSE 的价值可以看看之前主流方法有三个盲区。第一很多无源域适配方法直接把图像领域的套路搬到时间序列上比如用全局对抗对齐或全局BN统计量适配。这些方法把时间序列样本当成静态特征集合忽视了时序的先后因果适配完模型对变量顺序的扰动非常敏感。把传感器通道顺序打乱性能就崩掉。第二有一些时序域适配方法考虑了时间建模但空间依赖处理得很粗糙。要么假设所有变量独立用共享的卷积核在通道间扫过去要么直接用一个固定的相关矩阵比如皮尔逊相关系数定义通道关系。固定矩阵最大的问题在于它不随目标域变化一旦目标域的变量关系发生变化反而会引入错误先验造成负迁移。第三缺乏对长周期的感知。多变量时间序列中的分布漂移经常体现在周期振幅、周期相位上而常见的时间编码器窗口有限感知不到完整周期。TERSE 在时间分支中强调局部与周期结合很大程度上是在补这个洞。2. TERSE 的核心设计两个分支各司其职再融合预测TERSE 这类方法通常把问题拆成两条分支一条处理时间依赖一条处理空间依赖最后把两个分支的特征融合起来做预测。这个解耦设计在工程上特别好落地因为两个分支可以分开调试、分别替换也方便在无源场景下做逐步适配。2.1 时间分支局部卷积 周期感知时间分支的核心是让每个变量通道先独立地在时间维度上编码捕捉通道自身的动态模式。为了不泄漏未来信息一般用因果卷积或掩码注意力。因果卷积的意思是输出 t 时刻的特征时只使用 t 以及 t 之前时刻的输入这和传感器实时采集的逻辑是一致的——你在 t 时刻能拿到的也就是过去的数据。在实际实现里我建议用一个两层或三层的膨胀因果卷积作为基础骨干膨胀率按 1、2、4 递增可以用很小的感受野覆盖比较长的历史窗口。膨胀因果卷积比标准TCN更强的地方在于它不会改变序列长度可以很方便地和后续的注意力拼接。在膨胀卷积之后可以对时间维度做池化或注意力聚合得到每个变量的时间特征向量。但局部卷积只能覆盖有限的窗口长度。假设数据有24小时周期你的窗口只有12小时卷积再膨胀也看不到完整周期。所以时间分支还需要一个周期感知辅助模块。一个常见的做法是沿时间轴做快速傅里叶变换把频域幅度谱或主要周期分量的能量作为额外特征也可以把序列按估计周期切分成多个子段计算子段间的均值和方差偏移作为周期稳定性特征。这个周期感知模块在无源适配里还有一个额外作用很多分布漂移表现为频率成分的变化比如故障设备的振动信号中高频分量比例上升如果源模型在频域特征上具有判别力保留频域信息有助于更好地继承源模型的知识。2.2 空间分支从固定图到自适应图学习空间分支的目标是捕捉变量通道之间的相互依赖。最朴素的做法是预定义一个静态图比如用源域或通用先验计算通道间的相关系数矩阵然后在这个固定的图上做图卷积。但这个做法在无源适配里风险很大如果源域里通道A和通道B强相关目标域里因为传感器布置或环境改变通道A和B的相关性消失了你还在用旧的图做消息传递就是把错误信息扩散给每一个节点。更稳健的思路是让图结构成为可学习的参数。具体来说假设有 C 个变量通道空间分支维护一个可学习的节点嵌入矩阵 E维度是 C×d然后通过节点嵌入的内积计算出通道间的相似度矩阵 S E E^T再对这个相似度矩阵做归一化和稀疏化得到邻接矩阵 A。稀疏化可以用 top-k 截断每个节点只保留与其最相似的 k 个节点作为邻居k 是超参数。这样做的好处是目标域的通道间关系可以通过梯度自动学到不用依赖源域的先验。有了邻接矩阵之后可以用图卷积网络GCN或图注意力网络GAT在通道维度上做消息传递。每一层更新节点特征时会把邻居节点的信息聚合到当前节点。如果变量间的关系存在时间滞后也就是A在t−1时刻影响B在t时刻纯静态图和纯空间分支是捕捉不到的。此时可以让空间分支的输入不只是当前时间步的特征而是时间分支提取的分段特征集合比如每个通道在一个时间窗口内的均值、趋势、能量。这样空间分支实际是在做“变量级语义关系”的学习而不是逐时间步的瞬时依赖。关于图结构的初始化我有一个实操建议不要完全随机初始化节点嵌入最好先用目标域无标签数据计算皮尔逊相关矩阵或互信息矩阵用这个矩阵的特征向量或直接作为邻接矩阵来初始化会收敛得又快又稳。理由是自适应图学习本身参数自由度很高如果没有一个还不错的起点很容易陷入局部最优甚至学出一个全连接或全断开的退化图。2.3 双分支融合与目标函数设计时间分支和空间分支分别得到特征之后怎么融合也需要动点脑筋。简单地把两个特征向量拼接后接一个全连接层是最容易想到的方案但效果不一定最好。因为不同样本、不同目标域场景下时间信息和空间信息的置信度可能完全不同。我更推荐用门控融合机制为每个分支学习一个标量权重或者一个二维权重向量让模型根据当前输入自适应地调整两个分支的贡献。例如目标域里如果某个通道的某个传感器坏了一直输出恒定值那么空间分支的可信度会下降模型应该倾向依赖时间分支反过来如果序列中有大量缺失值时间分支的特征可能不稳定模型应该多依赖空间分支。门控机制可以学习到这个偏好而固定拼接学不到这种动态调节。无源域适配的损失通常由三部分构成。第一部分是伪标签监督损失用源模型在目标域数据上预测出的高置信度伪标签对模型输出做交叉熵或均方误差约束。第二部分是对齐约束常见的是让当前模型输出与源模型输出之间的KL散度尽量小或者让当前模型提取的特征空间与源模型提取的特征空间保持一致这一步是为了防止模型在无源微调时偏离源域的判别结构。第三部分是空间图正则比如限制邻接矩阵的稀疏性或者约束节点嵌入的均匀性避免图结构学到退化形态。如果两个分支都输出预测还可以加一个双分支一致性损失让时间分支和空间分支对同一个样本的预测不要差别太大这能帮助融合层更稳定地训练。3. 复现 TERSE 的实操细节预处理、训练与超参选择这一节我会补充一些我在复现类似无源时序适配方法时的实际做法。如果你手头有自己的一套数据可以对照这些细节逐项检查很多跑不出来的问题都不是模型结构的问题而是数据管道的问题。3.1 数据预处理别让时间泄漏毁了实验时间序列实验最容易犯的错就是在归一化时用到未来数据。假设你有整条长度为10000的序列如果先计算整条序列的均值和方差然后对整个序列做标准化那么训练时t时刻的特征其实已经把t之后的信息算进去了因为均值方差是全局统计量。这会让模型在验证时的表现虚高但部署到线上后你不可能知道未来数据才能计算归一化参数性能会立刻打回原形。正确做法是把数据集先按时间顺序划分成训练集、验证集、测试集然后在训练集部分单独计算每个通道的均值和方差用这个统计量去标准化训练集、验证集、测试集。如果数据本身是切片式的比如每个样本是一个固定长度窗口也要保证每个窗口内的归一化参数只来自窗口内过去部分或者在窗口划分之前用训练集整体统计量。对于无源域适配来说源数据不可见但通常有一个预训练好的源模型源模型内部自身带有BN统计量这些统计量是源域数据上求得的可以直接作为目标域数据的归一化参考之一。当然更稳妥的是在目标域训练集上重新估计一个目标域的归一化统计量因为模型最终要做的事就是适配目标域的分布。另一个时间泄漏来自重采样和滚动窗口的构造。如果你用滑动窗口切样本而且测试集紧跟在训练集之后那么窗口之间会共享大量数据评估结果会有偏差。正确的做法是在切分窗口之前先预留一定间隔比如训练集最后一个窗口的末尾和测试集第一个窗口的开始之间隔若干个时间步确保没有数据重叠。3.2 滑动窗口、批次组织与通道顺序滑动窗口的长度是一个需要重点调的超参。窗口太短模型看不到一个完整的周期时间分支的周期感知模块基本没用窗口太长训练样本数变少计算开销变大而且可能包含多个周期短期突变信息被淹没。我一般先用简单的周期检测工具比如自相关函数或FFT估计出主周期长度再把窗口长度设置为主周期的1.5到2倍。比如数据有明显日周期采样频率一小时一次周期24那窗口长度取36或48比较合适。如果数据没有明显周期就做一个窗口长度的敏感性分析比如取 {12, 24, 48, 96}。批次组织上如果直接把时序数据按顺序连续取batch那么同一个batch内的样本都来自相近的时间段模型看到的只是局部的小分布收敛速度会很慢而且更容易过拟合到某个短期模式。正确做法是把窗口打乱随机采样组成batch。对于多变量时间序列通道顺序本身是固定的但模型里如果有空间分支通道顺序会影响图结构的初始对应关系。我建议在训练时固定通道顺序不要打乱通道否则空间分支的节点嵌入初始映射没有意义。但可以做通道尺度的数据增强例如对通道做随机缩放或噪声注入帮助图结构更鲁棒。3.3 伪标签生成与置信度筛选无源域适配里伪标签的质量直接决定上限。最理想的情况是源模型的预测准确率在目标域上仍然较高这样伪标签大部分是对的。但现实往往不理想所以必须引入筛选机制。对于分类任务常见做法是取softmax概率超过固定阈值比如0.9或0.95的样本作为“干净”样本只拿这些样本计算监督损失。阈值不能太高否则选出来的样本太少训练信号不足也不能太低否则噪声大。一个更稳的做法是设置双阈值高阈值样本作为强监督低阈值样本作为弱监督只参与一致性正则不直接参与分类损失。对于回归任务伪标签不存在概率可以用模型预测的方差或集成多个随机Dropout掩码的结果来计算不确定性只选择不确定性低的样本。训练过程中可以使用课程学习策略先只选最高置信度的20%样本训练几个epoch让模型先学习到最可靠的特征然后每过几个epoch把阈值降低一点逐步纳入更多样本。这个过程很像人先做简单题再做难题可以显著降低早期噪声段对模型的影响。3.4 优化器、学习率与模型选择对于 TERSE 这种多分支模型我建议用 AdamW 优化器初始学习率设置在 1e-4 到 3e-4 之间并配合余弦退火或线性 warmup。batch size 不宜过大我常用的范围是 64 到 128如果窗口长度很长可以适当减小 batch size。自适应图学习模块的收敛比普通卷积慢所以可以给图结构部分设置一个稍小的学习率或者在图模块更新时加入梯度裁剪防止邻接矩阵在早期剧烈波动。无源域适配没有目标域标签验证集也不好选。一个实用的监控指标是目标域上的预测熵随着训练进行模型对目标域样本的预测置信度会逐渐变高熵下降说明适配有效。但这个指标不是万能的模型也可能过度自信地给出错误预测。所以我更建议用源模型在目标域上的预测一致率每训练一个epoch固定当前模型参数计算当前模型与源模型在目标域无标签样本上的预测一致率。如果这个一致率保持在较高水平说明模型没有完全偏离源域知识如果骤然下降说明出现了灾难性遗忘需要回调学习率或加强一致性约束。4. 复现过程中我踩过的坑与排查思路下面这些坑是我在类似框架上实际调试时遇到的希望能帮你省掉几晚上折腾时间。4.1 自适应图结构学成全连接了怎么办自适应图学习如果没有约束网络很容易把所有通道之间的边权重都学得很大最终逼近全连接图。一旦图变成全连接每个节点的特征就是所有变量特征的加权和空间分支退化成一个普通的全连接层同时计算量还暴涨。解决办法是在邻接矩阵生成时加一个稀疏约束具体做法有两种一是对相似度矩阵做 top-k 截断每个节点只保留权重最大的 k 条边二是在损失函数里加一个 L1 正则惩罚邻接矩阵中非零元素的数量。我自己的倾向是 top-k 截断更直接好用。选 k 时可以从变量总数的30%开始调如果效果不好上下浮动。另外可以在每个训练批次里随机丢弃部分边类似 Dropout把稀疏化后的邻接矩阵中的边以一定概率置零这样图结构不容易过拟合到某个固定的邻居集合。4.2 伪标签噪声太大导致训练震荡有一次我直接拿所有目标域样本的伪标签训练前几个epoch损失下降后面突然剧烈震荡。排查了一下发现是伪标签中一批错误样本的置信度也偏高模型被强行往错误方向上拉。解决办法是把伪标签筛选阈值从0.95提高到0.99虽然可用的样本少了但损失曲线明显稳定。如果可用样本太少可以采用“伪标签熵最小化”的配合策略高置信度样本用交叉熵监督低置信度样本不给他们硬标签而是加入预测熵惩罚让模型尽量以低置信度输出避免过早承诺到错误类别。另一个技巧是使用两个不同随机种子训练两个源模型的变体分别生成伪标签只有两个变体预测一致的样本才被选中。这个“双模型投票”的办法可以显著降低噪声代价是训练时间翻倍但在无源场景下非常有效。4.3 显存爆炸怎么处理多变量时间序列的通道数一旦达到几百甚至上千空间分支的邻接矩阵就是 N×N 大小显存占用很容易爆炸。我的建议有三个层面第一通道数很大时不要直接用完整图而是先对通道做聚类或分组比如把 1000 个通道按相关性聚成 50 个簇然后在这 50 个簇上做图卷积簇内共享参数。第二使用邻居采样技巧每次只随机采样每个节点的一部分邻居参与聚合类似 GraphSAGE可以控制计算量。第三在预处理阶段对序列做降采样或截断虽然损失了一部分时间分辨率但能换来更大的batch size整体效果可能反而更好。4.4 源模型遗忘太快怎么办无源域适配最怕微调几个epoch后模型在目标域上表现还行但原本学好的源域判别结构被冲掉了。由于源域数据不可见一旦遗忘就无法恢复。我常用的办法是把源模型主干参数冻结只微调时间分支、空间分支和融合层。如果必须全量微调可以给主干网络设置极小的学习率比如主干的 learning rate 是分支的0.1倍。同时在损失函数里加一个特征一致性正则让当前模型在目标域样本上提取的中间特征和源模型提取的中间特征尽量接近这个约束通常用均方误差或余弦距离。有了这个正则当前模型不会偏离源模型太远又能通过分支结构调整目标域的特定模式。5. 一点个人体会和后续还能怎么玩我自己在复现这类方法时最大的体会是“端到端一次到位”往往不靠谱。无源域适配这种框架适合分阶段搭建先用固定图和时间分支跑通基线确认时间依赖建模有效再逐步加入自适应图、门控融合和伪标签课程学习每加入一个模块就做一次消融对比哪个部分真正起作用。很多论文里最终效果是三个模块叠加出来的但中间每个模块的调试方式不一样一次全塞进去出了问题根本定位不了。从落地价值来看无源域适配在工业场景里确实需求很大。制造现场、能源场站、医疗设备监控到处都是多变量时间序列但大多数场景根本不可能重新标注足够的目标域数据而且旧数据往往因为版本迭代或合规要求不能长期保存。这种情况下能用一份预训练模型在目标域无标签数据上做自适配是性价比非常高的路径。TERSE 这种时间分支加空间分支解耦的框架也方便工程上替换对应模块——时间分支可以用最新的状态空间模型或分段卷积空间分支也可以用注意力机制替代图卷积。最后分享一个调参技巧如果你发现最终适配后的模型效果反而不如源模型直接用在目标域先别急着改网络结构检查两件事。第一归一化方式有没有引入时间泄漏第二伪标签筛选阈值和筛选方式是否合理。就我的经验看七成的问题出在数据预处理两成出在伪标签噪声只剩一成才是模型结构本身的问题。把这些基础问题排查干净再看模型能不能发挥出它该有的能力。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →