Encoding 变压器模型中位置编码的实现细节?

Encoding 变压器模型中位置编码的实现细节?,encoding,deep-learning,nlp,transformer,attention-model,Encoding,Deep Learning,Nlp,Transformer,Attention Model,这个位置编码是如何计算的 让我们假设一个机器翻译场景,这些是输入句子 english_text = [this is good, this is bad] german_text = [das ist gut, das ist schlecht] 现在我们的输入词汇量是4,嵌入维度是4 #words #embeddings this - [0.5, 0.2, 0.3, 0.1] is - [0.1, 0.2, 0.5, 0.1] good - [0.9, 0

这个位置编码是如何计算的

让我们假设一个机器翻译场景,这些是输入句子

english_text = [this is good, this is bad]
german_text = [das ist gut, das ist schlecht]
现在我们的输入词汇量是4,嵌入维度是4

#words     #embeddings
this     - [0.5, 0.2, 0.3, 0.1]
is       - [0.1, 0.2, 0.5, 0.1]
good     - [0.9, 0.7, 0.9, 0.1]
bad      - [0.7, 0.3, 0.4, 0.1]
根据transformer paper,我们将每个单词位置编码每个单词嵌入相加,然后将其传递给编码器,如下图所示

就论文而言,他们给出了计算每个单词位置编码的公式,

所以,这就是我认为我可以实现它的方式

d_model = 4 # Embedding dimension

positional_embeddings = np.zeros((max_sentence_length, d_model))

max_sentence_length = 3 # as per my examples above

for position in range(maximum_sentence_length):
    for i in range(0, d_model, 2):
       positional_embeddings[position, i] = (
                                          sin(position / (10000 ** ( (2*i) / d_model) ) )
                                            )
       positional_embeddings[position, i + 1] = (
                                              cos(position / (10000 ** ( (2 * (i + 1) ) / d_model) ) )
                                                )
然后,将生成新的嵌入向量

[[0.5, 0.2, 0.3, 0.1], 
 [0.1, 0.2, 0.5, 0.1], 
 [0.9, 0.7, 0.9, 0.1]] + positional_embeddings = NEW EMBEDDINGS

 ## shapes
  3 x 4                + 3 x 4                 = 3 x 4     
在实施过程中,计算是这样进行的吗?如果我上面的伪实现中有任何错误,请纠正我

如果一切都是正确的,那么我有三个疑问希望有人能澄清它们

1) 从上面的实现中,偶数位置使用sin公式,奇数位置使用cos公式,但我不明白背后的原因是什么?我读到它使用循环属性,但不理解它

2) 选择
10000/(2i/d)
10000/(2i+1/d)
作为公式中的比例因子有什么原因吗


3) 所有句子都不等于最大句子长度,因此我们可能必须填充句子,因此我们也要计算填充标记的位置编码。

您的实现基本正确。典型的实现是预先计算嵌入矩阵,生成一个不可训练的嵌入层,并对一个范围进行嵌入查找。例如,参见中的实施

关于方程式背后的直觉的一些提示如下:

但在我看来,几乎所有关于位置编码的决定都是经验性的选择

通过循环性质,它们意味着给定嵌入维度,具有恒定偏移量的位置之间的嵌入值差异是相同的,而与序列中的位置无关。因此,仅使用正弦或余弦可能就足够了,但某些位置的范数比其他位置的范数大得多,因此它们交替使用正弦和余弦

我认为根据经验估算的比例因子涵盖了通常的句子长度


使用填充,你也确实考虑了填充位置的位置编码,但是因为它们是预先计算的,所以它确实意味着更高的计算负载,因为无论如何你都得到了填充符号的嵌入。

在最后一句中,你的意思是“这并不意味着更高的计算负载”吗?