位置编码既不属于传统意义上的嵌入层,也不属于编码层,不过从作用和实现位置来看,它与嵌入层关系更为紧密,在一些情况下也会被视作嵌入层的一部分,以下是具体解释:
从定义和功能角度分析
- 嵌入层:主要功能是将离散的符号(如文本中的单词、图像中的像素类别等)映射为连续的低维向量表示,即嵌入向量 。以自然语言处理中的词嵌入为例,嵌入层会为每个单词分配一个唯一的向量,这个向量能捕捉单词的语义和语法信息,比如 “cat” 和 “dog” 作为语义相近的词,它们的词嵌入向量在向量空间中的距离会相对较近。 嵌入层的核心在于对离散元素进行向量化表示,重点关注元素本身的特征。
- 编码层:以 Transformer 架构中的编码器层为例,它会对输入的向量序列进行一系列复杂的运算,比如多头自注意力机制捕捉序列中元素之间的依赖关系,前馈神经网络进一步提取和变换特征等。编码层的主要任务是通过各种计算操作,将输入向量序列转化为更具语义信息和上下文关联的表示,是对输入信息进行深度加工的过程。
- 位置编码:由于 Transformer 架构中的自注意力机制本身不具备对序列中元素位置信息的感知能力(例如 “我爱你” 和 “你爱我” 经过自注意力计算时,如果不考虑位置,某些计算结果可能会相同,但实际语义不同),所以需要引入位置编码来为每个位置赋予独特的编码信息,从而让模型能够区分不同位置的元素,捕捉序列的顺序信息。 位置编码关注的是元素在序列中的位置特征。
从实现和融入模型的角度分析
- 与嵌入层的关联:在实际应用中,位置编码通常是在嵌入层生成词嵌入向量之后,以相加或拼接的方式与词嵌入向量进行融合,共同作为后续编码层的输入。 例如在 BERT 模型中,会将词嵌入(Token Embedding)、段嵌入(Segment Embedding ,用于区分不同句子)和位置编码(Position Embedding)相加,得到最终的输入表示。这种实现方式使得位置编码在模型流程上更接近嵌入层的输出环节,也因此在一些表述中,会将位置编码视为嵌入层功能的一种扩展,认为它属于广义的嵌入层范畴。
总体而言,位置编码在功能上弥补了 Transformer 对位置信息的缺失,在实现上与嵌入层紧密相连,虽然不能简单将其归为嵌入层或编码层,但相对更贴近嵌入层的概念和实现位置。
位置编码技术实现原理
在 Transformer 的 Encoder 中,位置编码(Positional Encoding)是通过直接与词嵌入向量相加的方式加入的,目的是让模型捕捉序列中单词的位置信息(因为 Transformer 的自注意力机制本身不具备时序感知能力)。
具体实现方式如下:
1.生成位置编码向量
2.与词嵌入向量相加
解释:比如:输入的文本为:我爱你中国 —》经分词操作后变为词序列[“我”,“爱”,“你”,“中”,“国”]–》经词嵌入技术变为为嵌入向量:
[
[0.1,0.2,0.3],
[0.4,0.5,0.6],
[0.4,0.5,0.6],
[0.7,0.8,0.9],
[0.1,0.3,0.4]
]
即变为向量矩阵。矩阵的形状为(5,4)5:为行数,每一行代表一个词对应的嵌入向量,4:词嵌入的纬度。这里为了讲解方便假设了d_model为4
上述说的针对序列中的每个位置,指的是矩阵中的每一行的词向量序列来说的。比如针对第一个位置的词向量:[0.1,0.2,0.3]生成其对应的位置编码,i从0到3。== [偶数索引算出的PE结果,奇数索引算出的PE结果,偶数索引算出的PE结果,奇数索引算出的PE结果]==,这样通过正弦与余弦交替生成。得到的此向量,即为位置为1的词对应的位置编码向量。然后让 [0.1,0.2,0.3] + [偶数索引算出的PE结果,奇数索引算出的PE结果,偶数索引算出的PE结果,奇数索引算出的PE结果] 得到的就是此位置的输入向量。依次按此公式计算,第2,3,4位置的输入向量。最后每个位置的输入向量。右组成了一个形状为(5,4)的输入向量矩阵。