基于Transformer架构的时间序列数据去噪技术研究

本文涉及的产品
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
实时数仓Hologres,5000CU*H 100GB 3个月
实时计算 Flink 版,5000CU*H 3个月
简介: 本文介绍了一种基于Transformer架构的时间序列去噪模型。通过生成合成数据训练,模型在不同噪声条件下展现出强去噪能力。文章详细解析了Transformer的输入嵌入、位置编码、自注意力机制及前馈网络等关键组件,并分析实验结果与注意力权重分布。研究为特定任务的模型优化和专业去噪模型开发奠定了基础。

Transformer是一种专为处理序列数据而设计的高效神经网络架构。自2017年问世以来,Transformer已在自然语言处理(NLP)领域取得显著成就,并成为现代人工智能平台的核心组件,如OpenAI的ChatGPT[1]、Anthropic的Claude[2]以及Google的Gemini[3]等。除了语言模型应用外,Transformer架构的序列建模能力使其在多种序列数据处理任务中展现出巨大潜力,其中包括本文重点讨论的时间序列去噪应用。

时间序列数据在现实世界中广泛存在,从物理传感器采集的数据(如热敏电阻、加速度计等测量结果)到金融市场的证券价格波动。这些数据通常包含各种来源的噪声干扰,这些噪声可能掩盖了数据中潜在的重要模式和趋势。传统的时间序列去噪方法,如移动平均技术和卡尔曼滤波器[4]等,长期以来一直是处理此类问题的标准工具。

移动平均法虽然实现简单,但由于其固有的平均机制——每个数据点都与其前序点进行平均计算,因此会引入明显的时间滞后,这在需要实时处理的应用场景中可能产生不利影响。

在许多专业领域中,卡尔曼滤波器[4]被视为时间序列去噪的首选技术。卡尔曼滤波器的应用通常需要针对特定监测系统进行复杂且定制化的实现,这增加了其应用难度和适用范围的局限性。

随着深度学习技术的快速发展,特别是Transformer架构的出现,为解决经典的时间序列去噪问题提供了一种新颖且具有潜力的方法。这种基于神经网络的方法有望克服传统技术的局限性,并在复杂的去噪任务中展现出优越性能。

本文将系统性地介绍时间序列去噪问题的理论基础,并详细阐述如何利用TensorFlow框架构建一个在合成数据集上训练的时间序列去噪Transformer模型。

通过对这个精简但功能完整的Transformer模型的深入分析,我们将能够更好地理解经典论文"Attention is All You Need"[5]中提出的核心概念,特别是位置编码(Positional Encoding)和自注意力(Self-Attention)机制的工作原理及其在实际应用中的重要性。

本文所使用的全部源代码已在GitHub仓库[6]开放获取,供读者参考和扩展。

时间序列噪声

时间序列噪声是指序列数据中的非预期波动,这些波动通常会掩盖数据中蕴含的潜在模式和趋势。噪声可能源自多种因素,包括传感器精度不足、环境干扰、市场随机波动或计算过程中的误差累积等。

开发高效的去噪技术对于从时间序列数据中提取有意义的信息、提高传感器测量精度和优化决策过程具有至关重要的意义。

Transformer模型

本文设计的噪声去除Transformer模型由四个主要组件构成:输入嵌入层(Input Embedding Layer)、位置编码器(Positional Encoder)、Transformer编码器(包含全局自注意力层和前馈神经网络),以及输出映射层。输出映射层负责将Transformer编码器的高维输出转换回原始信号空间,从而生成去噪后的信号。

具体而言,输入嵌入层将长度为1000的噪声输入向量映射到32维的特征空间中。位置编码器则在输入嵌入中为每个元素添加位置信息编码,使模型能够感知序列中元素的相对位置。Transformer编码器通过全局自注意力机制对输入序列中的各个时间步进行分析,从而有效识别并去除噪声成分。最后,模型的输出层将编码器输出从高维特征空间(1000, 32)映射回一维的去噪信号向量(长度为1000)。

接下来,我们将深入探讨Transformer模型的各个关键组件的实现细节和工作原理。

输入嵌入

