positional encoding位置编码详解:绝对位置与相对位置编码对比
目录
前言
Why
What
绝对位置编码
相对位置编码
Sinusoidal Position Encoding
Complex embedding
How
前言
相信熟悉BERT的小伙伴对positional encoding(位置表示) 肯定都不会陌生~ 虽然positional encoding只是BERT中比较小的一个组成部分,但是实际上却暗藏玄机。所以,今天呢我们就把positional encoding单独拎出来对其进行一个全面的剖析~~
Why?为什么需要positional encoding
What?两种positional encoding方式:绝对位置编码与相对位置编码
How?不同方法优缺点对比
Why
众所周知,文本是时序型数据,词与词之间的顺序关系往往影响整个句子的含义。举个栗子:
小夕/是/一个/萌/妹子。一个/妹子/是/萌/小夕??萌/小夕/是/一个/妹子??
为了避免不必要的误会,所以我们在对文本数据进行建模的时候需要考虑词与词之间的顺序关系。
可是,要建模文本中的顺序关系必须要用positional encoding吗?
答案是No!
只有当我们使用对位置不敏感(position-insensitive)的模型对文本数据建模的时候,才需要额外使用positional encoding。
什么是对位置敏感的模型??什么又是对位置不敏感的模型??
如果模型的输出会随着输入文本数据顺序的变化而变化,那么这个模型就是关于位置敏感的,反之则是位置不敏感的。
用更清晰的数学语言来解释。设模型为函数,其中输入为一个词序列,输出结果为向量。对的任意置换,都有
则模型是关于位置不敏感的。
在我们常用的文本模型中,RNN和textCNN都是关于位置敏感的,使用它们对文本数据建模时,模型结构天然考虑了文本中词与词之间的顺序关系。而以attention为核心的transformer则是位置不敏感的,使用这一类位置不敏感的模型的时候需要额外加入positional encoding引入文本中词与词的顺序关系。
What
对于transformer模型的positional encoding有两种主流方式:
绝对位置编码
现在普遍使用的一种方法Learned Positional Embedding编码绝对位置,相对简单也很容易理解。直接对不同的位置随机初始化一个postion embedding,加到word embedding上输入模型,作为参数进行训练。
相对位置编码
使用绝对位置编码,不同位置对应的positional embedding固然不同,但是位置1和位置2的距离比位置3和位置10的距离更近,位置1和位置2与位置3和位置4都只相差1,这些关于位置的相对含义模型能够通过绝对位置编码get到吗?使用Learned Positional Embedding编码,位置之间没有约束关系,我们只能期待它隐式地学到,是否有更合理的方法能够显示的让模型理解位置的相对关系呢?
所以就有了另一种更直观地方法——相对位置编码。下面介绍两种编码相对位置的方法:Sinusoidal Position Encoding和Complex embedding。
Sinusoidal Position Encoding
使用正余弦函数表示绝对位置,通过两者乘积得到相对位置:
这样设计的好处是位置的psotional encoding可以被位置线性表示,反应其相对位置关系。
Sinusoidal Position Encoding虽然看起来很复杂,但是证明可以被线性表示,只需要用到高中的正弦余弦公式:(注意:长公式可以左右滑动噢!)
对于位置的positional encoding
其中
将公式(5)(6)稍作调整,就有
注意啦,和相对距离是常数,所以有
其中为常数。
所以可以被线性表示。
计算和的内积,有
其中.
和的内积会随着相对位置的递增而减小,从而表征位置的相对距离。但是不难发现,由于距离的对称性,Sinusoidal Position Encoding虽然能够反映相对位置的距离关系,但是无法区分方向/(ㄒoㄒ)/~~
更加直观的对其可视化[1],可以看到图像关于对称,无法区分前后关系。
Complex embedding
为了更好的让模型捕获更精确的相对位置关系,比如相邻,前序(precedence)等,ICLR 2020发表的文章《Encoding Word Oder In Complex Embeddings》使用了复数域的连续函数来编码词在不同位置的表示。
不管是Learned Postional Embdedding还是Sinusoidal Position Encoding,某个词在位置上的表示为其word embedding加上对应位置的embedding,即:
同word embedding 都是从整数域到实数域的一个映射。
对于word embedding来说,这样的设计是合理的。因为不同词的index是独立的,仅和我们具体使用的词典怎么排序有关系,某个词是否在另外一个词前面或者相邻没有任何的信息。但是位置的index并不是满足独立的假设,其顺序关系对文本的正确理解有非常重要的影响。
所以,为了解决pos index的依赖问题(position-insensitive problem),文章使用了关于位置的连续函数来表征词在的表示,即:
把公式(13)展开有
其中是关于位置在复数域上的函数。
为了让上述函数更好的表征位置的相对信息,要求函数满足以下两个性质:
Position-free offset transformation
存在一个函数 使得
其中在不影响理解的情况下,我们把简写成。也就是说,词在pos或者pos+k的表示可以由只和相对位置k有关的一个变换得到,而与具体这个词无关。
Boundedness
要求函数有界。非常合理的一个限制。
最后,论文证明了在复数域上满足这个两个条件的函数一定为下面这样的形式:
将其改写成指数的形式,则为
其中,为振幅,为角频率,为初相,都是需要学习的参数~~
将式(17)代入(14)有
要表征词在pos上的embedding,需要学习的参数有, 以及。以此类推,要表示词表中所有的词,那么需要学习的参数量为????.由于参数量较大,论文后续还提出了一些减小参数量的方法,有兴趣的同学可以看具体查阅原文哦~~~
How
以上三种positional encoding都不同程度、各有侧重的编码了文本数据中的顺序关系,那么到底哪个更好?我们在平时使用的时候应该如何选择呢?
结果导向的话,肯定是哪种方法效果好选哪种啦~~在《Attention is all you need》[2]里面提到,Learned Positional Embedding和Sinusoidal Position Encoding两种方式的效果没有明显的差别。在论文[3],实验结果表明使用Complex embedding相较前两种方法有较明显的提升。(不过介于这个方法还比较新,大家可以多多尝试对比)。
从方法的可理解性上,相比相对位置编码的两种方法,Learned Positional Embedding更加的简单直接,易于理解。从参数维度上,使用Sinusoidal Position Encoding不会引入额外参数,Learned Positional Embedding增加的参数量会随线性增长,而Complex Embedding在不做优化的情况下,会增加三倍word embedding的参数量。在可扩展性上,Learned Positional Embedding可扩展性较差,只能表征在以内的位置,而另外两种方法没有这样的限制,可扩展性更强。
讲了这么多,相信大家对positional encoding已经有了充分的理解~~至于到底应该如何选择,还是需要基于大家对方法的理解实际问题实际分析哦????
参考文献
[1] 可视化: https://kazemnejad.com/blog/transformer_architecture_positional_encoding/#what-is-positional-encoding-and-why-do-we-need-it-in-the-first-place[2] Attention is all you need: https://arxiv.org/pdf/1706.03762.pdf
[3] Complex Embeddings: https://openreview.net/pdf?id=Hke-WTVtwr
positional encoding位置编码详解:绝对位置与相对位置编码对比相关推荐
- 世界树服务器bug位置,四叶草剧场世界树bug怎么获得 世界树bug神器获取位置图文详解...
核心提示:四叶草剧场世界树bug怎么获得?在四叶草剧场的游戏中,世界树的爬塔挑战是最近玩家们正在参与的,不少玩家不知道BUG神器在哪一层怎么获得,接下来小编就为大家详细的介绍一下四叶草剧场世界树bug ...
- cadence电阻在哪个库_Orcad 不知道元件调哪个库?元件库的查找位置对照表详解...
原标题:Orcad 不知道元件调哪个库?元件库的查找位置对照表详解 一.默认库路径 C:\Cadence\SPB_16.6\tools\capture\library里,我这盘符C你们根据实际安装盘符 ...
- 修改conda缓存路径:详解如何将Anaconda缓存位置更改
修改conda缓存路径:详解如何将Anaconda缓存位置更改 在使用Anaconda进行Python开发时,我们经常需要使用conda来管理第三方库和环境.但是,使用默认缓存路径时,conda会将下 ...
- Python2.7字符编码详解
Python2.7字符编码详解 目录 Python2.7字符编码详解 声明 一. 字符编码基础 1.1 抽象字符清单(ACR) 1.2 已编码字符集(CCS) 1.3 字符编码格式(CEF) 1.3. ...
- 转1:Python字符编码详解
Python27字符编码详解 声明 一 字符编码基础 1 抽象字符清单ACR 2 已编码字符集CCS 3 字符编码格式CEF 31 ASCII初创 311 ASCII 312 EASCII 32 MB ...
- unicode编码详解_转载
unicode编码详解,一看就懂 转载--https://www.cnblogs.com/hahlzj/p/11908713.html 一.Unicode编码 1 UTF-8 -16 -32编码和U ...
- python怎么读写文件-手机上怎么写pythonPython文件读写详解及设置文件的字符编码...
文件读写操作在各种编程语言中都是比较重要的部分,也是很常用的部分,今天就来详细说一下python对文件的读写操作,以及需要注意的点. 一. python打开文件 代码如下:f = open(" ...
- 可能是最详细的字符编码详解
Created By JishuBao on 2019-04-02 12:38:22 Recently revised in 2019-04-03 12:38:22 欢迎大家来到技术宝的掘金世界, ...
- 字符编码详解及利用C++ STL string遍历中文字符串
作者:非妃是公主 专栏:<笔记><C++> 博客地址:https://blog.csdn.net/myf_666 个性签:顺境不惰,逆境不馁,以心制境,万事可成.--曾国藩 文 ...
- 嵌入式汉字显示原理及GBK编码详解
嵌入式汉字显示原理及GBK编码详解 ~~~~~~~~ 关于各个编码的介绍和转换可以看我的另一篇博客:[C语言实现]十六进制面值转字符串.字符面值转十六进制.UNICODE与GBK互转,U ...
最新文章
- 嵌套的JSON数据与AVRO文件的相互转换
- Integer.highestOneBit(int i)方法的作用与底层实现
- 一个android应用开发的感悟
- 图形化升级单机oracle 11.2.0.1 到 11.2.0.4
- 模拟实现和深入理解Node Stream内部机制
- 项目开发中遇到的问题,原因,解决思路
- [转]如何配置和使用Tomcat访问日志
- python怎么批量下载图片_python批量下载图片的三种方法
- 【C语言中的EOF】零基础看懂EOF如何使用while(scanf(“%d %d”,a,b)感叹号=EOF)
- 爬虫项目实操四、用Scrapy爬取招聘网站的招聘信息
- jsp登录并实现邮箱激活功能
- CSS/HTML制作电影网站中的电影卡片
- AutoJs超神级代码分享大更新
- 多多自走棋改动_多多自走棋:官方更新久久未到,新版本内容或将引起巨大改变...
- 批量html转word 或者 pdf
- iconfont的使用,阿里矢量图库的引用,配置,改变图标大小和图标颜色
- 横河川仪压力变送器故障代码_压力变送器常见故障及分析
- 齐岳:FITC/Rhodamine/Cy7荧光标记半乳糖Galactose/松醇D-Pinitol/甘露糖Mannos
- 两类边界条件的OBVP求解方法
- 【简】题解 吉首大学第十一届“新星杯”大学生程序设计大赛