1. 从Twitter上的一场口水战说起
介绍一下口水战的双方选手:
- Elon Musk:这个不用多说
- Yann LeCun:FaceBook(Meta)首席AI科学家,CNN之父,把CNN和反向传播结合用于手写数字识别就是他的工作
下面就是一些双方论战的截图(幽默向):
在互相拆台之余,LeCun在宣传自家最新论文时不忘手动@一下马斯克,意味深长地嘱咐道:”马斯克,我们这项研究用来改善你家的 Grok 也没问题“。骂战归骂战,CoPE这篇文章还是很值得研究的,是最近的一段时间少有的在大语言模型理论上有突破的一篇文章。
2. Why position encoding in Transformer
如今的大模型已经显示出了强大的威力,Transformer架构功不可没,先回顾一下其中核心的注意力机制:
可以把Transformer表达成如下算子的形式:
也就是注意力算子A和前馈神经网络F,对于F,它是位置无关的。那么,我们应该在A也就是attention上做文章,让其带上位置编码信息。一种简单的想法就是在其输入上加上位置的embedding。
✨self attention
这里就以单头的self attention为例:
- Q(query):模型从token中提取出的,对token的理解信息。用于主动与其它token计算相似程度
a1计算出的Q与其它位置的token的K的转置相乘得到
- K(key):模型从token中提取出的,与其它token的关系信息,被用于与其它token计算相似程度
- V(value):表示当前token的重要程度
这么说可能有点抽象,再以各种购物网站的商品推荐为例解释一下QKV,以键盘为query,推荐系统根据存储的商品关键词Key,计算出两者的相似度,再乘以各种打法机制,这里只以一个评价数为value,可以得到一个总分的排序,得分越高,排序越靠前。
一段简单的代码:
✨Transformer中的相对位置编码
从以上的自注意力计算过程可以看出,虽然采用并行计算的方式比传统的RNN快了不少,但仅使用x或者q,k(来自于x),计算注意力的权重时,并未包含编码的位置信息。
因为每个token都要与其它的token进行计算,所以输出的每个b的值都是包含了全局的信息的,但这里的全局信息指的是全局的内容信息,并不包含位置信息。
以”狗咬人“与”人咬狗“两句话为例,”狗“在第一个和第三个位置的输出一样,假设后续的网络是将经过注意力的两句话简单加和,得到的两句话的输出是一样的,显然是不符合要求的。
也就是说,词与词之间不存在顺序关系(打乱一句话,这句话里的每个词的词向量依然不会变),即无位置关系(既然没有,我就加一个,通过位置编码的形式加)。
3. Bert,GPT中的位置编码
在Transformer的原始论文attention is all you need中,提出了两种位置编码的方式,第一种就是直接初始化一个可学习的位置编码矩阵加在输入上。
这样做的好处是极其简单,但缺点在于对于超过序列最大长度的位置外推困难,因为这种方式可能会响应超过序列最大长度的一些embedding,对于我们来说,是一个间隔了,但对于它来说还是一个没有学习到的东西,那么这个时候的外推就是失败的。
4. Sinusoidal位置编码
这是Transformer原始论文提出的第二种位置编码的方式,但原文并没有对其做过多解释,现在也有很多其它人对其做了一些理解。
这是一种自定义的位置编码,可以表达成一个二维函数f(position, dimension)
这个函数有两个要求:
- 随着position,dimmension的增长应该是有界的
- 足够的区分度,对每个position,对应的向量应该是不同的
对于SinCos位置编码(我习惯这么叫),它利用如下公式产生PE:
对于图中红色的列(偶数列),它采用sin计算,对于图中绿色的列,它用cos计算,这样就可以使得每行的向量完全不同,这样便满足了带来绝对位置信息的要求。
又因为三角函数有如下公式:
可以把某个pos分解开来,以pos=5分解为pos’=1,k=4为例,将原始的PE公式可以变换为:
即图中蓝色小点的值=绿色小点的值交叉相乘的形式,这样便为每个pos的pe值带来了与其它pos的pe值的线性关系,即带来了相对位置关系的可能。当然,这里只是一些简单的推导,更详细的推导可以参考https://kexue.fm/archives/8231
以及https://kexue.fm/archives/8130这两篇文章。这两篇文章指出了此种位置编码其实是一种”想要成为相对位置编码的绝对位置编码“,是有一些瑕疵的,现在也很少直接使用这种形式的位置编码的工作,原因不详。
5. 旋转位置编码RoPE
✨前置:线性代数知识补充
关于行向量和矩阵
关于旋转矩阵
在高维空间中旋转
大的具有一些良好的性质,可以将其拆成在不同的子空间上进行不同的旋转。
✨RoPE的Motivation
二维空间的一个解
在得到QK矩阵,也就是投影之后做,可以得到一个包含i-j信息的解
推广到高维空间
✨整体视角
区分度
这种方式不会产生周期重复
可能的另外一个优势
- 在多个block前向传递的过程中,position的位置信息不会丢失
- 每个block都会先做QKV的投影,然后QK投影之后会做位置旋转变换
相对于原来的加性绝对位置编码来说,在前向传递的过程中,位置信息可能会慢慢丢失
✨回看Sin绝对位置编码
✨RoPE代码实现
在代码实现中,避开了旋转矩阵相乘
代码实现如下:
带RoPE的self-attention代码实现:
✨RoPE总结
6. CoPE
✨Motivation
若采用相对位置编码方式(这里举的例子是一种更简单的相对位置编码,当然RoPE之类的相对位置编码),对于当前词元的位置往前数,这个Attension Score的值是在逐步递减的,