在Transformer模型中,输入嵌入层的主要作用是将形状为(1000, )的一维噪声时间序列数据映射到形状为(1000, d_model)的高维表示空间,其中d_model = 32表示映射后的特征维度。这一转换过程通过标准的密集神经网络层[7]实现。经过这一处理,原始输入中的每个时间步值都被转换为一个32维的向量表示。

输入嵌入层的输出计算公式如下:

公式中,X表示长度为1000的输入向量,W表示形状为(1000, 32)的可学习权重矩阵,b表示长度为32的偏置向量。经过此层处理后,输出的张量形状为(1000, 32)。

位置编码器

由于Transformer架构本身对输入序列中元素的顺序没有内在感知能力,因此需要通过位置编码器为输入添加位置信息。位置编码器通过计算一组特定的正弦函数值并将其与输入嵌入相加来实现这一功能。位置编码的计算公式如下:

其中,pos表示序列中的位置索引(取值范围为0, 1, ..., 999),i表示嵌入维度(对于d_model = 32,取值为0, 1, ..., 31),10000是一个缩放因子,其作用是确保位置编码与输入嵌入的数值量级相近,便于模型学习。

序列长度为1000的32维嵌入的位置编码可视化

位置编码器层的输出是输入嵌入与位置编码的元素级加和:

其中,Length(X) = 1000代表序列长度,d_model = 32代表嵌入空间的维度。

我们Transformer模型中的

PositionalEncoding

层实现代码如下:

 class PositionalEncoding(tf.keras.layers.Layer):  
    def __init__(self, seq_len, d_model, **kwargs):  
            super(PositionalEncoding, self).__init__()  
            self.pos_encoding = self.get_positional_encoding(seq_len, d_model)  

    def get_positional_encoding(self, seq_len, d_model, n=10000):  
        # 创建位置数组(形状:[seq_len, 1])  
        position = np.arange(seq_len)[:, np.newaxis]  

        # 创建维度数组(形状:[d_model/2])  
        denominator = np.power(n, 2 * np.arange(0, d_model, 2) / d_model)  

        # 计算正弦函数并堆叠它们  
        P = np.zeros((seq_len, d_model))  
        P[:, 0::2] = np.sin(position / denominator)  # 对偶数索引应用sin  
        P[:, 1::2] = np.cos(position / denominator)  # 对奇数索引应用cos  

        # 转换为TensorFlow张量并重塑为(1, seq_len, d_model)  
        P_tensor = tf.convert_to_tensor(P, dtype=tf.float32)  
        P_tensor_reshaped = tf.reshape(P_tensor, (1, seq_len, d_model))  

        return P_tensor_reshaped  

    def call(self, inputs):  
         return inputs + self.pos_encoding[:, :tf.shape(inputs)[1], :]

Transformer编码器

Transformer编码器构成了噪声去除Transformer模型的核心部分,它由两个主要子层组成:全局自注意力层和前馈神经网络[8]。为了优化模型的训练过程并提高性能,在全局自注意力层和前馈网络之后都应用了残差连接(将层输入直接加到其输出)和层归一化步骤,这有助于缓解梯度消失问题并提高训练稳定性。

全局自注意力[5]层使Transformer能够在处理输入序列时,根据当前生成输出的需要自适应地关注序列中的不同时间步。与循环神经网络(RNN)或卷积神经网络(CNN)不同,全局自注意力机制能够同时处理整个输入序列,从而有效学习全局依赖关系,这对于复杂的时间序列去噪任务尤为重要。

本模型使用TensorFlow提供的

MultiHeadAttention

[9]层来实现自注意力计算。具体计算过程如下:

首先,全局自注意力层将形状为(1000, 32)的位置编码器输出X作为输入,分别生成查询矩阵Q、键矩阵K和值矩阵V

其中,W_QW_KW_V是形状为(1000, dₖ)的可学习权重矩阵。在单头注意力的情况下,dₖ = d_model/H,其中H = 1是注意力头的数量,因此对于本模型,dₖ = 32。

接下来,通过计算查询矩阵Q与键矩阵K的转置之间的点积,得到注意力分数:

这个注意力分数是一个形状为(1000, 1000)的矩阵,其中每个元素表示输入序列中一个时间步对另一个时间步的关注程度。

然后,对注意力分数进行缩放并应用softmax函数,以稳定训练过程并获得概率化的注意力分布,确保注意力权重矩阵的每一行元素和为1:

