transformer中位置编码的计算方法

在 Transformer 模型中,位置编码(Positional Encoding, PE)是通过正弦和余弦函数生成的。它为输入的每个位置添加位置信息,确保模型能够利用序列的位置信息。这个过程在原始论文 Attention is All You Need 中的公式如下:

[
PE{(pos, 2i)} = \sin\left(\frac{pos}{10000^{\frac{2i}{d{\text{model}}}}}\right)
]
[
PE{(pos, 2i+1)} = \cos\left(\frac{pos}{10000^{\frac{2i}{d{\text{model}}}}}\right)
]
其中:

  • ( pos ) 表示词的位置。
  • ( i ) 是嵌入维度的索引。
  • ( d_{\text{model}} ) 是词嵌入的维度。
  • 奇数索引的位置使用正弦函数,偶数索引的位置使用余弦函数。

具体步骤

  1. 确定维度和序列位置:假设我们有一个嵌入维度 ( d_{\text{model}} = 4 )(简化,实际中通常是 512),输入句子长度为 5(例如,英文句子有5个词)。我们需要计算每个位置的向量,并为每个维度使用上述公式生成正弦和余弦值。

  2. 按照公式计算位置编码:我们需要分别计算每个位置 ( pos ) 和每个维度 ( i ) 上的正弦和余弦值。

示例:假设 ( d_{\text{model}} = 4 ),序列长度为 5。

  • 对于每个位置 ( pos = 0, 1, 2, 3, 4 ),计算它在每个维度 ( i ) 上的编码。

计算公式细化

对嵌入维度 ( d_{\text{model}} = 4 ):

  • 偶数位置 ( 2i ):使用正弦函数 ( \sin )
  • 奇数位置 ( 2i+1 ):使用余弦函数 ( \cos )

我们来逐个计算每个位置 ( pos = 0, 1, 2, 3, 4 ) 的位置编码。

3. 具体计算

对于 ( pos = 0 ):

[
PE{(0, 0)} = \sin\left(\frac{0}{10000^{\frac{0}{4}}}\right) = \sin(0) = 0
]
[
PE
{(0, 1)} = \cos\left(\frac{0}{10000^{\frac{0}{4}}}\right) = \cos(0) = 1
]
[
PE{(0, 2)} = \sin\left(\frac{0}{10000^{\frac{2}{4}}}\right) = \sin(0) = 0
]
[
PE
{(0, 3)} = \cos\left(\frac{0}{10000^{\frac{2}{4}}}\right) = \cos(0) = 1
]

因此,位置 ( pos = 0 ) 的位置编码向量为:
[
[0, 1, 0, 1]
]

对于 ( pos = 1 ):

[
PE{(1, 0)} = \sin\left(\frac{1}{10000^{\frac{0}{4}}}\right) = \sin(1)
]
[
PE
{(1, 1)} = \cos\left(\frac{1}{10000^{\frac{0}{4}}}\right) = \cos(1)
]
[
PE{(1, 2)} = \sin\left(\frac{1}{10000^{\frac{2}{4}}}\right) = \sin\left(\frac{1}{100}\right)
]
[
PE
{(1, 3)} = \cos\left(\frac{1}{10000^{\frac{2}{4}}}\right) = \cos\left(\frac{1}{100}\right)
]

对于 ( pos = 1 ) 的具体数值:
[
\sin(1) \approx 0.8415, \quad \cos(1) \approx 0.5403
]
[
\sin\left(\frac{1}{100}\right) \approx 0.01, \quad \cos\left(\frac{1}{100}\right) \approx 0.99995
]

因此,位置 ( pos = 1 ) 的位置编码向量为:
[
[0.8415, 0.5403, 0.01, 0.99995]
]

对于 ( pos = 2 ):

[
PE{(2, 0)} = \sin\left(\frac{2}{10000^{\frac{0}{4}}}\right) = \sin(2)
]
[
PE
{(2, 1)} = \cos\left(\frac{2}{10000^{\frac{0}{4}}}\right) = \cos(2)
]
[
PE{(2, 2)} = \sin\left(\frac{2}{10000^{\frac{2}{4}}}\right) = \sin\left(\frac{2}{100}\right)
]
[
PE
{(2, 3)} = \cos\left(\frac{2}{10000^{\frac{2}{4}}}\right) = \cos\left(\frac{2}{100}\right)
]

对于 ( pos = 2 ) 的具体数值:
[
\sin(2) \approx 0.9093, \quad \cos(2) \approx -0.4161
]
[
\sin\left(\frac{2}{100}\right) \approx 0.02, \quad \cos\left(\frac{2}{100}\right) \approx 0.9998
]

因此,位置 ( pos = 2 ) 的位置编码向量为:
[
[0.9093, -0.4161, 0.02, 0.9998]
]

对于 ( pos = 3 ):

[
PE{(3, 0)} = \sin\left(\frac{3}{10000^{\frac{0}{4}}}\right) = \sin(3)
]
[
PE
{(3, 1)} = \cos\left(\frac{3}{10000^{\frac{0}{4}}}\right) = \cos(3)
]
[
PE{(3, 2)} = \sin\left(\frac{3}{10000^{\frac{2}{4}}}\right) = \sin\left(\frac{3}{100}\right)
]
[
PE
{(3, 3)} = \cos\left(\frac{3}{10000^{\frac{2}{4}}}\right) = \cos\left(\frac{3}{100}\right)
]

对于 ( pos = 3 ) 的具体数值:
[
\sin(3) \approx 0.1411, \quad \cos(3) \approx -0.9899
]
[
\sin\left(\frac{3}{100}\right) \approx 0.03, \quad \cos\left(\frac{3}{100}\right) \approx 0.99955
]

因此,位置 ( pos = 3 ) 的位置编码向量为:
[
[0.1411, -0.9899, 0.03, 0.99955]
]

对于 ( pos = 4 ):

[
PE{(4, 0)} = \sin\left(\frac{4}{10000^{\frac{0}{4}}}\right) = \sin(4)
]
[
PE
{(4, 1)} = \cos\left(\frac{4}{10000^{\frac{0}{4}}}\right) = \cos(4)
]
[
PE{(4, 2)} = \sin\left(\frac{4}{10000^{\frac{2}{4}}}\right) = \sin\left(\frac{4}{100}\right)
]
[
PE
{(4, 3)} = \cos\left(\frac{4}{10000^{\frac{2}{4}}}\right) = \cos\left(\frac{4}{100}\right)
]

对于 ( pos = 4 ) 的具体数值:
[
\sin(4) \approx -0.7568, \quad \cos(4) \approx -0.6536
]
[
\sin\left(\frac{4}{100}\right) \approx 0.04, \quad \cos\left(\frac{4}{100}\right) \approx 0.9992
]

因此,位置 ( pos = 4 ) 的位置编码向量为:
[
[-0.7568, -0.6536, 0.04, 0.9992]
]

4. 总结

最终,对于一个 5 个词组成的句子,其位置编码矩阵为:
[
PE = \begin{bmatrix}
0 & 1 & 0 & 1 \
0.8415 & 0.5403 & 0.01 & 0.99995 \
0.9093 & -0.4161 & 0.02 & 0.9998 \
0.1411 & -0.9899 & 0.03 & 0.99955 \
-0.7568 & -0.6536 & 0.04 & 0.9992
\end{bmatrix}
]

这个位置编码矩阵将与词嵌入矩阵相加,注入位置信息后用于 Transformer 的输入。

作者

Xiongyuqi

发布于

2024-09-30

更新于

2024-09-30

许可协议

评论