transformer引入位置信息--Sinusoidal位置编码
首先,所有技术都是个人理解,并感谢技术各位分享,由此根据理解自己做个小结,希望可以帮助到需要的朋友,所有博文出现不对的地方希望能指出。
在介绍本文之前先先入为主给出俩个概念,方便后续理解:
一 语言中token位置特性:token位置是属于语言中word的属性,可以理解为token位置也定义了语言中token的意义;
二 对称性:指的是token在不同的位置但利用transformer输出的结果是相同的,例如:我喜欢她,对于 ‘我’ 和 ‘她’ 这俩个字来说,在transformer虽然位置不同但是输出值是一样的,都表示人这一语义,但其实这俩个字所表示的行为意义是不同的。
为什么transformer需要位置编码
在transformer结构中的attention机制中是不含有位置信息,通过attention机制对重要的输入进行增加权值,用一个不太恰当的例子,比如在聚类中,(transformer结构对应)所要聚类的元素是不是属于该聚类中心,而对于元素与中心的距离这一重要信息是未知的,但是在语言信息中,语言的每一个token的相对物理距离顺序是非常重要信息,比如在lstm中,因为拥有神经元之间可以传递信息的遗忘门、输入门结构,使得该模型获得长时依赖特性,为了能让transformer也可以拥有语言中token位置特性,去掉其对称性,所以对于transformer需要引入一个能够表示token位置信息的输入,使transformer拥有时间依赖特性。
Sinusoidal绝对位置编码
通过以上的铺垫,终于可以上本文的正菜了
首先给出一个正余弦公式:
以上正余弦公式是用于给token在语言中的位置信息编码公式,例如语言中有L个token即语句的长度,pos表示token所在语言中的位置,pos=0,…,L-1,i 表示向量的维度,假设token共有d_model维度,即每一个token的向量长度是d_model,i具体表示为i2 或者i2+1 等于所表示的维度(注意,每一个token的位置信息是一个d_model长度的向量)。
根据三角函数公式:
我们根据上式对 pos + k展开,所以可以给出:
由此 可以计算出输入的绝对位置,即绝对位置编码公式,并因此可以得到了输入位置的position embedding。再则相对位置可以更好的表示token在语句中的关系,因此想利用相对位置来表示位置编码信息,但基于pos 和k点积表示的相对位置信息,但是无法反映位置的方向性,所以需要更好的方法表示相对位置。
本文参考博文 链接有https://zhuanlan.zhihu.com/p/92017824
和博文 https://blog.csdn.net/c9Yv2cf9I06K2A9E/article/details/115059314