最后,通过对形状为(1000, 1000)的注意力权重矩阵与形状为(1000, 32)的值矩阵V进行点积运算,计算得到全局自注意力层的输出,其形状为(1000, 32):

全局自注意力层

GlobalSelfAttention

层的具体实现代码如下:

 class BaseAttention(tf.keras.layers.Layer):  
  def __init__(self, **kwargs):  
    super().__init__()  
    self.mha = tf.keras.layers.MultiHeadAttention(**kwargs)  
    self.add = tf.keras.layers.Add()  
    self.layernorm = tf.keras.layers.LayerNormalization()  

class GlobalSelfAttention(BaseAttention):  
  def call(self, x):  
    attn_output, attn_scores = self.mha(  
        query=x,  
        value=x,  
        key=x,  
        return_attention_scores=True)  
    x = self.add([x, attn_output])  
    x = self.layernorm(x)  
     return x, attn_scores

值得注意的是,

GlobalSelfAttention

类继承自

BaseAttention

基类。这种设计模式使得我们可以基于相同的基础结构实现不同类型的注意力机制,例如,我们可以轻松实现一个

CausalSelfAttention

层:

 class CausalSelfAttention(BaseAttention):  
  def call(self, x):  
    attn_output, attn_scores = self.mha(  
        query=x,  
        value=x,  
        key=x,  
        return_attention_scores=True,  
        use_causal_mask = True)  
    x = self.add([x, attn_output])  
    x = self.layernorm(x)  
     return x, attn_scores
CausalSelfAttention

类与

GlobalSelfAttention

类的主要区别在于它启用了因果掩码(Causal Mask),即将未来时间步的注意力权重设置为0。因果自注意力确保序列中某个位置的输出仅基于该位置及其之前位置的信息,这种机制在文本生成等需要逐步预测的任务中尤为重要。

Transformer编码器中的前馈网络[8]由两个大小分别为128和32的密集层[7]组成,同时集成了一个dropout层[10]以防止模型过拟合。前馈网络在全局自注意力层混合各时间步信息后,对每个时间步独立进行处理,进一步增强了模型的表达能力。

前馈网络的数学表达如下:

其中,W₁和W₂分别是大小为(32, d_ff)和(d_ff, 32)的可学习权重矩阵(前馈网络的维度d_ff = 128),b₁b₂分别是长度为d_ff和32的偏置向量。经过处理后,前馈网络输出的张量形状为(1000, 32)。

FeedForward

层的实现代码如下:

 class FeedForward(tf.keras.layers.Layer):  
  def __init__(self, d_model, dff, dropout_rate=0.1):  
    # dff = 前馈网络的维度(隐藏层的大小)  
    super().__init__()  
    self.seq = tf.keras.Sequential([  
      tf.keras.layers.Dense(dff, activation='relu'),  
      tf.keras.layers.Dense(d_model),  
      tf.keras.layers.Dropout(dropout_rate)  
    ])  
    self.add = tf.keras.layers.Add()  
    self.layer_norm = tf.keras.layers.LayerNormalization()  

  def call(self, x):  
    x = self.add([x, self.seq(x)])  
    x = self.layer_norm(x)   
     return x

在全局自注意力层和前馈网络之后应用的残差连接和层归一化步骤可表示为:

完整的

EncoderLayer

实现代码如下:

 class EncoderLayer(tf.keras.layers.Layer):  
  def __init__(self,*, d_model, num_heads, dff, dropout_rate=0.1):  
    super().__init__()  

    self.self_attention = GlobalSelfAttention(  
        num_heads=num_heads,  
        key_dim=d_model,  
        dropout=dropout_rate)  

    self.ffn = FeedForward(d_model, dff)  

  def call(self, x):  
    x, attn_scores = self.self_attention(x)  
    x = self.ffn(x)  
     return x, attn_scores

输出映射层

Transformer编码器输出的张量形状为(1000, 32)。模型的最终输出层负责将这个高维特征表示映射回原始信号空间,生成形状为(1000, )的去噪信号向量。这一映射过程通过单个密集层[7]实现。

完整的

NoiseRemovalTransformer

