Bert模型是自然语言处理方面里程碑式的进步,其核心是transformer层, 而transformer采用自注意力编码器摒弃了循环网络,循环网络天生的顺序信息在自注意力编码器中没有了,而语言往往是顺序不同意思相差很大。所以transformer的作者设计了一种三角函数位置编码方式,为每个不同位置的token单独生成一个位置向量(或者位置嵌入,即position embedding,缩写为PE)。下面的公式是位置编码的公式,但是论文及网上其他文章对公式解释不是很清楚,所以我在此采用例子来帮助初学者理解。

式中pos为token在序列中的位置号码,它的取值是0到序列最大长度max_que_length-1之间的整数。比如“[cls] 我 爱 中 华 [sep]”是6个token组成的序列,[cls]的pos值为0,“我”的pos值为1,“爱”的pos为2,“中”为3,“华”为4,'[sep]'为5 。bert base最大长度max_que_length是512,pos取值还能一直到511。当然如果序列真实长度小于最大长度时,后面的位置号没有意义,最终会被mask掉。

dmodel是位置向量的维度,与整个模型的隐藏状态维度值相同,这解释了为什么起dmodel这个名字,这个维度在bert base模型里设置为768。

i 是从0到dmodel/2-1之间的整数值,即0,1,2,...383。

2i  是指向量维度中偶数维,即第0维,第2维,第4维,直到第766维。

2i+1 是维度中奇数维,即第1维,第3维,第5维,直到第767维。

PE是一个矩阵,行数是最大的序列长度max_que_length,列数是dmodel,即它的形状为[max_que_length,dmodel]

PE(pos,2i)是PE矩阵中第pos行,第2i列的数值,是个标量。这里是在第偶数列上的值,偶数列用正玄函数计算。

PE(pos,2i+1) 是PE矩阵中第pos行,第2i+1列的数值,是个标量。这里是在第奇数列上的值,奇数列用余玄函数计算。

仍然以序列“[cls] 我 爱 中 华 [sep]”为例,现在计算序列中"我"的位置向量,这个向量有768维,我考虑前面4维的值和最后2维做为例子,其他维度则省略:

"我"在序列中位置pos的值是1,当i=0时,2i表示第0维,2i+1表示第1维,dmodel=768,为简洁,此处小数点后只取2位

PE(1,0)= sin(1/(10000)^(0/768)) = sin(1/1) = sin(1) = 0.84

PE(1,1) = cos(1/(10000)^(0/768)) = cos(1/1)=cos(1) = 0.54

再看当i=1时的第2维和第3维

PE(1,2) = sin(1/(10000^(2/768))) = sin(1/(10000^(1/384)))=sin(1/1.02)=0.83

PE(1,3) = cos(1/(10000^(2/768))) = cos(1/1.02) = 0.56

再看最后两维的情况,这时i=383:

PE(1,766) = sin(1/(10000^(766/768))) = sin(1/9763.00) = 0.00

PE(1,767) = cos(1/(10000^(766/768))) = cos(1/9763.00) = 1.00

那token"我"的位置向量大概样子是

[0.84,0.54,。。。,0.00,1.00]

再看看当位置号pos不断增大时,某一维比如第0维的值是怎么变化的。因为三角函数是关于2倍圆周率Pi的周期函数,所以把数值转为Pi的倍数

P(1,0)=sin(1)=sin(0.31Pi)

P(2,0)=sin(2)=sin(0.64Pi)

P(3,0)=sin(3)=sin(0.96Pi)

P(6,0)=sin(6)=sin(1.91Pi)

P(7,0)=sin(7)=sin(2.23Pi)=sin(0.23Pi)

P(8,0)=sin(8)=sin(2.54Pi)=sin(0.54Pi)

由此可看出,由于三角函数是周期函数,随着位置号的增加,相同维度的值有周期性变化的特点。

transformer为什么设计这样的编码方式来生成位置向量呢? 因为三角函数有个性质

sin(a+b) = sin(a) * cos(b) + cos(a) * sin(b)

cos(a+b) = cos(a) * cos(b) - sin(a) * sin(b)

因此可以推导出,两个位置向量的点积是一个与他们两个位置差值(即相对位置)有关,而与绝对位置无关。这个性质使得在计算注意力权重的时候(两个向量做点积),使得相对位置对注意力发生影响,而绝对位置变化不会对注意力有任何影响,这更符合常理。

比如”我爱中华“这句话,”华“与”中“相对位置为1,华与中的相关性程度取决于相对位置值1。而如果这句话前面还有其他字符,那华和中两个字的绝对位置会变化,这个变化不会影响到中华这两个字的相关程度。

但是这里似乎有个缺陷,就是这个相对位置没有正负之分,比如"华"在"中"的后面,对于"中"字,"华"相对位置值应该是1,而"爱"在"中"的前面,相对位置仍然是1,这就没法区分到底是前面的还是后面的。

