相对位置编码之RPR式:《Self-Attention with Relative Position Representations》论文笔记

news2024/11/24 23:10:00

😄 额,本想学学XLNet的,然后XLNet又是以transformer-XL为主要结构,然后transformer-XL做了两个改进:一个是结构上做了segment-level的循环机制,一个是在attention机制里引入了相对位置编码信息来避免不同segment的同一位置采用相同的绝对位置编码的不合理。但无奈看到相对位置编码这里我懵住了,只好乖乖追溯回去原始论文来学习学习嘿嘿🐶。

🦄 本文将以公式原理+举例的方式让你秒懂,放心食用。

🚀 RPR这论文就5页,方法部分就2页,看完结合网上理解下就ok了。
🚀 论文链接:https://arxiv.org/pdf/1803.02155.pdf

👀 三位谷歌大佬的作品:

🚀 导航

ID内容
NO.11、简单背景介绍+提出动机
NO.22、何为相对位置编码 (原理+例子讲解)?
NO.33、RPR实现细节

简单背景介绍+提出动机

回顾一下RNN, LSTM类型的序列网络,对于以下输入,love 的输出是相同的。由于这类序列网络对于每个token的编码都是基于前向或后向的序列信息进行整合得到,所以并不需要显示引入位置编码信息即可学到序列的先后关系。

“I love you, do you love me?”

回顾一下原生transformer,假若我们在embedding层不加上绝对位置编码embedding,那在self-attention层会对 love 这两个位置的编码输出一样的表示,这显然是不合理的,因为他们有不同的上下文,语义肯定有所区别。

But 加上绝对位置编码就OK了吗?绝对位置编码也存在局限性:没有外推性,即如果预训练最大长度为512的话,那么最多就只能处理长度为512的句子,再长就处理不了了。当然,也可以将超过512的位置向量随机初始化,然后继续微调。

所以由于存在这个局限,相对位置编码被提出,它不存在绝对位置编码这种缺点。



何为相对位置编码 (原理+例子讲解)?

相对位置编码,顾名思义咯,一个位置相对另一个个位置的表示。它是用一组可训练的embedding向量来表示的。自己回顾下transformer的self-attention里 (如下式),在计算某个token的q与其他所有token的k进行注意力点积计算时,其时相当于以q对应的这个token为中心token,k对应的token为q的周围token。所以每个词都会有机会作为中心词计算。
在这里插入图片描述
self-att的输入、输出是同维度的,那么输出的每一维的计算方式如下 :
在这里插入图片描述
其中,注意力权重的计算方式如下,也就是将qk点积结果过softmax:
在这里插入图片描述
其中,点积的计算方式如下:
在这里插入图片描述

所以相对位置编码这时可以登场了,即中心token与周围token是有相对位置的,相对位置编码即可用来作为这种相对位置的表示。举个例子,如我们一个句子长度为4,那就一共有7个相对位置编码embedding要学习,如下:

Index描述
0dist between token at position i and i-3
1dist between token at position i and i-2
2dist between token at position i and i-1
3dist between token at position i and i
4dist between token at position i and i+1
5dist between token at position i and i+2
6dist between token at position i and i+3

如何使用RPR呢?比如以第一个love为中心token时 (记为 love_1),那很周围token做self-att时,love_1 with love_1用到的上表中的index=3对应的RPR,而I在love_1的左边第一个,所以用到的上表中的index=2对应的RPR,以此内推,即可拿到这次self-att对应的RPR的索引,用了这个索引就可以像embedding层那样,去lookup table里取对应的向量。

“I love you, do you love me?”

  • ⭐提一下:【lookup table是所有单元,以token为例,就是整个词典所有token的embedding构成的矩阵。为什么叫lookup table,哪来的look up?因为实际模型运行的时候,不是把所有token变成embedding存在文件里,然后模型读取文件,而是把词变成one hot向量,one hot向量和embedding矩阵相乘得到对应词的embedding,这个过程等价于根据词在词典中的下标(one hot里1的下标)在embedding矩阵(V行E列)里查出对应行得到embedding向量,这个过程即look up。】

