时间序列的Transformer

2021-02-04 11:12:12 浏览数 (2)

https://towardsdatascience.com/the-time-series-transformer-2a521a0efad3

目录

  • 介绍
  • 预处理
  • 可学习的时间表示形式(时间2 Vec)
  • 建筑
  • 袋装技巧(培训变形金刚时应考虑的事项)

介绍

他们说,注意就是您所需要的。它是更健壮的卷积吗?从更少的参数中挤出更多的学习能力仅仅是一种黑客手段吗?它应该稀疏吗?原始作者是如何提出这种架构的?

[图片上传中...(image-98d04d-1612193336266-7)]

[图片上传失败...(image-57d1e6-1612193336266)]

<figcaption class="jv jw fw fu fv jx jy ba b bb bc dv" data-selectable-paragraph="" style="box-sizing: inherit; font-weight: 400; font-family: sohne, "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 14px; line-height: 20px; color: rgb(117, 117, 117); margin-left: auto; margin-right: auto; max-width: 728px; margin-top: 10px; text-align: center;">变压器架构</figcaption>

  • 它比RNN更好,因为它不会重复出现,并且可以使用先前的时步功能而不会造成细节损失
  • 它是多种任务中性能最高的体系结构,包括但不限于:NLP,视觉,回归(可扩展)

从现有的RNN模型切换到Attention体系结构非常容易。输入的形状相同!

预处理

使用变形金刚的时间系列T一SKS比使用它们NLP或计算机视觉的不同。我们既不标记数据,也不将其切成16x16的图像块。取而代之的是,我们遵循一种更为经典/古老的方式来准备数据进行培训。

绝对正确的一件事是,我们必须在与输入相同的值范围内馈送数据,以消除偏差。通常在[0,1]或[-1,1]范围内。通常,建议对所有输入功能都应用相同类型的预处理管道,以消除这种偏差。个别用例可能不受此约束,不同的模型和数据是唯一的!考虑一下数据的来源。

