positional encoding位置编码详解:绝对位置与相对位置编码对比

2023-05-16

本文转载自公众号夕小瑶的卖萌屋,专业带逛互联网算法圈的神操作

-----》我是传送门

关注后,回复以下口令:

回复【789】 :领取深度学习全栈手册(含NLP、CV海量综述、必刷论文解读)

回复【入群】:加入卖萌屋深度学习/NLP/CV/搜广推等方向的技术交流与内推社群(大V、顶会审稿人云集)

回复【0511】:领取算法岗面试手册(刷offer神器)

回复【0424】:领取刷论文神器(挖掘每日、每月必刷重磅论文)

目录

前言

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)展开有

其中是关于位置在复数域上的函数。

为了让上述函数更好的表征位置的相对信息,要求函数满足以下两个性质:

  1. Position-free offset transformation

存在一个函数 使得

其中在不影响理解的情况下,我们把简写成。也就是说,词在pos或者pos+k的表示可以由只和相对位置k有关的一个变换得到,而与具体这个词无关。

  1. 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已经有了充分的理解~~至于到底应该如何选择,还是需要基于大家对方法的理解实际问题实际分析哦????

本文转载自公众号夕小瑶的卖萌屋,专业带逛互联网算法圈的神操作

-----》我是传送门

关注后,回复以下口令:

回复【789】 :领取深度学习全栈手册(含NLP、CV海量综述、必刷论文解读)

回复【入群】:加入卖萌屋深度学习/NLP/CV/搜广推等方向的技术交流与内推社群(大V、顶会审稿人云集)

回复【0511】:领取算法岗面试手册(刷offer神器)

回复【0424】:领取刷论文神器(挖掘每日、每月必刷重磅论文)

参考文献