具体用公式表示相对位置编码的改进:

  • 和原生transformer相比,就是多了红框这个东西,它是一个向量,so easy,别以为公式多我就看不懂了😄,其实就是中心token_i 和周围token_j 的相对位置编码向量 (用于计算zi 时引入)。也就是在每个v值 (输入x乘WV 得到v值) 计算出来后加上相对位置编码向量,再乘上注意力权重做聚合,得到输出向量的第 i 维的值。
    在这里插入图片描述

  • 和原生transformer相比,就是多了红框这个东西,它是一个向量,so easy,别以为公式多我就看不懂了😄,其实就是中心token_i 和周围token_j 的相对位置编码向量 (用于计算eij)。也就是在每个k值 (输入x乘WK 得到k值) 计算出来后加上相对位置编码向量,再乘上q值(输入x乘WQ 得到k值),再缩放,即得到点积缩放结果。
    在这里插入图片描述

  • 所以看完之后你肯定又会疑惑了,md,在公式 (3), (4)中 咋有两种相对位置编码即aijV 和 aijK ?是共享的还是分开的? 其实是分开的,看论文原话就知道:
    在这里插入图片描述

  • 所以 ,在self-att里的两个地方都引入了相对位置编码向量。

最大相对位置距离k的设置

论文对中心token和周围token的相对位置距离设了最大距离k来裁剪即clip,因为这样设定有个好处就是能够使模型泛化到训练时没遇到的序列长度,那确实直观理解起来就挺work。所以作者认为超出范围的位置还采用精准的位置编码大可不必。

作者在某个生成任务的数据集测试了不同k有无影响,发现 k≥2 时,性能没啥变化了,阿这。。。作者说未来需要在别的数据集进一步验证。我猜的话这个k的设定应该是个数据集的序列长度与数据类型相关。且有点类似n-gram那种味道。
在这里插入图片描述
clip一波后,公式表示如下:
在这里插入图片描述
来个例子直观理解下吧,别陷入沉思了👀:
如果中心token的索引为k,那么会有2k+1个相对位置编码向量需要学习,其中k个是其左边的,k个是其右边的,还有一个属于自己。如果长度超过2k+1,那么其右边超过k的索引全部置为k,左边超过k的索引全部置为0。下面是个长度为10的句子的例子,其中k=3,那么它到相对位置编码表中拿RPR向量的索引为:
在这里插入图片描述
? 你是不是又陷入沉思了?👀 解释下,token长度为10的句子,那这里每一行相当于每个token作为中心词时,token们的RPR向量的索引,有了所以就可以去RPR的lookup table取对应的RPR。如上述10x10矩阵的第一行,回到刚刚的表,因为第一个token作为中心token,即index=3,有因为ckip一波k=3,那周围token只有右边的即index=4, index=5, index=6。其他周围token超过了k=3,那就全设置为6, 6, 6。。。

Index描述
0dist between token at position i and i-3
1dist between token at position i and i-2
2dist between token at position i and i-1
3dist between token at position i and i
4dist between token at position i and i+1
5dist between token at position i and i+2
6dist between token at position i and i+3


RPR实现细节

🚀 这里说两点论文提到实现的细节

1、因为是多头注意力,所以同一层各个注意力头共享相对位置编码embedding。

2、并行加速细节,如何实现?

主要在于注意力计算中的缩放点积计算如何通过矩阵并行计算,在原生的transformer中,计算方式如下,dz即输出token的向量的维度:
在这里插入图片描述
在这里插入图片描述
上面只是单个中心 token_i 计算的缩放点积结果,换成矩阵并行的话,因为是批处理b,多头注意力h,所以相当于 bh 个seq_len x dz 和dz x seq_len个矩阵并行乘法。输出shape为:(b, h, seq_len, seq_len)。

