位置嵌入如何在自注意力机制中工作(Pytorch 中的代码)

了解位置嵌入是如何出现的,以及我们如何使用内部自注意力来对图像等高度结构化的数据进行建模

来源:AI夏令营

如果您正在阅读 transformer 论文,您可能已经注意到位置嵌入 (PE)。它们看起来很合理。但是,当您尝试实现它们时,它会变得非常混乱!

答案很简单:如果您想实现与 transformer 相关的论文,那么掌握位置嵌入非常重要。

事实证明,正弦位置编码不足以解决计算机视觉问题。图像是高度结构化的,我们希望在多头自注意力 (MHSA) 块内加入一些强烈的位置感(顺序)。

不是 MHSA

为此,我将介绍一些理论以及我对位置嵌入的重新实现。

代码包含 einsum 操作。如果您不熟悉,请阅读我以前的文章。代码也可用。

上一篇文章 可用

位置编码与位置嵌入

在 vanilla Transformer 中,位置编码是在第一个 MHSA 块模型之前添加的。让我们首先澄清这一点:位置嵌入与正弦位置编码无关。它与单词或补丁嵌入非常相似,但在这里我们嵌入的是位置。

vanilla transformer 之前 不是
序列的每个位置都将映射到一个大小为 dimdimdim 的可训练向量

序列的每个位置都将映射到一个大小为 dimdimdim 的可训练向量

已映射 dimdimdim dimdimdim dimdim dimdim dim d i m dim dim dim d i m 此外,与固定的编码相比,位置嵌入是可训练的。

以下是其工作原理的粗略说明:

pos_emb1D = torch.nn.Parameter(torch.randn(max_seq_tokens, dim))input_to_transformer_mhsa = input_embedding + pos_emb1D[:current_seq_tokens, :]out = transformer(input_to_transformer_mhsa)

pos_emb1D = torch.nn.Parameter(torch.randn(max_seq_tokens, dim))

pos_emb1D

= torch nn 参数 ( torch . randn ( max_seq_tokens , dim ) ) input_to_transformer_mhsa = input_embedding + pos_emb1D[:current_seq_tokens, :]

input_to_transformer_mhsa

= input_embedding + pos_emb1D [ : current_seq_tokens , : ] out = ( )