Transformer的位置编码

news/2024/11/19 11:40:17/

1. 什么是位置编码,为什么要使用位置编码

简单来说位置编码就是给一个句子中的每个token一个位置信息,通过位置编码可以明确token的前后顺序关系。

对任何语言来说,句子中词汇的顺序和位置都是非常重要的。它们定义了语法,从而定义了句子的实际语义。RNN结构本身就涵盖了单词的顺序,RNN按顺序逐字分析句子,这就直接在处理的时候整合了文本的顺序信息。

但Transformer架构抛弃了循环机制,仅采用多头自注意机制。避免了RNN较大的时间成本。并且从理论上讲,它可以捕捉句子中较长的依赖关系。

由于句子中的单词同时流经Transformer的编码器、解码器堆栈,模型本身对每个单词没有任何位置信息的。因此,仍然需要一种方法将单词的顺序整合到模型中。

想给模型一些位置信息,一个方案是在每个单词中添加一条关于其在句子中位置的信息。我们称之为“信息片段”,即位置编码。

2. 两种简单的位置编码

最容易想到两种位置编码:
(1)为每个时间步添加一个0-1范围内的数字,其中0表示第一个单词,1表示最后一个单词。

我喜欢吃洋葱 【0 0.16 0.32.....1】我真的不喜欢吃洋葱【0 0.125 0.25.....1】

问题:我们可以看到,如果句子长度不同,那么位置编码是不一样,所以无法表示句子之间有什么相似性。

(2)1-n正整数范围分配

我喜欢吃洋葱 【1,2,3,4,5,6】我真的不喜欢吃洋葱【1,2,3,4,5,6,7】

问题:往往句子越长,后面的值越大,数字越大说明这个位置占的权重也越大,这样的方式无法凸显每个位置的真实的权重。

3. Transformer的位置编码

可以看到上面两种简单的位置编码方式都有明显的不足,理想情况下,应满足以下标准:

  • 每个时间步都有唯一的编码。
  • 在不同长度的句子中,两个时间步之间的距离应该一致。
  • 模型不受句子长短的影响,并且编码范围是有界的。(不会随着句子加长数字就无限增大)
  • 必须是确定性的。

Transformer的作者设计了一种可以满足上面要求的三角函数位置编码方式。首先为每个不同位置的单词(token)单独生成一个位置向量(或者叫位置嵌入,即position embedding,缩写为PE);其次,这种编码并没有集成到模型本身中,该向量用于为每个单词提供有关其在句子中位置的信息,也就是说,其修改了模型的输入,添加了单词的顺序信息。

位置编码方式如下:

在这里插入图片描述

  • 其中 d ≡ 2 0 d \equiv_2 0 d20表示 d d d 被2整除之后余数为0
  • i i i 表示给某个token计算position embedding时是在embedding的第i位,从0开始
  • 因为 s i n ( w k ⋅ t ) sin(w_k\cdot t) sin(wkt) c o s ( w k ⋅ t ) cos(w_k\cdot t) cos(wkt) 是一组,所以 k k k i i i 的二分之一

在这里插入图片描述
在这里插入图片描述
上图中长方形的宽度即为 d d d

4. 为什么要使用三角函数进行位置编码

  • 可以使得不同位置的编码向量之间有一定的规律性,比如相邻位置之间的差异较小,而距离较远的位置之间的差异较大。

    这是由正弦和余弦函数的连续性和单调性保证的,即对于任意两个相邻的位置,它们对应的编码向量在每一个维度上都只有微小的变化,而对于任意两个距离较远的位置,它们对应的编码向量在每一个维度上都有较大的差异。

  • 可以使得编码向量在任意维度上都能保持唯一性,即不同位置在同一个维度上不会有相同的值。

    这是由正弦和余弦函数的周期性和相位差保证的,即对于任意两个不同的位置,它们对应的编码向量在每一个维度上都不相等。

在这里插入图片描述
在这里插入图片描述