模型实现代码如下:

 class NoiseRemovalTransformer(tf.keras.Model):  
    def __init__(self, d_model, seq_len, num_heads, dff, num_layers, dropout_rate=0.1):  
        super(NoiseRemovalTransformer, self).__init__()  
        # 嵌入层  
        self.embedding_layer = tf.keras.layers.Dense(d_model, activation=None)  

        # 位置编码层  
        self.pos_encoding_layer = PositionalEncoding(seq_len, d_model)  

        # 编码器层  
        self.enc_layers = [EncoderLayer(d_model=d_model, num_heads=num_heads, dff=dff, dropout_rate=dropout_rate)   
                           for _ in range(num_layers)]  

        # 最终层  
        self.final_layer = tf.keras.layers.Dense(1, activation=None) # 为每个时间步输出单个值  

    def call(self, x, return_attn_scores=False):  
        x = self.embedding_layer(x)  

        x = self.pos_encoding_layer(x)  

        for i in range(len(self.enc_layers)):  
            x, attn_scores = self.enc_layers[i](x)  

        x = self.final_layer(x)  

        if return_attn_scores:  
            return x, attn_scores  

         return x

生成合成时间序列数据

为了训练模型,我们生成了具有特定特性的合成时间序列数据。数据生成过程分为三个关键步骤:

首先,使用随机游走算法[11]生成干净的基础信号。为了使生成的信号更加平滑并适合模型训练,我们对随机游走的输出进行平滑处理,并将其缩放至[-1, 1]范围内。

其次,为每个干净信号生成对应的噪声配置文件。这一过程首先为基础噪声水平指定一个随机值(0.1到0.5之间),然后通过将基础噪声乘以一个可变的噪声因子(0.5到2之间)计算最大和最小噪声水平。最后,通过在最大和最小噪声水平之间均匀采样并进行插值,生成完整的噪声配置文件。

噪声信号通过将干净信号与生成的噪声配置文件相加得到:

其中,f(t)C表示干净信号,f(t)N表示噪声信号,μ(t)表示噪声配置文件。

最后,为了准备训练数据,对噪声信号f(t)N_应用缩放,使其在[-1, 1]范围内。相同的缩放系数也应用于干净信号,以确保正确配对的信号对:

模型训练

模型在由1000个生成的信号对组成的数据集上进行训练,其中800个样本用于训练集,200个样本用于验证集。训练过程使用Adam优化器[12],学习率设置为0.001。损失函数选用均方误差(MSE),同时在训练过程中监控平均绝对误差(MAE)指标。训练数据以16个样本为一批(batch)进行处理,总共进行100个训练周期(epochs)。

实验结果

经过训练,噪声去除Transformer模型在验证集上收敛至MSE = 0.0026和MAE = 0.0387的性能水平。

训练历史图表(左:MSE损失函数变化曲线,右:MAE评估指标变化曲线)

信噪比与模型性能关系

考虑到每个样本具有不同的噪声配置文件,我们可以通过分析模型在不同噪声条件下的表现来深入了解其性能特性。为此,我们绘制了模型MSE与原始干净信号和噪声信号间信噪比(SNR)的散点图。SNR(以分贝为单位)的计算公式为:

SNR是衡量信号质量的重要指标,表示干净信号相对于噪声的强度。较高的SNR值表示较好的信号质量,而较低的SNR值则表示较差的信号质量。当SNR小于0时,意味着噪声强度超过了信号强度。

MSE与SNR的关系散点图

上图展示了500个训练样本的散点分布,可以观察到大多数样本集中在MSE = 0.002和SNR = 5 dB附近。

在图中可以观察到两个特殊区域:min(SNR)(对应低MSE)区域和max(MSE)(对应高SNR)区域。这两个区域的样本表现出与直觉预期相反的情况,即低SNR对应低MSE,而高SNR对应高MSE。

以下是这两个特殊区域以及主样本簇中典型样本的可视化结果。在每个图中,模型输出的去噪信号用蓝色实线表示,原始干净信号用蓝色虚线表示,噪声信号(模型输入)用红色实线表示。

最小SNR样本(SNR = -7.047,MSE = 0.002)

最大MSE样本(SNR = 8.727,MSE = 0.011)

主样本簇中的典型样本(SNR = 5.709,MSE = 0.002)

注意力机制内部分析

