在之前的文章中,我对Autoformer的Paper进行了详细解读。今天,对Autoformer的代码按模块进行解读。

Autoformer论文解读: Autoformer: 一种基于自动相关机制的时序预测新架构

Autoformer是将 Transformer 改造为一种深度分解架构(如图 1 所示)包含编码器和解码器两部分。

接下来,我会分别对编码器和解码器中涉及到的模块给出具体的代码实现。

1. Encoder层

Encoder层中包括Auto-Correlation模块,Series Decomp模块。Encoder 专注于季节性部分的建模。编码器的输出包含过去的季节性信息,并将作为跨信息用于帮助解码器优化预测结果。

1.1 Series Decomp模块

在 Autoformer 模型中,序列分解的目标是将时间序列分解为 趋势 和 季节性 部分。这样可以更好地理解序列的长期发展趋势,并单独建模季节性波动。这对于长期预测任务尤为重要,因为长期趋势通常比短期波动更具预测价值。

  • 趋势部分(moving_mean):代表时间序列的长期变化趋势,通常是平稳的。

  • 季节性部分(res):表示时间序列中随时间变化的周期性波动(例如季节性、节假日效应等)。

class moving_avg(nn.Module):
    """
    Moving average block to highlight the trend of time series
    """

    def __init__(self, kernel_size, stride):
        super(moving_avg, self).__init__()
        self.kernel_size = kernel_size
        self.avg = nn.AvgPool1d(kernel_size=kernel_size, stride=stride, padding=0)

    def forward(self, x):
        # padding on the both ends of time series
        front = x[:, 0:1, :].repeat(1, (self.kernel_size - 1) // 2, 1)
        end = x[:, -1:, :].repeat(1, (self.kernel_size - 1) // 2, 1)
        x = torch.cat([front, x, end], dim=1)
        x = self.avg(x.permute(0, 2, 1))
        x = x.permute(0, 2, 1)
        return x


class series_decomp(nn.Module):
    """
    Series decomposition block
    """

    def __init__(self, kernel_size):
        super(series_decomp, self).__init__()
        self.moving_avg = moving_avg(kernel_size, stride=1)

    def forward(self, x):
        moving_mean = self.moving_avg(x)
        res = x - moving_mean
        return res, moving_mean

完整文章链接: 时序预测算法Autoformer代码解读

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