面试官提问:Positional Encoding 的原理是什么?公式如何表达?为什么要这样设计?
参考回答:
Positional Encoding(位置编码)是 Transformer 模型中的一个关键设计,用于解决序列模型中的位置信息问题。由于 Transformer 依赖于自注意力机制,该机制本质上是无序的,即它不会显式地捕捉输入序列中各个元素的位置信息,因此需要通过 Positional Encoding 来为模型引入序列的位置信息。
1. Positional Encoding 的原理
在传统的序列模型(如 RNN、LSTM)中,输入序列是按照顺序逐步处理的,因此自然包含了位置信息。然而,Transformer 模型完全依赖于并行计算,使用注意力机制处理整个序列中的各个位置。这样虽然提高了计算效率,但同时丢失了位置信息。Positional Encoding 的主要作用就是通过在输入中引入明确的位置信息,帮助 Transformer 识别序列元素的相对和绝对位置。
- 基本思想:通过对输入向量加上具有特定模式的位置信息(编码),使得模型能够区分序列中的不同位置,并捕捉序列的顺序和结构信息。Positional Encoding 采用一组固定的正弦函数和余弦函数,将位置信息编码成向量与输入表示结合。
2. Positional Encoding 的公式
Transformer 中使用的 Positional Encoding 是一种基于正弦和余弦函数的设计,其具体公式如下:
对于输入序列中第
p
o
s
pos
pos 位置的词汇表示,第
i
i
i 维度的 Positional Encoding 由以下公式计算:
P
E
(
p
o
s
,
2
i
)
=
sin
(
p
o
s
1000
0
2
i
d
)
PE(pos, 2i) = \sin \left( \frac{pos}{10000^{\frac{2i}{d}}} \right)
PE(pos,2i)=sin(10000d2ipos)
P
E
(
p
o
s
,
2
i
+
1
)
=
cos
(
p
o
s
1000
0
2
i
d
)
PE(pos, 2i+1) = \cos \left( \frac{pos}{10000^{\frac{2i}{d}}} \right)
PE(pos,2i+1)=cos(10000d2ipos)
其中:
- p o s pos pos 是序列中的位置索引(如第一个词、第二个词的位置)。
- i i i 是位置编码的维度索引。
- d d d 是词向量的维度大小。
具体解释:
- 偶数维使用正弦函数,奇数维使用余弦函数。
- 参数 10000 是一个缩放因子,确保在不同维度上生成的正弦和余弦波有不同的周期,从而捕捉不同频率的信息。
这种编码方式的设计目的是让每个位置的编码在不同维度上具有不同的周期性变化,使得模型可以通过这些不同的频率来区分出序列中的相对位置信息。
3. 为什么要这样设计?
Positional Encoding 采用这种正弦和余弦函数的设计有以下几个重要原因:
1. 捕捉序列的相对位置信息
正弦和余弦函数具有平滑的周期性,通过这种设计,任意两个位置之间的相对距离可以通过它们的位置编码计算出来。具体来说,两个位置的编码之间的差值(尤其是频率较高的维度)可以表示这些位置的相对距离。这样,模型不仅能捕捉到位置的绝对信息,还可以通过编码之间的差异获取到序列中元素之间的相对位置信息。
2. 兼容不同长度的序列
通过使用正弦和余弦函数,Positional Encoding 可以扩展到任意长度的序列,不依赖于特定的序列长度。因此,无论序列有多长,Positional Encoding 都能一致地应用,从而保证了 Transformer 模型可以处理不同长度的输入。
3. 无参数学习
Positional Encoding 不需要额外引入可学习的参数。它完全基于固定的数学公式进行计算,这使得模型在引入位置信息时不会增加参数量,避免了参数膨胀。同时,由于编码是固定的,不会受到模型训练数据的影响,保证了在不同任务中的泛化能力。
4. 有效的周期性变化
正弦和余弦函数的周期性使得不同维度上的位置编码能够捕捉到从局部依赖到全局依赖的信息。在较小的维度上,位置编码的变化相对缓慢,适合捕捉远距离依赖;而在较高的维度上,编码的变化速度较快,可以捕捉到较近的依赖关系。这种多尺度的位置信息捕捉是 Transformer 能够在不同任务中表现出色的一个重要因素。
4. 总结
Positional Encoding 是 Transformer 模型引入序列位置信息的方式,它通过正弦和余弦函数为序列中的每个位置生成一个位置编码,并将其加到词向量中,使得模型能够有效地捕捉输入序列中的绝对和相对位置信息。这种设计通过周期性变化提供了多尺度的信息捕捉能力,同时避免了参数膨胀问题,是 Transformer 模型处理序列数据时的一个重要组成部分。