LSTM+transformer+稀疏注意力机制
1.LSTM
LSTM(Long Short-Term Memory,长短期记忆网络)是一种特殊的递归神经网络(RNN),设计用于解决标准RNN在处理长序列时的梯度消失和梯度爆炸问题。LSTM通过引入记忆单元和门控机制,可以在长时间跨度内保持和更新关键信息,从而在许多序列数据任务中表现出色。
LSTM的结构
LSTM的基本单元包括以下三个主要组件:
-
细胞状态(Cell State):
- 细胞状态是LSTM的核心部分,贯穿整个序列的数据流。它相当于一个直通通道,允许信息以最少的修改通过时间步长传播。细胞状态通过加法和乘法操作来控制信息的传递和遗忘,避免了梯度消失问题。
-
门控机制(Gates): LSTM通过三个门控来调节信息的流动:
- 遗忘门(Forget Gate):决定细胞状态中哪些信息需要被遗忘。它接受前一时间步长的隐藏状态和当前输入,通过一个Sigmoid激活函数输出一个0到1之间的值,控制信息是否被丢弃。
- 输入门(Input Gate):决定当前时间步长的新信息对细胞状态的更新程度。输入门与当前输入和前一隐藏状态结合,通过Sigmoid激活函数输出控制信号。
- 输出门(Output Gate):决定细胞状态中的哪些部分将作为隐藏状态输出,并传递到下一时间步长。输出门通过Sigmoid激活函数,结合当前输入和前一隐藏状态,生成下一步的隐藏状态。
-
隐藏状态(Hidden State):
- 隐藏状态是LSTM输出的主要内容,也是传递到下一个时间步长的信息。它包含了LSTM单元对当前时间步长输入和细胞状态的理解。
2.Transformer
Transformer是一种深度学习模型,最早由Vaswani等人在2017年的论文《Attention is All You Need》中提出。它最初用于自然语言处理任务,但由于其出色的性能和高度的并行性,迅速被应用于各种领域,如图像处理、时间序列预测等。Transformer的核心是自注意力机制,它能够直接建模序列中的全局依赖关系。
Transformer的基本结构
Transformer模型由编码器(Encoder)和解码器(Decoder)两部分组成,这两部分由若干层堆叠而成。每一层由以下几个关键组件组成:
-
自注意力机制(Self-Attention Mechanism):
- 自注意力机制是Transformer的核心。它允许模型在处理序列的每个元素时,同时关注序列中的其他元素,从而捕捉全局信息。
- 计算步骤:
- 输入嵌入(Input Embedding):首先,将输入序列中的每个元素嵌入为一个向量。
- 生成查询、键、值向量(Query, Key, Value Vectors):通过线性变换,将每个嵌入生成查询(Q)、键(K)、值(V)向量。
- 计算注意力得分:通过点积计算查询向量与键向量之间的相似度,并除以缩放因子(通常是向量维度的平方根)以避免数值不稳定性。然后应用Softmax函数,将其转换为概率分布。
- 加权求和:将得到的注意力得分与值向量相乘,得到输出向量。
- 多头注意力(Multi-Head Attention):为了让模型从多个角度捕捉信息,自注意力机制通常会被扩展为多个“头”(head),每个头独立计算注意力并进行并行处理,最后将结果拼接并通过线性层投影。
-
前馈神经网络(Feed-Forward Neural Network):
- 每个注意力层之后接一个前馈神经网络,通常由两个线性变换层组成,中间通过ReLU激活函数。这一层为每个时间步独立地处理输入,并进一步对信息进行非线性变换。
-
层归一化(Layer Normalization):
- 每个子层(注意力层和前馈网络层)之后,Transformer使用层归一化来稳定和加速训练过程。
-
残差连接(Residual Connection):
- Transformer使用残差连接来缓解深层网络中的梯度消失问题。这意味着子层的输入将直接添加到子层的输出,帮助模型更好地学习。
-
位置编码(Positional Encoding):
- 由于Transformer没有内在的序列处理顺序(不像RNN和LSTM那样按时间步处理数据),模型通过位置编码引入序列的位置信息。位置编码通常是固定的正弦和余弦函数,也可以是可学习的参数。
Transformer的工作流程
-
编码阶段:
- 输入序列经过嵌入层后,被加上位置编码,然后通过多个编码器层。每个编码器层由一个多头自注意力机制和一个前馈神经网络组成。编码器的输出是高维表示,其中包含了整个序列的信息。
-
解码阶段:
- 解码器类似于编码器,但在自注意力机制后增加了一个与编码器输出交互的注意力层(通常称为“编码器-解码器注意力”)。解码器的输入通常是目标序列的偏移版本(如翻译任务中的已经翻译部分),解码器逐步生成输出。
Transformer的优点
-
并行计算:由于不需要像RNN那样按时间步处理数据,Transformer能够同时处理序列中的所有元素,这使得训练速度大幅提升,特别是在GPU上。
-
捕捉全局依赖关系:自注意力机制使得Transformer能够直接建模序列中的长距离依赖关系,无论元素之间的距离有多远。
-
适应多种任务:Transformer不仅在自然语言处理任务(如机器翻译、文本生成)中表现出色,还被广泛应用于图像处理、时间序列预测、语音识别等领域。
-
更好的性能:在许多任务上,Transformer优于传统的RNN和LSTM模型,尤其是在处理大规模数据时。
3.ASSA
ASSA是2024年发布的一个注意力机制,很新可以做创新点。
ASSA提出了一种自适应稀疏变压器 (AST) 来减轻不相关区域的噪声相互作用,并消除空间域和通道域中的特征冗余。AST 包括两个核心设计,即自适应稀疏自注意力 (ASSA) 模块和功能精炼前馈网络 (FRFN)。具体来说,ASSA 是使用双分支范式自适应计算的,其中引入稀疏分支以消除低查询键匹配分数对聚合特征的负面影响,而密集分支则确保有足够的信息流通过网络来学习判别性表示。同时,FRFN em 采用了一种增强和简化方案来消除通道中的特征密度,通过ASSA机制和LSTM处理后的特征输入到transformer网络预测,可以进一步提高预测的准确性和效率。在顶刊ETTh开源数据集达到一个很不错的效果。
实验代码
class Model(nn.Module):
"""
Vanilla Transformer
with O(L^2) complexity
Paper link: https://proceedings.neurips.cc/paper/2017/file/3f5ee243547dee91fbd053c1c4a845aa-Paper.pdf
"""
def __init__(self, configs):
super(Model, self).__init__()
self.pred_len = configs.pred_len
self.output_attention = configs.output_attention
self.lstm = LSTM(input_size=configs.enc_in, hidden_size=configs.d_model, num_layers=3,
batch_size=configs.batch_size)
# Embedding
self.enc_embedding = DataEmbedding(configs.enc_in, configs.d_model, configs.embed, configs.freq,
configs.dropout)
# Encoder
self.encoder = Encoder(
[
EncoderLayer(
AttentionLayer(
FullAttention(False, configs.factor, attention_dropout=configs.dropout,
output_attention=configs.output_attention), configs.d_model, configs.n_heads),
configs.d_model,
configs.d_ff,
dropout=configs.dropout,
activation=configs.activation
) for l in range(configs.e_layers)
],
norm_layer=torch.nn.LayerNorm(configs.d_model)
)
# Decoder
self.dec_embedding = DataEmbedding(configs.dec_in, configs.d_model, configs.embed, configs.freq,
configs.dropout)
self.decoder = Decoder(
[
DecoderLayer(
AttentionLayer(
FullAttention(True, configs.factor, attention_dropout=configs.dropout,
output_attention=False),
configs.d_model, configs.n_heads),
AttentionLayer(
FullAttention(False, configs.factor, attention_dropout=configs.dropout,
output_attention=False),
configs.d_model, configs.n_heads),
configs.d_model,
configs.d_ff,
dropout=configs.dropout,
activation=configs.activation,
)
for l in range(configs.d_layers)
],
norm_layer=torch.nn.LayerNorm(configs.d_model),
projection=nn.Linear(configs.d_model, configs.c_out, bias=True)
)
数据集
数据集都可以,只要是时间序列格式,不限领域,类似功率预测,风电光伏预测,负荷预测,流量预测,浓度预测,机械领域预测等等各种时间序列直接预测。可以做验证模型,对比模型。格式类似顶刊ETTH的时间序列格式即可。
这里是时间列+7列影响特征+1列预测特征
实验结果
这里我按照训练集80%测试集20%进行训练。
图中表明LSTM-Transformer模型在时间序列预测任务中表现出色,能够准确预测大多数时间点的值,尽管在一些极端波动或拐点处仍有一定的误差。总体而言,该模型是有效的,但可能需要进一步优化以减少在某些极端情况下的误差。
4.功能如下
1.多变量输入,单变量输出/可改多输出
2.多时间步预测,单时间步预测
3.评价指标:R方 RMSE MAE MAPE 对比图
4.数据从excel/csv文件中读取,直接替换即可。
5.结果保存到文本中,可以后续处理。
代码带数据,注释清晰,直接一键运行即可,适合新手小白。
接运行,主页还有其他优质模型,或者需要在此基础缝合模型或者其他模型要求,直接发要求给博主就行。
5.补充
创新性非常高,保底3区以上完全够用,效果也不错。代码里也有pdf理论知识和注释方便理解,代码是在顶会源码的基础上解决了大量报错,删除多余部分并且添加功能,适合小白,注释清楚,没学过都能看懂。
继续改进:LSTM也可以改为其他创新卷积或者提取特征模块,例如可将LSTM改为TCN,CNN或者其他提取特征的方式,transformer也可以替换为其他主预测模型,另外也可以改其他优化算法,继续提升创新。比如SSA,多元宇宙,VMd等等其他优化算法。如果需要也可以发要求私信博主。
模型预测效果优秀。结合其他模型或者其他效果都很不错。