而对于RPR的缩放点积表示:
在这里插入图片描述
这咋整?拆项得到如下表示,其实加号左边就跟原生transformer的一模一样,组织一下成矩阵,就可直接并行矩阵相乘了。右边的话因为aijK是lookup table中的一行向量,当加号左边组织成矩阵形式后 (),如果要将加号两边相加,那维度要相同才行。所以加号右边也要组织成矩阵形式。

  • RPR lookup table的shape为(seq_len, seq_len, da),transpose一下维度得到 (seq_len, da, seq_len),其中RPR lookup table我们用A来表示,reshape后表示AT
  • X矩阵乘WQ 得到的矩阵shape为(b, h, seq_len, dz) , transpose一下得(seq_len, b, h, dz) ,再reshape得 (seq_len, b*h, dz);和AT 矩阵相乘得(论文里顶了da=dz): (seq_len, b*h, seq_len)。reshape一波得:(seq_len, b, h, dz)。transpose一下得(b, h, seq_len, seq_len)。
  • 然后就和加号左边的维度对应上了,就可以矩阵相加了,就可以并行了!!!成功了兄弟们!!!ヾ(◍°∇°◍)ノ゙
    在这里插入图片描述


看完了大家应该都懂的差不多了,如果有问题评论区留言,我有空会回复!⭐

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/48784.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AutoCAD Electrical 2022—源箭头和目标箭头

在一张图纸上插入源 箭头; 选中一根导线; 如果源和目标在同一张图纸上,则可以点击确定,插入目标箭头; 如果不在同一张图纸上,则点击否,后面在插入目标箭头; 在另一张图纸上插入目标…

学习笔记:引用

概念 引用的作用是给一个变量起别名 格式: type & 别名 原名 引用必须初始化,在初始化后不能改变 int &b;ba;错误 int& b a; bc;不是将b从a的别名变为c的别名 而是将c的值赋给a int a 10; int& b a; b 20;//用别名改数据&…

Apifox:详细使用教程,带你轻松拿捏

目录 Apifox简介 Apifox的安装与使用 Apifox新建项目的流程 编写接口文档 Apifox简介 我们在日常编程开发过程中经常实行的是前后端分离架构的模式,一个项目的落地会通过产品、开发、测试三方会审,对项目需求评审过后,前后端开发会制定一…

基于SpringBoot医院信息管理系统源码

hisystem 1. 用idea打开项目,并且配置maven下载依赖 2. 导入数据库 hisystem.sql 3. 修改application.yml数据库相关配置 4. 用户注册,验证邮件的邮箱考虑到安全问题,暂不提供授权码,如有需求可使用自己邮箱,开启POP3…

Vue3 - 路由 Vue-router 4.X(配置与使用教程)

目录前言安装配置准备工作配置路由基本使用路由传参 1路由传参 2路由传参 3SEO前言 在咱们 Vue2 时代,官方推荐咱们使用 vue-router 3.X 的库,如果是用脚手架创建的话,就直接默认集成到里面了。 Vue3 使用的是 vue-router 4.X 官方库&#xf…

[附源码]计算机毕业设计JAVA小超市进销存管理系统

[附源码]计算机毕业设计JAVA小超市进销存管理系统 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM my…

m扩频通信系统在瑞利信道中的误码率性能matlab仿真

目录 1.算法描述 2.matlab算法仿真效果 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 本课题,我们主要涉及到两个理论要点,第一个是瑞利衰落条件,第二个是扩频通信。下面分别对这两个理论进行介绍: 第一个是瑞利衰落条件&#x…

我们又重写了一个关键服务

#01 QueryCoord 组件介绍 QueryCoord 是 Milvus 中查询集群的中心调度节点,在用户将一个 Collection Load 到内存中时,QueryCoord 负责将该 Collection 的 Segment 调度到 QueryNode 集群中,以支持后续的查询。 QueryCoord 最核心的操作有4…

将egg项目部署至服务器

文章目录1.下载linux版本的node-v162.将node安装包从自己电脑上上传到自己的服务器3.在服务器中解压压缩包4.配置环境变量5.使文件生效6.将egg项目传到服务器指定目录下7.下载依赖8.npm start 运行不会占用终端 并且一直在运行 可以使用npm stop停用9.最后使用云服务器ip:端口号…

