这篇Scaleformer还是在看 Transformers in Time Series: A Survey这篇关于时间序列综述的时候看到的,说是关于Transformer架构层面的变体。继上篇 Non-stationary Transformers后发现的又一个可以直接套模型的框架,还是挺感兴趣的,毕竟有些改模型的变体看不懂看的真的好累
—_—
1、文章贡献
提出了一个通用的多尺度框架Scaleformer,可应用于多种时间序列预测SOTA的Transformer模型(如FEDformer、Autoformer等)。
通过在多尺度上迭代地细化时间序列以更好地捕捉时间依赖性,并引入跨尺度标准化缓解因中间不同尺度分布造成的错误预测、引入自适应损失缓解因迭代造成的误差累积,提高模型性能。
2、多尺度结构
- 将时间序列从低频到高频不同的采样率进行采样,并依次迭代将结果送入更高频的decoder中。
- 每一步encoder的输入都是从原始序列 Xenc 不同程度的采样,而除了第0步的decoder的输入是初始化的0数组外,其余i步decoder的输入则是上一步的预测结果进行上采样得到的。
- 算法流程如下
其中公式(1)和(2)的平均池化表示为:
公式(5)和(6)的上采样表示为:
3、跨尺度标准化
- 由于encoder和decoder的数据来源不同,一个来源于原始序列的采样,一个是上一步的预测输出,数据分布之间存在偏差,而decoder输入更高频时的上采样也会产生分布偏差。
需要进行跨尺度标准化。将encoder-decoder的整体输入求平均后,再各自减去均值作为输入
4、自适应损失
- 标准的MSE损失对异常值比较敏感,Huber损失对异常值较为稳健,但当没有主要的异常值时这些损失往往表现不佳。文中使用了2019年在图像处理中提出的自适应损失,据说这是第一次将该损失应用于时间序列预测中。
其中ξ表示残差,α和c为可调节的参数,调节损失对于异常值的敏感度。
附录中有提到Scaleformer多尺度的迭代操作会使误差累积,而自适应损失刚好可以缓解这一问题。
怎么缓解???一脸懵逼中我挖出了2019年那篇《A general and adaptive robust loss function》
简单看了损失函数这块,概率密度函数那里就没往下看了
- 对于α=2、α=0、α=负无穷时的损失函数包括了几种特定的形式:
求导得
下面讨论α的变化对导数的影响- 当α=2:导数随残差x的增大而增大
- 当α=1:导数值将近似于固定值1/c,即随着残差的增大,导数影响变大但有上限
- 当α<1:导数随异常值残差的增大而减小,且α越趋向负值其影响越小
- 当α趋向于负无穷:即使异常值残差大到3c之外,该影响也可以忽视
因此Scaleformer原文附录中提到,越小的α对于异常值越稳健。
5、实验
- 将加了多尺度框架的各种方法与原模型对比:
性能均有所提升- 时间复杂度:
时间上几乎是原模型的2倍了
为了减少时间消耗,将最后一步尺度s=1的Transformer操作替换成了前一步的线性插值计算结果(据说s越小消耗的时间更长)
结果还是会比原模型要好,但是比不上完整的Scaleformer- 消融实验(跨尺度标准化、自适应损失)
- 多尺度框架去除跨尺度标准化
大多数情况下没有标准化的多尺度框架的误差要比原模型大- 单尺度框架(一般模型)加上跨尺度标准化
标准化改善了FEDformer和Informer的结果,但是Autoformer本身的分解层解决了类似的问题,用标准化代替反而效果不佳。- 自适应损失
蓝:baseline
橙:baseline + 自适应损失
绿:多尺度框架 + MSE
红:多尺度框架 + 自适应损失
无论对于多尺度模型还是基本模型,使用自适应损失进行训练都可以提高性能。同样,无论是否有自适应损失,添加多尺度框架可以提高性能。
附录中的表格结果可以看的更清晰
综上所述,将自适应损失与多尺度框架相结合可以获得最佳的性能。
其他更细节的部分还是要回归原文~~结合源码看看,这里就不细写了