Answers:
其中位置编码的公式如下
与(因此在原纸)。
之所以使用这种技术,是因为在所提出的体系结构中没有词序的概念(第一个词,第二个词等)。输入序列的所有单词都以没有特殊顺序或位置的方式馈入网络(与普通的RNN或ConvNet体系结构不同),因此模型不知道单词的顺序。因此,与位置相关的信号会添加到每个词嵌入中,以帮助模型合并词的顺序。根据实验,这种增加不仅避免破坏嵌入信息,而且还增加了重要位置信息。在RNN的情况下,我们将单词顺序地馈送到RNN,即在步骤馈送第个单词,这有助于模型合并单词的顺序。
Jay Alammar的这篇文章以出色的可视化解释了这篇论文。不幸的是,其当前位置编码示例是不正确的(它对嵌入维度的前半部分使用,对下半部分使用,而不是对偶数索引使用,对奇数索引使用)。
位置编码是单词值及其在句子中位置的重新表示(假定开头和结尾或中间的开头和开头不相同)。
但是您必须考虑到句子的长度可以是任意长度,因此,如果句子的长度不同,那么说“ X”是句子中的第三个单词就没有意义:3词句中的第3个完全是在20个单词的句子中不同于第三。
位置编码器的作用是获得和函数的循环特性的帮助,以返回单词在句子中的位置信息。
为了增加其他答案,OpenAI的ref实现在自然的日志空间中对其进行计算(我认为是为了提高精度。不确定他们是否可以使用以2为底的日志)。他们没有提出编码。这是用C重写为for-for循环的PE查找表生成:
int d_model = 512, max_len = 5000;
double pe[max_len][d_model];
for (int i = 0; i < max_len; i++) {
for (int k = 0; k < d_model; k = k + 2) {
double div_term = exp(k * -log(10000.0) / d_model);
pe[i][k] = sin(i * div_term);
pe[i][k + 1] = cos(i * div_term);
}
}