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

标签 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.7, 0.9, 0.1]
bad      - [0.7, 0.3, 0.4, 0.1]

根据变压器纸,我们添加 每字位置编码每个词嵌入然后将其传递给编码器,如下图所示,

attention is all you need

就论文而言,他们给出了计算每个单词位置编码的公式,
attention 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)所有句子都不会等于最大句子长度,因此我们可能必须填充句子,因此我们还要计算填充标记的位置编码。

最佳答案

你的实现基本上是正确的。典型的实现是预先计算嵌入矩阵,制作不可训练的嵌入层,并进行范围的嵌入查找。见例如在 HuggingFace's Transformers 中的实现.

关于方程背后的直觉的一些提示在这些线程中:

  • on CrossValidated
  • on Reddit

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

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

    我认为比例因子是根据经验估计的,以涵盖通常的句子长度。

    对于填充,您确实还考虑了填充位置的位置编码,但由于它们是预先计算的,因此它确实意味着更高的计算负载,因为无论如何您都会获得填充符号的嵌入。

    关于encoding - 变压器模型中位置编码的实现细节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61550968/

    相关文章:

    asp.net-mvc-3 - 在 mvc 3 razor 应用程序中是否需要/推荐使用 AntiXss 库

    java - 将字符串从 UTF-8 转换为 ANSI 并将其显示为 UTF-8

    deep-learning - torch : GPU Memory Leak

    nlp - Brown Corpus在基于WordNet的语义相似度测量中的作用是什么

    python - NLTK:如何从 csv 文件创建语料库

    python - 将列表中的字典键从 unicode 编码为 ascii

    javascript - 如何比较编码值和解码值

    python - 如何规范化 4D numpy 数组?

    tensorflow - 如何从 tensorflow hub 设置 BERT 预处理层的 output_shape?

    machine-learning - 两个不同数量主题的 LDA 结果之间的相似性?