流行的时间序列预处理技术包括:

  • 只需缩放为[0,1]或[-1,1]
  • 标准缩放比例(去除均值,除以标准偏差)
  • 幂变换(使用幂函数将数据推入更正态分布,通常用于偏斜数据/存在异常值的情况)
  • 离群值去除
  • 成对差异或计算百分比差异
  • 季节性分解(试图使时间序列固定)
  • 工程化更多特征(自动特征提取器,存储到百分位数等)
  • 在时间维度上重采样
  • 在要素维度中重新采样(而不是使用时间间隔,而对要素使用谓词来重新安排时间步长(例如,当记录的数量超过N个单位时)
  • 滚动值
  • 集合体
  • 这些技术的结合

同样,预处理决策与问题和手头的数据紧密相关,但这是一个很好的入门清单。

如果您的时间序列可以通过进行季节性分解等预处理而变得平稳,则可以使用较小的模型(例如NeuralProphet或Tensorflow Probability)(通过更快速的训练并且所需的代码和工作量更少)来获得良好的质量预测。

深度神经网络可以在训练期间自行学习线性和周期性分量(我们将在以后使用Time 2 Vec)。就是说,我建议不要将季节性分解作为预处理步骤。

其他决策(例如计算聚合和成对差异)取决于数据的性质以及您要预测的内容。

将序列长度视为一个超参数,这导致我们得到类似于RNN的输入张量形状:(batch size, sequence length, features)

这是设置为3的所有尺寸的图形。

[图片上传中...(image-e6a51d-1612193336266-6)]

[图片上传失败...(image-c3717c-1612193336266)]

<figcaption class="jv jw fw fu fv jx jy ba b bb bc dv" data-selectable-paragraph="" style="box-sizing: inherit; font-weight: 400; font-family: sohne, "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 14px; line-height: 20px; color: rgb(117, 117, 117); margin-left: auto; margin-right: auto; max-width: 728px; margin-top: 10px; text-align: center;">输入形状</figcaption>

可学习的时间表示

为了使工作正常,您需要将时间的含义附加到输入要素上。在原始的NLP模型中,将叠加的正弦函数集合添加到每个输入嵌入中。现在我们需要一个不同的表示形式,因为我们的输入是标量值,而不是不同的单词/标记。

[图片上传中...(image-94e92c-1612193336266-2)]

[图片上传失败...(image-8357eb-1612193336266)]

<figcaption class="jv jw fw fu fv jx jy ba b bb bc dv" data-selectable-paragraph="" style="box-sizing: inherit; font-weight: 400; font-family: sohne, "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 14px; line-height: 20px; color: rgb(117, 117, 117); margin-left: auto; margin-right: auto; max-width: 728px; margin-top: 10px; text-align: center;">来自kazemnejad博客的位置编码可视化。</figcaption>

Time 2 Vec纸张派上用场了。这是一种可学习且互补的,与模型无关的时间重置。如果您过去曾经学习过傅立叶变换,这应该很容易理解。

只需将每个输入要素分解为线性分量(line)和所需的多个周期性(正弦)分量即可。通过将分解定义为函数,我们可以使权重通过反向传播来学习。

[图片上传中...(image-a77e01-1612193336266-4)]

[图片上传失败...(image-d30506-1612193336266)]

<figcaption class="jv jw fw fu fv jx jy ba b bb bc dv" data-selectable-paragraph="" style="box-sizing: inherit; font-weight: 400; font-family: sohne, "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 14px; line-height: 20px; color: rgb(117, 117, 117); margin-left: auto; margin-right: auto; max-width: 728px; margin-top: 10px; text-align: center;">时间2 Vec分解方程</figcaption>

对于每个输入要素,我们以时间独立(时间分布层)的方式应用同一层。这种可学习的嵌入与时间无关!最后,连接原始输入。

这是每个输入要素类别(每个要素1个学习的线性分量和1个学习的周期性分量)的学习时间嵌入的示意图,它们不同

这并不意味着每个时间步都将具有相同的嵌入值,因为time2vec嵌入的计算取决于输入值!

[图片上传中...(image-b2e535-1612193336266-3)]

[图片上传失败...(image-6df012-1612193336266)]

最后,我们将所有这些连接在一起以形成注意模块的输入。

建筑

我们将使用多头自我注意(将Q,K和V设置为取决于通过不同密集层/矩阵的输入)。下一部分是可选的,取决于模型和数据的规模,但我们还将完全放弃解码器部分。这意味着,我们将只使用一个或多个注意力障碍层。

在最后一部分中,我们将使用几个(一个或多个)密集层来预测我们想要预测的内容。

[图片上传中...(image-66ad41-1612193336266-0)]

[图片上传失败...(image-9480a7-1612193336266)]

<figcaption class="jv jw fw fu fv jx jy ba b bb bc dv" data-selectable-paragraph="" style="box-sizing: inherit; font-weight: 400; font-family: sohne, "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 14px; line-height: 20px; color: rgb(117, 117, 117); margin-left: auto; margin-right: auto; max-width: 728px; margin-top: 10px; text-align: center;">我们的建筑</figcaption>

每个注意块均包括自我注意,层规范化和前馈—转发块。每个块的输入尺寸等于其输出尺寸。

(可选)在头部之前,您可以应用某种类型的合并(例如,全局平均1D)。

袋装技巧

使用“变形金刚和注意力”以充分利用模型时需要考虑的事项。

  • 从小开始

不要为超参数而疯狂。从一个单一的,谦虚的注意力层,几个头部和低尺寸开始。观察结果并相应调整超参数-不要过大!缩放模型以及数据。但是,没有什么可以阻止您计划庞大的超参数搜索工作:)。

  • 学习率热身

导致更高稳定性的注意力机制的关键部分是学习率预热。从一个小的学习率开始,然后逐渐提高直到达到基数,然后再次降低。您可能会因指数式而烦恼-递减的计划表和复杂的公式,但是我仅举一个简单的示例,您只需大声阅读以下代码就可以理解:

  • 使用亚当(或其他版本)

非加速梯度下降优化方法不适用于Transformers。亚当是进行培训的最佳初始优化器选择。请密切注意更新(可能更好)的优化技术,例如AdamW或NovoGrad!

0 人点赞