transformer的位置向量还有一种生成方式是可训练位置向量。即随机初始化一个向量,然后由模型自动训练出最可能的向量。transformer的作者指出这种可训练向量方式的效果与正玄余玄编码方式的效果差不多。在bert的代码中采用的是可训练向量方式。

5分钟理解transformer模型位置编码相关推荐

  1. Transformer课程:理解语言的 Transformer 模型-位置编码及掩码 (Masking)

    Transformer课程:理解语言的 Transformer 模型-位置编码及掩码 (Masking) 目录 位置编码(Positional encoding) 掩码 (Masking) 参考文献 ...

  2. 有关swin transformer相对位置编码的理解:

    有关swin transformer相对位置编码的理解: 假设window_size是7*7 那么窗口中共有49个patch,共有49*49个相对位置,每个相对位置有两个索引对应x和y两个方向,每个索 ...

  3. 十分钟理解Transformer

    本文转载于知乎文章:十分钟理解Transformer Transformer是一个利用注意力机制来提高模型训练速度的模型.关于注意力机制可以参看这篇文章,trasnformer可以说是完全基于自注意力 ...

  4. 【Transformer 相关理论深入理解】注意力机制、自注意力机制、多头注意力机制、位置编码

    目录 前言 一.注意力机制:Attention 二.自注意力机制:Self-Attention 三.多头注意力机制:Multi-Head Self-Attention 四.位置编码:Positiona ...

  5. 深入理解transformer中的位置编码

    文章目录 总览 问题1 问题2 问题3 问题4 问题5 问题6 总览 我们今天需要讲解transformer中的位置编码,这其实属于进阶内容.既然你会到这里,我默认你已经看过了transformer的 ...

  6. FLOATER:更加灵活的Transformer位置编码!

    NewBeeNLP公众号原创出品 公众号专栏作者 @Maple小七 北京邮电大学·模式识别与智能系统 来自 ICML2020 对Transformer位置编码的探索  论文:Learning to E ...

  7. Transformer架构:位置编码

    2017年,Google的Vaswani 等人提出了一种新颖的纯注意力序列到序列架构,闻名学术界与工业界的 Transformer 架构横空出世.它的可并行化训练能力和优越的性能使其成为自然语言处理领 ...

  8. transformer引入位置信息--Sinusoidal位置编码《个人学习笔记》

    transformer引入位置信息--Sinusoidal位置编码 为什么transformer需要位置编码 Sinusoidal绝对位置编码 首先,所有技术都是个人理解,并感谢技术各位分享,由此根据 ...

  9. 美团提出基于隐式条件位置编码的Transformer,性能优于ViT和DeiT

    视学算法发布 机器之心编辑部 Transformer 跨界计算机视觉的热潮之下,有一个问题需要解决:如何像 CNN 一样直接处理不同尺寸的输入?对此,美团提出了一种新型隐式条件位置编码方法,基于该方法 ...

最新文章

  1. python中while嵌套循环_python中的while循环
  2. 008_Gson从序列化中排除字段
  3. Python对象注意点
  4. 图片预加载的问题-----有针对加载和缓存的兼容解决
  5. Java中List接口重要实现类一ArrayList
  6. 文献记录(part73)--基于 PCA 的信息压缩 : 从一阶到高阶
  7. 史上最全Redis面试题
  8. androidstudio带pom的上传到jcenter_输送机@网带输送机@304网带输送机@304不锈钢网带输送机@输送机网带厂家定制...
  9. My new iMac 27
  10. LeetCode 1671. 得到山形数组的最少删除次数(最长上升子序DP nlogn)
  11. java swing 注册事件_比较Java Swing中三种注册事件的方法
  12. java strlen,跟妹妹聊到 Java 16 新特征,真香!
  13. LinkButton回发报错__doPostBack('……','') 缺少对象
  14. mtk刷机显示连接服务器失败,MTK刷机常见错误分析 报错代码解释3
  15. java生成word文档 图片_java根据模板生成word文档,兼容富文本、图片
  16. 利用云片网提供的API发送短信
  17. 相机光学(五)——对运动物体的曝光时间的计算
  18. Mac_IOS_报:The Xcode build system has crashed. Please close and reopen your workspace.
  19. 运放电压和电流负反馈的讨论
  20. 目前机器翻译,发展到哪个阶段了?

热门文章

  1. 深度学习刷新SOTA的tricks大盘点
  2. 智慧能耗在线监测系统
  3. Android 悬浮窗,绝对是目前相关悬浮窗开源库最完美的适配方案
  4. 20幅精美绝伦的光涂鸦摄影作品欣赏
  5. 1. 第一讲 primitives(基础知识)
  6. NGUI战斗飘字及界面优化
  7. android studio今日头条,AndroidStudio——今日头条(可以实时获取数据的app)
  8. 如何做激光雷达点云检校?
  9. Intellij IDEA 不愧是最智能 IDE,轻松解决了 Java 8 数据流问题
  10. 消灭误区:男人护肤保养的五宗罪