通过可视化注意力权重矩阵,我们可以深入了解噪声去除Transformer中全局自注意力机制的工作原理。在注意力权重矩阵中,行对应查询位置(从序列中收集信息的位置),列对应键位置(被查看信息的序列位置)。

下图展示了主样本簇中典型样本的注意力权重分布:

主样本簇中典型样本的注意力权重矩阵(SNR = 5.709,MSE = 0.002)

结果讨论

通过实验结果分析,我们发现噪声去除Transformer模型在各种噪声条件下展示出了较强的去噪能力。结果部分中展示的三个代表性样本揭示了模型在不同场景下的性能特点。

min(SNR)样本(对应低MSE)中,虽然噪声水平较高(SNR为负值),但由于原始干净信号的波动较小,模型能够较好地重建信号特征,从而实现低MSE。

而在max(MSE)样本(对应高SNR)中,尽管噪声水平相对较低,但原始干净信号呈现强烈的波动特性,使得模型难以准确重建其中的高频细节,导致较高的MSE值。

主样本簇中的典型样本(MSE = 0.002,SNR = 5 dB)代表了模型在中等噪声条件和适中信号波动情况下的表现,模型能够有效地去除噪声并重建原始信号。

从主样本簇中典型样本的注意力权重矩阵可以观察到明显的对角线优势,表明在进行去噪处理时,模型主要关注当前时间步及其邻近时间步的信息。此外,注意力权重矩阵中存在多条对角线带,这表明模型已经学习到训练数据中的某些周期性结构,这可能是由于合成数据生成方法导致的。

本研究中的模型是在具有不同噪声水平和整体较低SNR的样本上进行训练的。未来的研究方向可以包括针对特定噪声特征的模型微调,以及为特定去噪任务开发专门化的Transformer模型。通过生成具有系统特定噪声配置文件的合成训练数据,我们可以训练适应各种具体应用场景的专业去噪模型。

总结

本文提出了一种基于Transformer架构的时间序列去噪模型,系统介绍了时间序列去噪问题的理论基础,并详细阐述了一个能够接受噪声输入信号并输出去噪信号的小型Transformer模型的构建过程。为了训练和评估模型,我们生成了具有特定特性的合成时间序列数据。

实验结果表明,所提出的噪声去除Transformer模型在各种噪声条件下均展现出了较强的去噪能力。本文介绍的基础Transformer架构为特定任务的模型微调和专门化去噪模型的开发提供了坚实的基础。

https://avoid.overfit.cn/post/768a4ca4225c47c09db1822dd24a4cad

作者:Callum Bruce

