位置编码的原理详解

本文最后更新于 2024年7月31日下午3点14分

位置编码的原理和细节

位置编码positional encoding就是在tokens中加入位置信息,因为对文本来说,相同单词在不同位置的含义不同,给每个单词在文本中的位置信息对之后的模型训练很重要。

位置编码可以分为绝对位置编码和相对位置编码。

  1. 绝对用这编码就是让每个token存储它的绝对位置的信息。 绝对位置编码最常见的有三角函数位置编码。是google的论文‘attention is all you need’当中提出来的

  2. 相对位置编码考虑的是token之间的相对位置 在计算attention的时候考虑当前位置与被attention的位置的相对距离。相对位置编码起源于google的论文’self attention with relative position representations’, 很经典的有旋转位置编码RoPE.

三角函数式位置编码

这里介绍的是论文’attention is all you need’中的位置编码方法:
假设一个句子,经过分词得到L个token,每个token经过embedding得到长度为 $1\times K$的向量,则该句子向量化得到大小为$L\times K$的张量。
位置编码公式如下:
位置编码公式
其中pos是token的index,从0~L-1;2i和2i+1表示该token中某个元素是奇数位还是偶数位,范围是0~K-1。$d_{model}$应该是表示embedding的维度,也就是经过embedding之后的token的长度,这里$d_{model}=K$.
简单而言,在这个尺寸为$L\times K$的张量中加入位置编码,pos表示行号,2i或者2i+1表示列号。对某一行,偶数列加入sin函数,奇数列加入cos函数。

可视化位置编码张量,其中纵轴是上面公式中的pos,横轴是2i或者2i+1。即可以把每一行看作给该token添加的位置编码向量,可以发现每个token对应的位置编码都是不一样的,可以表征token在句子当中的位置。
可视化位置编码张量

如何自己用代码实现位置编码也是常见考题,在这里看如何用numpy实现位置编码:
pytorch面试题:实现位置编码

参考

这个transformer论文中用了三角函数式位置编码:attention is all you need论文

参考这个博客理解位置编码和代码实现:Medium: Positional Encoding Part I

苏剑林—旋转位置编码: Transformer升级之路:2、博采众长的旋转式位置编码


位置编码的原理详解
https://kangkang37.github.io/2024/07/05/positional_encoding/
作者
kangkang
发布于
2024年7月5日
许可协议