Linux22 --- 网络为什么要分层、使用tcp协议实现两个进程间通信的功能、IP地址转换函数

一、网络为什么要分层 1 1、分层的优点 1)各层之间是独立的。某一层并不需要知道它的下一层是如何实现的,而仅仅需要知道该层通过层间的接口(即界面)所提供的服务。由于每一层只实现一种相对独立的功能,因而可将一个…

Linux-Hadoop集群配置

文章目录一、配置Hadoop集群1、在master虚拟机上配置hadoop(1)编辑Hadoop环境配置文件 - hadoop-env.sh(2)编辑Hadoop核心配置文件 - core-site.xml(3)编辑HDFS配置文件 - hdfs-site.xml(4&…

1542_AURIX_TC275_CPU子系统_内核

全部学习汇总: GreyZhang/g_TC275: happy hacking for TC275! (github.com) 我因为看了这个章节的开篇有些疑惑去看了内核手册,现在学习的进程终于又重新回归,回到了TC275这个MCU的学习上。 这里的几条笔记记录是隔了很久写的,前面…

【Java面试】HashMap死循环问题

问题 最近几道面试题被问了是否了解并发情况下JDK7中HashMap发生死循环,导致CPU占用100%的问题。 由于HashMap并非是线程安全的,所以在高并发的情况下必然会出现问题,这是一个普遍的问题。 如果是在单线程下使用HashMap,自然是没…

[MAUI] 开篇-初识MAUI

前言 在2020年5月, 微软宣布了MAUI跨平台框架, MAUI 是Xamarin.Forms演变而来, 这也就意味着, 如果你原来具备Xamarin.Forms开发经验, 你可以流畅的过渡到MAUI开发当中。 原本于2021年底发布的MAUI正式版被推迟到了2022年5月底发布。现在, 你目前可以通过安装VS2022 预览版进行…

Elasticsearch倒排索引

什么是正排索引? 如下图,有一张商品表(tb_goods): 对于mysql数据库来说,肯定会给“id”创建主键索引,然后根据“id”来查询对应的商品信息,而这种情况就被称为“正排索引” 现在有…

eMagin:当月产百万片时,4K MicroOLED成本将不是问题

在今年2022 SID显示周期间,Micro OLED微显示模组厂商eMagin曾展示一款专为超短焦VR头显开发的4K Micro OLED微显示屏,有趣的是,该显示屏连接的主板上印有STEAMBOAT字样,让人不禁怀疑它与Valve之间是否存在某种联系。甚至有猜测认为…

【Linux】8.0 多线程

文章目录1.0 Linux线程概念1.1 Linux线程基本概念1.2 Linux线程优劣介绍2.0 Linux线程控制2.1 pthread_create(创建线程)2.2 pthread_join(线程等待)2.3 pthread_exit(线程终止)2.4 pthread_detach(线程分离)3.0 线程id和LWP的关系4.0 Linux线程互斥4.1 线程互斥相关概念4.2 线…

JUC系列(五) 读写锁与阻塞队列

📣 📣 📣 📢📢📢 ☀️☀️你好啊!小伙伴,我是小冷。是一个兴趣驱动自学练习两年半的的Java工程师。 📒 一位十分喜欢将知识分享出来的Java博主⭐️⭐️⭐️,擅…

Qt第二十六章:Nuitka打包教程

Nuitka环境安装 ①下载gcc文件。提取码:8888百度网盘 请输入提取码 ②解压nuitka1.0.6版本,我们解压64位的。 ③设置环境变量 ④检测一下 gcc.exe --version 安装nuitka pip install nuitka pip install ordered-set 防止环境变量不生效,…

【Redis】Redis介绍

文章目录1.NoSQL数据库1.1NoSQL适用场景1.2常用的NoSQL1.3Redis介绍1.4Redis的使用场景1.5Redis默认按照目录1.6Redis的启动1.7Redis是单线程多路IO复用技术1.NoSQL数据库 NoSQL(NoSQL Not Only SQL ),意即“不仅仅是SQL”,泛指非关系型的数据库。 NoS…