位置编码
参考资料:四种Position Embedding的原理与PyTorch手写逐行实现
参考资料:位置编码公式详细理解补充
Motivation
在深度学习中,尤其是在处理序列数据(如文本、音频、时间序列等)时,模型需要能够理解输入数据的顺序和位置信息。然而,传统的神经网络结构(如全连接神经网络)和 self-attention 没有考虑输入数据的位置信息,这可能导致模型在处理序列数据时性能下降,特别是在长序列情况下。
Method
Position Embedding
首先,位置编码需要和单词编码长度一致,否则不能相加。如果单词编码的长度为512,那么位置编码的长度也要为512。而每个维度的取值是不一样的,可以参照下图理解:
绝对位置编码
绝对位置编码由两种形式,如上图所示,我们只介绍下面这种。假设序列的长度为𝐿,输入的维度为 𝑑_model(Transformer 模型中的隐藏层维度),位置 pos 和维度 i 的位置编码可以计算如下:
- 为什么这样可以包含位置信息?
从三角函数公式可以看出,此时刻的位置信息是可以由之前时刻的位置信息计算得到的。
相对位置编码
绝对位置编码的问题是,第一个位置和第二个位置的差异等同于第一个位置与第N个位置的差异,没有考虑远近的问题。因此就产生了相对位置编码,比如T5模型。
注意这个相对位置编码的位置不再是加在输入的位置!因此运行速度比其他位置编码要慢。不过它的优势也很明显,可以拓展到无限长度,毕竟这个只和相对位置有关与绝对位置无关。
RoPE 位置编码
RoPE 结合了两者的优势。
直观上,可以从下图中理解旋转位置编码:
具体的表达形式如下,第一部分是旋转矩阵,第二部分是Q和K,第三部分是要旋转的单词向量,为了方便理解,这里用的都是两个维度的表达形式:
更加通用的表达形式如下:
但是这个表达形式过于复杂,下面给出一个变形之后的形式:
可训练的位置编码
可训练的位置编码比较简单,没有太多知识点,其实很像单词编码也是在训练过程中学习的参数。