为什么需要位置编码?
- 大模型在处理序列数据时,其内部的注意力机制是内容驱动的,只关注token的相似度,无法感知到token的位置信息,因此需要引入额外的信息来表达token所在的空间信息
sinusoidal位置编码
- 基于embedding的维度d和其维度中具体的索引i以及token的位置pos进行编码
- 同时使用sin和cos的值,这样能够避免周期导致的值相等混淆了模型对于位置的理解
- 编码反映了token之间的相对关系而不是绝对关系,编码的差值与token位置的差值有关,且相邻的token编码值也相差较小:
- 这里由公式可以得知,对于不同索引的维度,维度索引越大,频率越大,周期越短。对于低频情况,周期较长,同一个句子中的首尾token位置编码可能在这种周期下呈现较小的位置差异,这能够体现偏全局的位置信息,如这两个token处于同一个句子的信息;而高频周期较短的情况下,变化更为剧烈,值变化相对较大,对于相邻位置之间的微小差异更为敏感非常适合捕捉“token紧邻的顺序信息”
旋转位置编码(RoPE,Rotary Position Embedding)
- sinusoidal编码对于相对位置的建模比较间接,而RoPE则是一种更为直接的相对位置建模方法
- 传统的方式是将编码直接加到token embedding上,这样在计算注意力分数时仍然是依赖于两个token各自的位置, 并不会引入两个位置的差值
- 而RoPE则是将位置信息编码进注意力机制中Query和Key向量的角度中,用复数旋转或2D旋转的方式,引入“相对位移”信息,最后的注意力分数与位置的差值相关:
- RoPE相比于传统的正余弦编码,具有更强的外推能力。传统的正余弦编码每个词都有一个基于「第几位」的编码,比如第 1 位、第 99999 位,如果模型只见过最多第 1000 位,那么遇到第 99999 位时就会很懵逼,注意力分数变得不稳定,其他token“不知道”是不是该关注这个位置的内容。而RoPE只关注位置差值,一定程度上增加了模型的外推泛化能力
- PS:个人疑问,如果说正余弦编码中,模型是因为无法看到没有出现的位置的token而导致注意力分数计算出现偏移,那使用RoPE也会出现差值范围的不一致,是否也会导致模型出现一定的分数计算偏移呢?(当然整体来说RoPE外推能力肯定更强)
ALiBi(Attention with Linear Biases)
- 上述也提到了,正余弦编码方式下外推能力比较弱。即使旋转位置编码比正弦方法有所改进,但仍未达到令人满意的结果
- ALiBi不显式修改embedding,而是直接在Attention Score上加「线性偏置」,让模型天然关注距离近的token,同时根据m每一个注意力的head会乘上一个预设好的斜率项(Slope)
- 也就是说这种编码方法不像之前两种方法一样涉及模型的理解问题,而是简单在已有的分数上进行惩罚
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |