HeadlinesBriefing favicon HeadlinesBriefing.com

时间序列中Transformer为何需要位置编码

Towards Data Science •
×

在深入研究时间序列的基础模型时,我意识到如果不先理解Transformer,就无法真正理解它们。我不想把这些模型当作黑盒来使用,所以我开始从基础模型追溯到Transformer,再从Transformer追溯到自注意力机制,逆向追踪这些想法。让这个过渡变得有趣的是,尽管Transformer最初是为语言而构建的,但其核心思想自然地适用于时间序列。这两种模态非常不同,但它们共享一些基本的东西:两者都是序列,而且在两种情况下,顺序都会改变含义。在语言中,狗咬人和人咬狗截然不同。时间序列也不例外。昨天30°今天20°的温度,与昨天20°今天30°的温度讲述的是不同的故事。值可能相同,但它们的顺序改变了序列的含义。问题是,如果自注意力同时查看所有观测值,Transformer如何知道哪个观测值先出现,哪个后出现,或者两个观测值相距多远?这个问题引导我走向了位置编码。最让我惊讶的是,如此简单的数学思想如何能给Transformer一种顺序感。从那时起,具体的技术已经有了很大的发展,但潜在的问题仍然相同。这篇文章是我试图从头开始构建这种直觉的尝试,从一个简单的时间序列开始,沿着从原始观测值到自注意力再到位置编码的路径前进。

从标量观测值到向量表示 考虑一个简单的时间序列,包含五个工作日记录的温度:时间序列示例:5天温度历史 每个观测值x_t只是一个标量。然而,Transformer在维度为d_model的向量上操作。因此,标量观测值需要首先被映射到该表示空间。一个简单的方法是通过学习线性投影,即嵌入:e_t = W_e x_t + b_e 给我们一个向量表示序列:e_1, e_2, e_3, e_4, e_5 嵌入是序列的一种深层、抽象的表示,以多维数值向量的形式编码其特征,并且模型能够理解。每个时间序列token由一个学习的嵌入表示。每个e_t捕获该时间步的观测值信息,但此时,它只是观测值的表示。这里的关键词是学习。模型没有被给予温度(如18°)的预定义向量表示。参数W_e和b_e在训练过程中被学习,使得生成的表示对任务有用。此时,e_t表示观测到的内容。它还没有告诉模型该观测值在序列中出现的位置。

自注意力如何构建上下文?自注意力允许每个观测值使用序列中其余部分的信息。假设我们想更新星期五的表示。模型首先从每个e_t创建三个学习的投影:q_t = W_Q e_t, k_t = W_K e_t, v_t = W_V e_t 查询、键和值向量在自注意力块中学习。矩阵W_Q、W_K和W_V也在训练过程中学习。模型事先没有被告诉有用的查询、键或值应该是什么样子。对于星期五,其查询q_5与所有观测值的键进行比较:k_1, k_2, k_3, k_4, k_5。每次比较产生一个...