informer模型架构解释(含举例说明)

informer模型架构解释

在这里插入图片描述

图片引用自论文Informer: Beyond Efficient Transformer for Long Sequence Time-Series Forecasting

这张图片展示了一个Transformer模型的架构,这是在自然语言处理(NLP)和其他序列任务中广泛使用的一种模型。图片显示了一个典型的编码器-解码器结构,这种结构常用于序列到序列的模型,比如机器翻译。以下是详细解释及举例:

详细解释

1. 输入(左侧)

输入序列表示为 X_feed_cn。这可以是一个标记序列,例如一句话中的单词或字符。例如,在机器翻译任务中,输入可以是一个英文句子 “I love learning AI”。

2. 编码器(Encoder)

  • 编码器部分接收输入序列 X_feed_cn 并通过多个堆叠的层进行处理。这些层包括多头注意力机制(Multi-head Attention)、ProbSparse自注意力机制(ProbSparse Self-attention)等。
  • 编码器的每一层都以依赖金字塔(Dependency pyramid)的形式逐步缩小输入序列的表示。
  • 最终生成的编码器输出是一个特征图(Concatenated Feature Map),捕捉了输入序列的上下文信息。

3. 解码器(Decoder)

  • 解码器部分接收经过编码的特征图以及之前生成的输出(通过掩码机制,确保解码器只能看到之前的位置,防止信息泄露)。
  • 解码器的输入表示为 X_feed_de = {X_tokens, X_0},其中 X_tokens 是解码过程中之前生成的输出标记,X_0 是初始输入(通常是一个特殊的开始标记)。
  • 解码器也包含多头注意力机制和掩码多头自注意力机制,用于生成新的序列表示。

4. 输出(右侧)

  • 最终解码器的输出通过一个全连接层(Fully Connected Layer),生成最终的输出序列。
  • 例如,在机器翻译任务中,输出可以是对应的中文句子 “我爱学习人工智能”。

举例说明

假设我们有一个机器翻译任务,从英文翻译到中文。

  • 输入序列: “I love learning AI”
  • 编码器处理:
    • 英文句子通过嵌入层转化为向量表示,输入到编码器。
    • 编码器通过多层自注意力机制处理输入,生成上下文特征图。
  • 解码器处理:
    • 初始解码器输入是开始标记,逐步生成输出标记。
    • 每一步生成的标记会作为下一步的输入,结合编码器的特征图,继续生成序列。
  • 输出序列: “我爱学习人工智能”

这个过程展示了如何从一个输入序列生成一个输出序列,通过编码器和解码器的协作来实现序列到序列的任务。

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的Informer模型的Python代码实现: ```python import torch import torch.nn as nn import torch.nn.functional as F class EncoderLayer(nn.Module): def __init__(self, input_size, hidden_size, num_heads): super(EncoderLayer, self).__init__() self.self_attn = nn.MultiheadAttention(hidden_size, num_heads) self.feed_forward = nn.Sequential( nn.Linear(hidden_size, hidden_size), nn.ReLU(), nn.Linear(hidden_size, hidden_size) ) self.norm1 = nn.LayerNorm(hidden_size) self.norm2 = nn.LayerNorm(hidden_size) self.dropout1 = nn.Dropout(0.1) self.dropout2 = nn.Dropout(0.1) def forward(self, x): x2 = self.norm1(x) x = x + self.dropout1(self.self_attn(x2, x2, x2)[0]) x2 = self.norm2(x) x = x + self.dropout2(self.feed_forward(x2)) return x class DecoderLayer(nn.Module): def __init__(self, input_size, hidden_size, num_heads): super(DecoderLayer, self).__init__() self.self_attn = nn.MultiheadAttention(hidden_size, num_heads) self.src_attn = nn.MultiheadAttention(hidden_size, num_heads) self.feed_forward = nn.Sequential( nn.Linear(hidden_size, hidden_size), nn.ReLU(), nn.Linear(hidden_size, hidden_size) ) self.norm1 = nn.LayerNorm(hidden_size) self.norm2 = nn.LayerNorm(hidden_size) self.norm3 = nn.LayerNorm(hidden_size) self.dropout1 = nn.Dropout(0.1) self.dropout2 = nn.Dropout(0.1) self.dropout3 = nn.Dropout(0.1) def forward(self, x, enc_output): x2 = self.norm1(x) x = x + self.dropout1(self.self_attn(x2, x2, x2)[0]) x2 = self.norm2(x) x = x + self.dropout2(self.src_attn(x2, enc_output, enc_output)[0]) x2 = self.norm3(x) x = x + self.dropout3(self.feed_forward(x2)) return x class Informer(nn.Module): def __init__(self, input_size, output_size, enc_seq_len, dec_seq_len, factor=5, d_model=512, n_heads=8, n_layers=2): super(Informer, self).__init__() self.input_size = input_size self.output_size = output_size self.enc_seq_len = enc_seq_len self.dec_seq_len = dec_seq_len self.factor = factor self.d_model = d_model self.n_heads = n_heads self.n_layers = n_layers self.encoder_layers = nn.ModuleList([EncoderLayer(self.input_size, self.d_model, self.n_heads) for _ in range(self.n_layers)]) self.decoder_layers = nn.ModuleList([DecoderLayer(self.output_size, self.d_model, self.n_heads) for _ in range(self.n_layers)]) self.pos_encoder = nn.Linear(self.input_size, self.d_model) self.pos_decoder = nn.Linear(self.output_size, self.d_model) self.fc = nn.Linear(self.d_model, self.output_size) def forward(self, inputs): enc_inputs, dec_inputs = inputs[:, :self.enc_seq_len, :], inputs[:, self.enc_seq_len:, :] # Encoding phase enc_outputs = self.pos_encoder(enc_inputs) for layer in self.encoder_layers: enc_outputs = layer(enc_outputs) # Decoding phase dec_outputs = self.pos_decoder(dec_inputs) for layer in self.decoder_layers: dec_outputs = layer(dec_outputs, enc_outputs) # Final output outputs = self.fc(dec_outputs) return outputs ``` 该模型Informer模型的关键组件,包括编码器层、解码器层、位置编码、全连接层等。在编码器和解码器中,我们使用了多头自注意力和多头注意力机制,以捕捉序列中的时间和空间关系。我们还使用了残差连接和层归一化来缓解梯度消失问题。在训练过程中,我们使用了dropout来进一步缓解过拟合问题。 在模型的前向传播过程中,我们首先将输入序列分为编码器输入和解码器输入,然后对编码器输入进行位置编码和编码器层计算。接下来,在解码器中,我们对解码器输入进行位置编码和解码器层计算,并利用编码器输出和解码器输出之间的多头注意力来捕捉输入和输出之间的关系。最后,我们使用全连接层将输出映射到所需的输出形状。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值