我们假设max_len为50, d d d 取128,所以 w w w 的取值范围就是0.0001~1, t t t 的范围是0~49,所以三角函数自变量的取值范围是0~49,结果的取值范围为-1~1。则在 t t t 为0时,对应的位置编码为[0, 1, 0, 1, 0, 1, ···, 0, 1],这一点可以从下图的第一行看出来是0,1交替的。

相邻token位置编码每一位的 w w w 相同只有 t t t 相差1,由于三角函数的连续性,所以相邻token的位置编码值只有比很小的差别。

在这里插入图片描述
从上面效果图可以看出,这个三角函数式位置编码满足以下四个特点:

  • 语句中每个词的位置编码是唯一的;
  • 不同长度的句子中任意相邻两个词的间隔距离是一致的;
  • 模型可以很容易处理更长的语句,并且值有界;
  • 位置编码是确定性的。

参考:
Transformer 结构详解:位置编码 | Transformer Architecture: The Positional Encoding
理解Transformer的位置编码
什么?是Transformer位置编码


http://www.ppmy.cn/news/63522.html

相关文章

web集群,部署jpress应用

1.静态网页与动态网页的区别 静态网页: (1)请求响应信息,发送给客户端进行处理,由浏览器进行解析,显示页面称为静态页面。在网站设计中,纯粹html格式的网页(包含图片,视…

第5章 分布式缓存中间件的配置及其调用定义

1 分布式缓存中间件的配置定义 1.1 Core.Configuration.CacheConfig namespace Core.Configuration { /// <summary> /// 【缓存配置--类】 /// <remarks> /// 摘要&#xff1a; /// 通过该类中的属性成员实例对“appsettings.json”文件中的1个指定缓存项(…

非科班自学一年拿大厂offer,关于大学,说几个感受

大家好&#xff0c;我是帅地。 最近知识星球的小伙伴经常有人来报喜秋招上岸的信息&#xff0c;其中有一位星球的小伙伴是帅地的亲学弟&#xff0c;并且非科班&#xff0c;但是只花了一年时间&#xff0c;在 0 实习的情况下&#xff0c;依然拿到了某大厂 offer&#xff08;学弟…

SuperMap GIS基础产品组件GIS FAQ集锦(2)

SuperMap GIS基础产品组件GIS FAQ集锦&#xff08;2&#xff09; 【iObjects for Spark】读取GDB参数该如何填写&#xff1f; 【解决办法】可参考以下示例&#xff1a; val GDB_params new util.HashMapString, java.io.Serializable GDB_params.put(FeatureRDDProviderParam…

操作系统:内存满了怎么办

目录 内存分配的过程是怎样的&#xff1f;哪些内存可以被回收&#xff1f;回收内存带来的性能影响调整文件页和匿名页的回收倾向尽早触发 kswapd 内核线程异步回收内存NUMA 架构下的内存回收策略 如何保护一个进程不被 OOM 杀掉&#xff1f;参考资料 内存分配的过程是怎样的&am…

加拿大访问学者签证材料清单

加拿大在教育、政府透明度、社会自由度以及生活品质等方面在国际上排名名列前茅&#xff0c;出于环境、社会氛围等因素&#xff0c;不少学者将目光聚焦于这个北美的发达国家。加拿大的访问学者签证属于工作签证&#xff0c;过去只要有邀请函就可以办理&#xff0c;但是自去年2月…

C#Winform如何实现分屏显示操作SOP

分屏显示操作SOP 客户需求 客户现场产线较长,不同工位的相机之间间隔较远,需要添加显示器分别显示各自工位的拍照处理信息,且为了节省成本只能用一个工控机,采用多屏显示的方法满足客户需求。 硬件 1.工控机有2个以上VGA接口(视客户需要分屏的数量决定); 2.分屏显卡(工…

【Python】序列类型③-集合

文章目录 1.集合(set)简介2.集合的定义3.集合的遍历4.集合的常用方法 1.集合(set)简介 集合是一种无序可变的容器对象 集合最大的特点:同一个集合内元素是不允许有重复的,因此集合自带"去重"效果 2.集合的定义 集合的定义有两种方式: 使用{}进行定义,这种方式不能定…