目录
相关文章
|
16天前
|
存储 运维 Serverless
千万级数据秒级响应!碧桂园基于 EMR Serverless StarRocks 升级存算分离架构实践
碧桂园服务通过引入 EMR Serverless StarRocks 存算分离架构,解决了海量数据处理中的资源利用率低、并发能力不足等问题,显著降低了硬件和运维成本。实时查询性能提升8倍,查询出错率减少30倍,集群数据 SLA 达99.99%。此次技术升级不仅优化了用户体验,还结合AI打造了“一看”和“—问”智能场景助力精准决策与风险预测。
149 69
|
1月前
|
弹性计算 负载均衡 网络协议
阿里云SLB深度解析:从流量分发到架构优化的技术实践
本文深入探讨了阿里云负载均衡服务(SLB)的核心技术与应用场景,从流量分配到架构创新全面解析其价值。SLB不仅是简单的流量分发工具,更是支撑高并发、保障系统稳定性的智能中枢。文章涵盖四层与七层负载均衡原理、弹性伸缩引擎、智能DNS解析等核心技术,并结合电商大促、微服务灰度发布等实战场景提供实施指南。同时,针对性能调优与安全防护,分享连接复用优化、DDoS防御及零信任架构集成的实践经验,助力企业构建面向未来的弹性架构。
181 76
|
1月前
|
人工智能 自然语言处理 API
MCP与A2A协议比较:人工智能系统互联与协作的技术基础架构
本文深入解析了人工智能领域的两项关键基础设施协议:模型上下文协议(MCP)与代理对代理协议(A2A)。MCP由Anthropic开发,专注于标准化AI模型与外部工具和数据源的连接,降低系统集成复杂度;A2A由Google发布,旨在实现不同AI代理间的跨平台协作。两者虽有相似之处,但在设计目标与应用场景上互为补充。文章通过具体示例分析了两种协议的技术差异及适用场景,并探讨了其在企业工作流自动化、医疗信息系统和软件工程中的应用。最后,文章强调了整合MCP与A2A构建协同AI系统架构的重要性,为未来AI技术生态系统的演进提供了方向。
447 62
|
23天前
|
存储 消息中间件 SQL
数据中台架构与技术体系
本文介绍了数据中台的整体架构设计,涵盖数据采集、存储、计算、服务及治理等多个层面。在数据采集层,通过实时与离线方式整合多类型数据源;存储层采用分层策略,包括原始层、清洗层、服务层和归档层,满足不同访问频率需求;计算层提供批处理、流处理、交互式分析和AI计算能力,支持多样化业务场景。数据服务层封装数据为标准化API,实现灵活调用,同时强调数据治理与安全,确保元数据管理、质量监控、权限控制及加密措施到位,助力企业构建高效、合规的数据管理体系。
|
19天前
|
存储 机器学习/深度学习 算法
阿里云X86/ARM/GPU/裸金属/超算等五大服务器架构技术特点、场景适配与选型策略
在我们选购阿里云服务器的时候,云服务器架构有X86计算、ARM计算、GPU/FPGA/ASIC、弹性裸金属服务器、高性能计算可选,有的用户并不清楚他们之间有何区别。本文将深入解析这些架构的特点、优势及适用场景,帮助用户更好地根据实际需求做出选择。
|
5月前
|
弹性计算 API 持续交付
后端服务架构的微服务化转型
本文旨在探讨后端服务从单体架构向微服务架构转型的过程,分析微服务架构的优势和面临的挑战。文章首先介绍单体架构的局限性,然后详细阐述微服务架构的核心概念及其在现代软件开发中的应用。通过对比两种架构,指出微服务化转型的必要性和实施策略。最后,讨论了微服务架构实施过程中可能遇到的问题及解决方案。
|
1月前
|
Cloud Native Serverless 流计算
云原生时代的应用架构演进:从微服务到 Serverless 的阿里云实践
云原生技术正重塑企业数字化转型路径。阿里云作为亚太领先云服务商,提供完整云原生产品矩阵:容器服务ACK优化启动速度与镜像分发效率;MSE微服务引擎保障高可用性;ASM服务网格降低资源消耗;函数计算FC突破冷启动瓶颈;SAE重新定义PaaS边界;PolarDB数据库实现存储计算分离;DataWorks简化数据湖构建;Flink实时计算助力风控系统。这些技术已在多行业落地,推动效率提升与商业模式创新,助力企业在数字化浪潮中占据先机。
129 12
|
6月前
|
Cloud Native Devops 云计算
云计算的未来:云原生架构与微服务的革命####
【10月更文挑战第21天】 随着企业数字化转型的加速,云原生技术正迅速成为IT行业的新宠。本文深入探讨了云原生架构的核心理念、关键技术如容器化和微服务的优势,以及如何通过这些技术实现高效、灵活且可扩展的现代应用开发。我们将揭示云原生如何重塑软件开发流程,提升业务敏捷性,并探索其对企业IT架构的深远影响。 ####
139 3
|
6月前
|
Cloud Native 安全 数据安全/隐私保护
云原生架构下的微服务治理与挑战####
随着云计算技术的飞速发展,云原生架构以其高效、灵活、可扩展的特性成为现代企业IT架构的首选。本文聚焦于云原生环境下的微服务治理问题,探讨其在促进业务敏捷性的同时所面临的挑战及应对策略。通过分析微服务拆分、服务间通信、故障隔离与恢复等关键环节,本文旨在为读者提供一个关于如何在云原生环境中有效实施微服务治理的全面视角,助力企业在数字化转型的道路上稳健前行。 ####
|
5月前
|
Java 开发者 微服务
从单体到微服务:如何借助 Spring Cloud 实现架构转型
**Spring Cloud** 是一套基于 Spring 框架的**微服务架构解决方案**,它提供了一系列的工具和组件,帮助开发者快速构建分布式系统,尤其是微服务架构。
447 69
从单体到微服务:如何借助 Spring Cloud 实现架构转型