Transformer中的positional Embedding详解

        首先,直接放出论文中的公式:

 

其中,dmodel为每个词向量的维度,pos为一个句子中每个词的位置,2i也代表了词向量的维度,因此,2i <= dmodel, 因此,i的取值为:[0,1,,,1/2*dmodel];

按上图的示例,机器学习,分词后为两个词“机器”、“学习” ,设定每个词的维度Dmodel = 4;

当对“机器”进行位置嵌入时,pos为0, i 的取值为0、1

PE(pos=0,2*i=0) = sin(0) = 0       i=0;

PE(pos=0,2*i+1=1) = cos(0) = 1      i=0;

PE(pos=0,2*i=2) = sin(0) = 0       i=1;

PE(pos=0,2*i+1=3) = cos(0) = 1      i=1;

当对“学习”进行位置嵌入时,pos为1, i 的取值为0、1:

PE(pos=1,2*i=0) = sin(1) = 0.84       i=0;

PE(pos=1,2*i+1=1) = cos(1) = 0.54      i=0;

PE(pos=1,2*i=2) = sin(0.01) = 0.01       i=1;

PE(pos=1,2*i+1=3) = cos(0.01) = 1      i=1;

        接下来根据大佬们的汇总,我简单总结下为什么最后选用三角函数作positional Embedding;

        首先,位置编码最重要的就是加入位置信息,体现每个词不同的位置,最直接的就是即使用计数作为文本中每个字的位置编码了。即pos=0,1,2...T-1,T; 当然这样的瑕疵非常明显,这个序列是没有上界的。设想一段很长的(比如含有500个字的)文本,最后一个字的位置编码非常大,这是很不合适的;

        接着,考虑使用文本长度对每个位置作归一化,PE = pos/ (T-1), 这样固然使得所有位置编码都落入(0,1)的区间,但是问题也是显著的:不同长度文本的位置编码步长是不同的,在较短的文本中紧紧相邻的两个字的位置编码差异,会和长文本中相邻数个字的两个字的位置编码差异一致。这显然是不合适的,我们关注的位置信息,最核心的就是相对次序关系,尤其是上下文中的次序关系,如果使用这种方法,那么在长文本中相对次序关系会被「稀释」;

        最后,再重新审视一下位置编码的需求:1. 需要体现同一个单词在不同位置的区别;2. 需要体现一定的先后相对次序关系,并且在一定范围内的编码差异不应该依赖于文本长度,具有一定不变性。我们又需要值域落入一定数值区间内的编码,又需要保证编码与文本长度无关;一种思路是使用有界的周期性函数,在前面的两种做法里面,我们为了体现某个字在句子中的绝对位置,使用了一个单调的函数,使得任意后续的字符的位置编码都大于前面的字,如果我们放弃对绝对位置的追求,转而要求位置编码仅仅关注一定范围内的相对次序关系,那么使用一个sin/cos函数就是很好的选择,因为sin/cos函数的周期变化规律非常稳定,所以编码具有一定的不变性。简单的构造可以使用下面的形式:

以上公式,在长文本中还是可能会有一些不同位置的字符的编码一样,因此,采用以下公式:

这里不同维度上的波长都不同;区分了奇偶数维度的函数形式。这使得每一维度上都包含了一定的位置信息,而各个位置字符的位置编码又各不相同,因此,是比较合适的函数;

参考:理解Transformer论文中的positional encoding,和三角函数有什么关系_阿里武的技术博客-CSDN博客

 十分钟理解Transformer - 知乎

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值