transformer模型 位置编码
时间: 2025-01-06 20:34:10 浏览: 4
### Transformer 模型中的位置编码
#### 位置编码的作用
在Transformer模型中,自注意力机制使得模型能够并行处理整个输入序列,但这意味着它失去了对词序的信息感知能力。为了使模型理解单词之间的顺序关系,在输入嵌入的基础上加入了位置编码[^1]。
位置编码的主要目的是赋予模型关于词语在其上下文中所处位置的能力。通过这种方式,即使在没有循环结构的情况下,模型也能捕捉到序列数据的时间/空间属性。具体而言:
- **保持语义信息**:确保同一词汇的不同出现可以携带不同的含义。
- **引入顺序信息**:让网络知道两个token是相邻还是相隔较远。
#### 绝对位置编码的实现方式
最初的Transformer采用了一种基于正弦和余弦函数的形式来构建固定的位置编码向量[^2]。这种方案利用不同频率的波形组合表示各个位置,并将其加到了对应的词嵌入上。其公式如下所示:
\[ PE_{(pos, 2i)} = \sin\left(\frac{position}{10000^{2i/d}}\right) \]
\[ PE_{(pos, 2i+1)} = \cos\left(\frac{position}{10000^{2i/d}}\right) \]
其中 \( pos \) 表示token在整个句子中的索引;\( d \) 是模型维度大小;而 \( i \) 则代表当前计算的具体分量编号。
```python
import numpy as np
def get_position_encoding(seq_len, embed_dim):
position_encodings = []
for pos in range(seq_len):
encoding_at_pos = [
(np.sin(pos / (10000 ** (2 * i / embed_dim))) if i % 2 == 0 else
np.cos(pos / (10000 ** ((2 * i - 1) / embed_dim))))
for i in range(embed_dim)]
position_encodings.append(encoding_at_pos)
return np.array(position_encodings)
```
此方法的优点在于它可以很好地推广至未知长度的新序列,因为这些三角函数具有周期性和平滑过渡特性。
#### 相对位置编码简介
除了上述提到的传统绝对位置编码外,还有研究提出了相对位置编码的方法[^3]。这类技术不是直接给定每个token确切的位置坐标,而是关注于一对tokens间的相对距离。这样做不仅有助于减少内存消耗,而且可能更适合某些特定的任务需求,比如长文本理解和生成等场景。
阅读全文