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!