当前位置:   article > 正文

为什么Transformer会出现位置编码(Positional Encoding)?_transformer以及为啥用三角函数做位置编码

transformer以及为啥用三角函数做位置编码

  Transformer被提出首先应用在NLP领域,处理的数据对象为语言的序列数据,既然是序列数据,则序列的顺序对于语言的表达是至关重要的。在这之前,RNN已经被提出用于解决NLP中的机器翻译、文本生成等任务,且RNN是按照序列顺序逐个对句子中的单词进行处理,使得序列的顺序自然而然地保存在模型中。而Transformer的输入是将句子中的所有单词一次性输入到网络中进行学习,这使得序列的顺序信息丢失。因此我们需要通过其他途径将序列的顺序信息加入到模型中,Transformer提出了一种解决方案就是文章中的Positional Encoding。

  但是为什么Positional Encoding是文章中的那种形式呢?让我们从零开始考虑,如果我们希望给一个句子添加位置信息,首先想到的是PE = pos = 0,1,2,…,N-1这样的位置编码方式,但是很容易想到这样的编码方式存在很大问题,如果我们现在有一个很长的句子(5000个单词),那么最后一个单词的位置编码就变成了4999,这显然不合理,因为这么大的数字会取代单词自身的Embedding作为单词的主要特征,我们添加位置编码的初衷是使得句子包含位置信息,而不是让位置信息取代句子本身的信息;另外,最后面和最前面的位置编码(如4999和0)相差太大,使得模型会更加关注最后面的单词而忽略前面的单词。

  因此,我们为了解决上面的问题,很容易想到的一种解决方案是将上面的所有数值控制在0~1之间,因此通过下面的公式即可实现:
在这里插入图片描述
  这样所有的单词位置编码都限制在了0~1之间,但是这又会出现新的问题——不同长度的句子位置编码的步长是不一致的,比如我们有一个长度为11和长度为101个单词的句子,根据上面公式计算,长度为10个单词的句子位置编码为0,0.1,0.2,…,1,而长度为101个单词的句子位置编码为0,0.01,0.02,…,1,显而易见,他们的步长一个为0.1,一个为0.01,这使得同样的两个相邻单词在不同长度的文本中的位置编码存在差异,比如长度为11和长度为101的句子中都有‘I love China’,显然‘love’和‘China’在这两种长度的句子中位置编码信息存在很大差异,使得模型进行学习时误认为二者并不相同。

  因此,现在我们明确一下现在我们希望得到的位置编码是什么样的:a)位置编码需要体现一个单词在不同位置的差异;b)位置编码需要有顺序关系,且位置编码不依赖于序列长度;c)位置编码需要被体现在一定的区间内。
满足上面条件的可以是一个有界的周期函数,比如sin和cos,当然不一定非得是这两个函数,其他满足上面条件的有界周期函数也可以。于是我们能想到的是下面这样的一个周期函数位置编码:

在这里插入图片描述

  其中 a {a} a用来调节sin函数的波长,当 a {a} a比较小时,sin函数的周期很小,使得相邻的两个单词的位置编码之间相差较大,并且可能会在长文本中出现不同位置的单词位置编码相同(位于sin函数两个周期的同一y值位置),反之,当 a {a} a比较大时,相邻的单词之间的位置差异不明显。因此需要对进行一定的改进,因为NLP中的每一个单词都有一定的维度,比如每个单词的维度为dmodel,则可以对单词的每个维度进行位置编码,通过在不同的维度上使用不同周期的函数来控制某单词的位置编码使得每个单词的位置编码重复的概率大大降低,甚至我可以不只是用sin函数,可以使用cos函数或者二者并用,也就出现了Transformer论文中提到的位置编码函数:
在这里插入图片描述

  其中2i和2i+1表示每个单词的第偶数位和第奇数位个维度,比如i=0表示的是该单词第0维和第1维上的位置编码值,这里分母上还有个dmodel,应该是为了对单词的每个维度进行缩放,使得其值在0~1的范围内。分析到这里还是有些疑惑为什么sin和cos可以表示位置信息?下面我们考虑二进制编码的例子:

在这里插入图片描述

  如上图是一组数字(0~15)的二进制编码格式,每个数字由其相应的四位二进制数表示,我们逐位进行分析,首先看最后一列(图中红色)二进制数字,他的变化为0,1,0,1,…,0,1,则很容易看出其周期为2,同理,蓝色的变化为0,0,1,1,…,0,0,1,1,其周期为4,绿色为8,橙色为16,分析到这里大家应该明白了,二进制数的每一位的周期变化是不是类似不同周期的sin或者cos函数的周期变化?图中的四种颜色可以理解为是Transformer中每个单词的Embedding维度(上图中=4),而每一种颜色表示的是不同周期的函数(sin或者cos),则整个四位的二进制数表示的就是某个位置的位置编码,比如图中‘8’这个数字(可以看作NLP中一个单词)的位置编码为‘1000’,这样大家应该清楚为何sin和cos可以表示位置编码了,至于论文中为什么既使用sin又使用cos,这个只是丰富了位置编码的形式,可以只用sin或者cos,但可能作者都尝试过,但最终选择了二者的结合形式。

  参考知乎@TniL以及@月球上的人两位大佬的回答,根据自己理解重新梳理了一下https://www.zhihu.com/question/347678607/answer/864217252,https://zhuanlan.zhihu.com/p/338592312。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/656688
推荐阅读
相关标签
  

闽ICP备14008679号