当前位置:   article > 正文

对正弦位置编码的理解

正弦位置编码

为什么要写这篇文章

最近在学BERT模型,发现主要用到了Transformer这一架构。Transformer采用了多头自注意力机制,不能像之前RNN那样按顺序逐字逐句来解析句子,一定程度上并没有包含各个单词的位置信息,因此在Transformer中需要加入了位置编码来引入这一信息。

其中一种位置编码的思想是正弦位置编码(Attention is what you need里提出的),正弦位置编码是通过sin和cos函数来进行处理的,那么这是如何想到的呢?能不能根据这种想法再思考有没有更好的位置编码方式呢?基于以上的想法,我觉得有必要去理解这种位置编码的思想。

本文参考了以下资料:

  1. 《Attention is what you need》
  2. Transformer Architecture: The Positional Encoding
  3. 知乎上的一位答主TnilL的回答
  4. 苏剑林. (Feb. 03, 2021). 《让研究人员绞尽脑汁的Transformer位置编码 》

理想情况下位置编码的要求

理想情况下,位置编码应满足以下标准:

  1. 它应该为每个时间步长输出唯一的编码(单词在句子中的位置)
  2. 任意两个时间步长之间的距离在不同长度的句子中应该是一致的。 若为[0, 1] 范围内的每个时间步分配一个数字,其中 0 表示第一个单词,1 表示最后一个时间步。它将引入的问题之一是无法确定特定范围内存在多少个单词。换句话说,时间步长增量在不同的句子中没有一致的含义。
  3. 我们的模型应该毫不费力地推广到更长的句子。它的值应该是有界的。如果为每个时间步分配一个数字。也就是说,第一个词被赋予“1”,第二个词被赋予“2”,依此类推。这种方法的问题在于,不仅值会变得非常大,而且我们的模型可能面临比训练中更长的句子。此外,我们的模型可能看不到任何具有特定长度的样本,这会影响我们模型的泛化。
  4. 它必须是确定性的。

正弦位置编码的思想

(这部分主要参考资料3,这位答主解释得太好了,醍醐灌顶,感兴趣的直接去看原回答。)

从以上位置编码的第2、3点标准来看,我们既需要位置编码有界又需要两个时间步长之间的距离与句子长度无关。为了满足这两点标准,一种思路是使用有界的周期性函数,而简单的有界周期性函数很容易想到sin和cos函数。

简单的构造如下: P E ( p o s ) = s i n ( p o s α ) PE(pos)=sin(\frac{pos}{\alpha}) PE(pos)=sin(αpos),其中 α \alpha α是一个给定的数,主要用来调节相邻位置之间的差异, α \alpha α越大,差异越小。但是这样做有两个问题:1、若 α \alpha

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

闽ICP备14008679号