[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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

positional encoding位置编码详解:绝对位置与相对位置编码对比 的相关文章

  • C# 自定义控件制作和使用实例

    C 自定义用户控件 xiongxuanwen 上篇 xff1a 控件制作 本例是制作一个简单的自定义控件 xff0c 然后用一个简单的测试程序 xff0c 对于初学者来说 xff0c 本例子比较简单 xff0c 只能起到抛石引玉的效果 我也
  • 二叉树搜索性能比较

    二叉树搜索性能分析 我想测试一下不同类型的二叉树搜索数据的性能是什么样的 众所周知 xff0c 二叉树有以下几种类型 xff1a BSTAVL红黑树 对于搜索数据 xff0c 具体来讲 xff0c 当树保持平衡时 xff0c 其搜索时间复杂
  • Kubernetes系统架构

    控制单元 xff1a kube apiserver xff1a 所有客户端通过kube apiserver访问cluster中的各种服务 xff0c 资源以及应用 etcd xff1a 键值对数据库 xff0c 存放所有的集群数据 kube
  • Kubernetes的网络模型(K8S集群中的三个网络)

    一个K8S的集群中至少有三个网络 xff1a 1 集群节点所在的网络 xff0c 这个网络就是你的主机所在的网络 xff0c 通常情况下是你的网络基础设施提供 如果你的node处于不同的网段 xff0c 那么你需要保证路由可达 如上图中的
  • K8S中的容器(Container)之间的网络接口

    Kubernetes集群中当一个容器启动时 xff0c 容器里面会启动一个以太网络接口 xff08 eth0 xff0c 分配的是Pod网络所用的IP地址 xff0c 通过一个虚拟以太网对 xff08 veth pair xff0c 连接到
  • K8S中Pod之间互相访问,外部访问如何访问Pod的网络连接原理

    Pod中的Container启动时 xff0c 会分配一个Pod网段中的IP地址 xff08 network cidr xff09 xff0c 但是这个IP地址是浮动的 xff08 ephemeral xff09 xff0c Pod重启 x
  • kubectl proxy 是什么

    大家都知道 xff0c 在K8S集群中的业务从外部默认是不能访问的 xff0c 正式环境中 xff0c 我们需要通过service xff0c 然后通过Node的ip地址和Loadbanlencer来访问 但是还有一些简单的方式 xff0c
  • kubectl port-forward命令访问集群中业务

    使用kubectl proxy可以访问Pod中的业务 xff0c 但是URL要加上namespace xff0c service等 xff0c 比较长 kubectl还提供了一个功能 xff0c 就是kubectl port forward
  • K8S服务发现(kube-dns) : CoreDNS

    K8S中 xff0c Pod如果想也另外一个Pod通信 xff0c 通常不会直接基础此Pod的IP xff08 动态的 xff09 xff0c 也不会记住此Pod形成的Service的IP xff08 相对比较稳定 xff0c 但也是动态的
  • Git 主干分支模型中的CI、CD ( 一)

    分支模型 主干分支模型如上图 xff0c 项目有个主干分支和若干个release分支 主干分支 xff1a 开发人员在主干分支上 xff08 通常情况下是master分支 xff09 push代码 xff0c push代码签需要在本地做re
  • Git主干分支模型中的CI、CD ( 二)

    分支模型 如果主干分支随意push引起较大的混乱 xff0c 可以考虑么个人开发是创建一个临时feature分支 如下图 xff1a 主干分支模型如上图 xff0c 项目有个主干分支和若干个release分支 xff0c 还有一些临时的fe
  • 持续集成CI, 持续发布CD,持续部署CD的意义及区别

    持续集成 xff0c 持续发布 xff0c 持续部署是自动化release pipeline的三个阶段 xff0c 通过这三个阶段 xff0c 团队把软件从创意 xff0c 生产为软件 xff0c 并发布给终端用户 这三个阶段关注产品的三个
  • linux系统常用命令总结

    简介 本文简单记录常用的linux系统shell命令 命令 linux系统常用shell命令如下表格 命令功能示例备注alias给命令起别名alias c 61 clear 取clear的别名为ccat显示文本内容cat file显示fil
  • 持续集成:CI

    持续集成 xff0c 持续发布 xff0c 持续部署是DevOps中三个实现手段很相似 xff0c 但是应用场景不同的三个概念 我接下来主要从应用场景来描述一下这三个场景的主要关注点 持续集成 xff1a 发生在开发阶段 xff0c 开发人
  • 持续发布(CD Continuous Deployment)

    持续发布是持续集成的延续 每次当我的代码被push到代码仓库后 xff0c 业务也应该被持续部署 如果使用持续发布 xff08 CD xff09 xff0c 发布过程是手动触发的 CD可以自动检查代码变化 xff0c 但是必须需要人工干预
  • 持续部署(CD, Continuous Deployment)

    持续也是持续集成的扩展 xff0c 和持续发布一样 xff0c 不同的是持续部署不需要手动干预 xff0c 直接自动部署到生产环境
  • Git中Feature分支模型中的CI,CD

    分支模型 主干分支 Master xff1a 随时可供在生产环境中部署的代码 xff0c 建议伴有标签 xff08 TAG xff09 Develop xff1a 每天需要提交和合并的代码 xff0c 功能逐渐完成的代码开发分支 辅助分支
  • DevSecOps及软件IT安全防护的开源扫描工具

    最近研究了一下热门话题 xff1a DevSecOps xff0c 明白了不少网络安全方面的概念和不少顶级的开源安全扫描工具 xff0c 现分享给大家 过去 xff0c 每个公司有一个信息安全防护的部门 xff0c 专门负责公司的IT信息安
  • K8S服务发现(kube-dns)

    K8S中 xff0c Pod如果想也另外一个Pod通信 xff0c 通常不会直接基础此Pod的IP xff08 动态的 xff09 xff0c 也不会记住此Pod形成的Service的IP xff08 相对比较稳定 xff0c 但也是动态的
  • K8S中的负载均衡Ingress

    K8S通过Ingress xff0c 把K8S集群中的服务 xff0c 通过Http和https路由暴露给外部用户 路径等信息通过Ingress的资源文件配置 1 一个K8S集群 2 一个集群Admin xff0c 两个个K8S用户 Use

随机推荐

  • DevOps关键指标

    不能衡量 xff0c 就无法管理 xff1b 不能管理 xff0c 就无法改进 xff0c 这句话对于DevOps或其它研发管理实践来说 xff0c 是正确的 为了实现DevOps的承诺 xff1a 更快地交付更高质量的产品 xff0c D
  • 成功的CEO的特质(一个投资人的观察)

    一个投资人总结他投资的100多个成功创业者的特质 1 不需要外部驱动 xff0c 不需要钱 危机状况触发他们的斗志 xff0c 他们内心有者强烈的驱动力 xff0c 证明自己的想法是对的 xff0c 能让世界变得更好 即使他们变得很富有了也
  • minikube 及安装

    和 kind 一样 xff0c minikube是一个在PC机上本地部署单节点Kubernetes集群的工具 xff0c 可以作为K8S的学习 xff0c 测试环境 在linux上安装minikube xff1a span class to
  • linux系统进程间通信方式(三):管道

    进程间通信方式之管道 管道通常指无名管道 xff08 PIPE xff09 或有名管道 xff08 FIFO xff09 xff0c 但实际上套接字也都是管道 接口 PIPE和FIFO的相关接口如下表格 功能创建无名管道 xff1a PIP
  • Python3 注释

    前言 确保对模块 函数 方法和行内注释使用正确的风格 xff08 文末送读者福利 xff09 Python 中的注释有单行注释和多行注释 Python 中单行注释以 开头 xff0c 例如 xff1a 这是一个注释 print Hello
  • 2023!七大最佳Python书籍,入门到精通推荐!

    前言 什么是Python xff1f Python是一种高级编程语言 xff0c 用于使用正确的工具和库文件进行Web开发 xff0c 桌面应用程序 xff0c 人工智能 xff0c OS xff0c 原型 xff0c GUI应用 xff0
  • 树莓派3B+UbuntuMate18.04安装ROS

    最近一直在配置树莓派的各种环境 xff0c 今天了解到可以搭载ROS然后控制摄像头 xff0c 激光雷达等 xff0c 就开始了疯狂踩坑 xff0c 记录问题及解决办法如下 配置 xff1a 树莓派3B 43 xff0c UbuntuMAT
  • 电脑技巧:Win10无线投屏功能介绍

    Win10操作系统可以将电脑中的内容投屏到其他显示设备 xff0c 比如将电脑屏幕投屏到电视上 xff0c 这是通过Miracast技术来实现的 其实Win10电脑自身也可以作为被投屏的那一方 xff01 比如可以将手机屏幕投屏到电脑屏幕上
  • 收集一些程序员励志经典名言

    1 作为一个真正的程序员 xff0c 首先应该尊重编程 xff0c 热爱你所写下的程序 xff0c 他是你的伙伴 xff0c 而不是工具 2 程序员可以让步 xff0c 却不可以退缩 xff0c 可以羞涩 xff0c 却不可以软弱 xff0
  • SVN连接不上,提示:Error running context: The server unexpectedly closed the connection.

    结果 xff0c 询问一起其他伙伴 xff0c 人家都能正常使用 最终找到的问题是 xff1a 把TortoiseSVN gt Settings gt Network gt Enable Proxy Server 这个勾选项取消勾选 就可以
  • 组装机怎么重装系统?组装机U盘装系统方法

    很多用户都会给自己的电脑进行重装 xff0c 这样就能使用上自己购买的硬件配置 组装好的电脑第一步要做的就是装系统 xff0c 下面小编就给大家整理了新电脑用U盘装系统的方法 xff0c 希望可以帮到大家 U盘重装系统Win10下载 系统之
  • 电脑老系统怎么换新系统?

    现在还有好多用户家里装的是旧电脑 xff0c 使用的系统也都是很久之前的系统了 xff0c 就有用户想给电脑换新系统 xff0c 但是不知道具体怎么操作 针对这个问题 xff0c 小编为大家带来详细的重装教程 xff0c 有需要的用户可以看
  • 介绍snipaste截图快捷键

    snipaste是非常受人欢迎的一款截图软件 xff0c 体积小巧 xff0c 功能强大 为了方便使用 xff0c 很多用户都会设置一些快捷键 xff0c 那么snipaste怎么设置快捷键呢 xff1f 下面就来看看具体的设置步骤 设置方
  • 教教大家vmware虚拟机安装win11的方法

    vmware是大家经常使用的虚拟机软件 xff0c 在其上面可以安装多种操作系统不管是windows系统 linux系统还是mac系统 那么win11系统也能安装吗 xff1f 当然是可以的 vmware安装Win11教程 1 首先我们需要
  • freertos的可视化追踪和运行时间统计功能

    简介 很多时候 xff0c 我们想要知道rtos任务目前的运行情况 xff0c 比如任务的状态 优先级 cpu的占用率等等 xff0c 或者我们想要知道当前正系统在运行的是哪一个任务 xff0c 又或者我们想要知道某一个任务运行了多长时间
  • 麻将算法(上)

    一 麻将规则 xff08 云南昭通麻将 xff09 1 牌 1 万 筒 和 条 三房牌 xff0c 各36张 xff0c 共108张牌 xff1b 2 只能 碰 杠 胡 xff0c 不能吃牌 3 4人进行游戏 xff1b 4 游戏开始时 x
  • DIR dirp对目录的操作

    xfeff xfeff DIR函数以及dirp函数 DIR opendir const char pathname 即打开文件目录 xff0c 返回的就是指向DIR结构体的指针 返回该指针以后 xff0c 就可以被以下函数来使用了 xff0
  • SocketException: 由于目标计算机积极拒绝,无法连接。 127.0.0.1:10000

    在尝试python socket编程的时候 xff0c 首先将编写好的客户端和服务器端都部署在本地进行 xff0c 并且使用同一台宿主机 客户端使用127 0 0 1 xff0c 服务器端使用0 0 0 0或者直接 刚开始我端口是随意选择的
  • NVIDIA Jetson Xavier NX——入手安装

    Google search sd card formatter for formatting SD card Google search balenaetcher for flashing JetPack SDK Google search
  • positional encoding位置编码详解:绝对位置与相对位置编码对比

    本文转载自公众号 夕小瑶的卖萌屋 xff0c 专业带逛互联网算法圈的神操作 我是传送门 关注后 xff0c 回复以下口令 xff1a 回复 789 xff1a 领取深度学习全栈手册 xff08 含NLP CV海量综述 必刷论文解读 xff0