Informer复现 -- 完整模型

有了数据和核心的ProbAttention,接下来就可以复现完整的Informer(图1)了。

图1:Informer模型结构[1]

如果对图1还不太熟悉的同学,可以参考图2。由图2可知,informer与Transformer之间的差异并不大。

主要区别是ProbAttention和可能的encoder最后一层的conv(源代码中用来distil)。

图2:参考Transformer画的Informer模型结构

Informer三大基本要素: AttentionBlock, MLPBlock, ConvBlock

上次博文已复现了ProbAttention和AttentionBlock (attention + add&norm),而Conv又是基础模块,所以整个Informer不难复现。

MLPBlock

MLPBlock (mlp+add&norm):源代码中采用1x1卷积的形式,相对较为繁琐。为了匹配卷积对应(batch_size, channels, seq_len)的特点,需要将输入先进行维度调整,得到结果后再将维度调整回来。

# 源代码

y = x = self.norm1(x)
y = self.dropout(self.activation(self.conv1(y.transpose(-1,1))))
y = self.dropout(self.conv2(y).transpose(-1,1))

return self.norm2(x+y), attn

直接用mlp则不存在此问题。

class MLPBlock(nn.Module):
    def __init__(self, d_model, d_ff=None, dropout=0.1, act="relu"):
        super().__init__()
        d_ff = d_ff or d_model * 4
        act = nn.ReLU() if act=="relu" else nn.GELU()
        self.net = nn.Sequential(
            nn.Linear(d_model, d_ff),
            act, 
            nn.Dropout(dropout),
            nn.Linear(d_ff, d_model),
            nn.Dropout(dropout)
        )

        self.norm = nn.LayerNorm(d_model)

    def forward(self, x):
        out = self.net(x)
        return self.norm(out + x)

ConvBlock

有了AttentionBlock和MLPBlock,只差ConvBlock就可以完整实现Informer了。如上所述,需要对输入的维度进行调整。

class ConvBlock(nn.Module):
    def __init__(self, cin):
        super().__init__()
        self.net= nn.Sequential(
            nn.Conv1d(cin, cin, 3, 1, 1, bias=False),
      
### 如何实现或复现 Informer 模型 Informer 是一种专为长时间序列预测设计的高效 Transformer 变体。它的核心改进在于减少计算复杂度并提高模型效率,主要通过 ProbSparse 自注意力机制来降低时间和空间复杂度。以下是关于如何使用 PyTorch 或 TensorFlow 实现 Informer 的详细说明。 #### 1. **ProbSparse 自注意力机制** Informer 使用了一种称为 ProbSparse 的自注意力机制,这种机制仅关注最可能的相关位置而不是整个输入序列,从而大幅减少了计算量。这种方法使得 Informer 能够处理非常长的时间序列而不会因内存不足崩溃[^1]。 ```python import torch from informer import InformerModel # 初始化模型参数 input_size = 512 # 输入特征维度 output_size = 512 # 输出特征维度 seq_len = 1024 # 输入序列长度 pred_len = 256 # 预测步数 model = InformerModel( enc_in=input_size, dec_in=output_size, c_out=output_size, seq_len=seq_len, pred_len=pred_len, factor=5, # ProbSparse 参数 d_model=512, # 嵌入维度 n_heads=8, # 多头注意力数量 e_layers=2, # 编码器层数 d_layers=1, # 解码器层数 dropout=0.05 ) print(model) ``` #### 2. **训练过程中的优化技巧** 为了使 Informer 更加稳定和高效,在训练过程中可以采用以下策略: - **梯度裁剪 (Gradient Clipping)**:防止梯度爆炸问题。 - **Warm-up 学习率调度**:帮助模型更快收敛。 - **混合精度训练**:利用半精度浮点运算加速 GPU 训练。 这些技术已经在多个时间序列预测任务中被证明有效[^2]。 #### 3. **对比其他框架的选择** 虽然 TensorFlow 和 PyTorch 都支持深度学习模型开发,但在实际应用中发现 PyTorch 对于新手更加友好,尤其是在模型保存与加载方面。对于希望快速迭代实验的研究者而言,PyTorch 提供了更大的灵活性[^3]。 #### 4. **代码示例** 下面是一个简单的 Informer 模型训练脚本模板,适用于时间序列预测任务。 ```python import torch.optim as optim from dataset import TimeSeriesDataset from utils import EarlyStopping device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') # 数据准备 train_dataset = TimeSeriesDataset(...) val_dataset = TimeSeriesDataset(...) train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=32, shuffle=True) val_loader = torch.utils.data.DataLoader(val_dataset, batch_size=32, shuffle=False) # 定义损失函数和优化器 criterion = torch.nn.MSELoss() optimizer = optim.Adam(model.parameters(), lr=1e-4) early_stopping = EarlyStopping(patience=10, verbose=True) for epoch in range(100): # 总共运行100个epoch model.train() total_loss = 0 for batch_x, batch_y in train_loader: optimizer.zero_grad() outputs = model(batch_x.to(device)) loss = criterion(outputs, batch_y.to(device)) loss.backward() optimizer.step() total_loss += loss.item() avg_train_loss = total_loss / len(train_loader) # 验证阶段 model.eval() val_loss = 0 with torch.no_grad(): for batch_x, batch_y in val_loader: preds = model(batch_x.to(device)) val_loss += criterion(preds, batch_y.to(device)).item() avg_val_loss = val_loss / len(val_loader) early_stopping(avg_val_loss, model) if early_stopping.early_stop: print("Early stopping") break ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值