位置编码Positional Encoding

2023-05-16

位置编码Positional Encoding

    • 1.Transformers中的PE
    • 2.什么是Transformer位置编码
      • 2.1.表格型
      • 2.2.相对位置的关系-函数型
    • 3.为什么可以表示相对距离?
    • 4.其他参考

内容全来自于网络总结。

  • 其他参考1
  • 其他参考2

1.Transformers中的PE

  • 摘抄自这里。

在这里插入图片描述
公式是初中生都看的懂,

  • d m o d e l d_{model} dmodel表示输入的维度,
  • p o s pos pos表示单词的索引,
  • i i i表示向量中索引,
  • s i n sin sin, c o s cos cos计算出对应值,

但是为什么可以这样加到input上达到位置编码的效果呢?这时候看看bert就是非常直观的绝对位置动态编码,就直观很多,每个位置就是固定的embedding:

在这里插入图片描述
原文作者解释的:

在这里插入图片描述

对于任何偏移量k,对pos+k的编码都可以是pos编码线形变换.先来看看可视化结果:

在这里插入图片描述
值得注意的是,每个向量第0和第1的位置,第0的位置对应于PE公式的sin式,第1的位置对应于PE公式的cos式子,但是他们的2i都是0,所以会有下式:
在这里插入图片描述

所以每个输入向量的第0个和第1个位置的位置编码只和向量所处的pos有关.但是第3个位置后就受d_model影响了,一旦d_model变小,sin/cos函数就会有“拉伸”感,如下图所示:

在这里插入图片描述

对于长度为20的input,维度是50,可以画出一下PE值:

在这里插入图片描述

越小的pos受影响的i就越少, i i i如果很大,PE值就会在0和1进行变换.从上图中,我们看到30~50列值基本没有变化.为啥上图这种编码就能学到位置信息?其实有种非常直观的解释方式,比如让你对数字进行编码,最直观的想法就是二进制编码,如下图所示:

在这里插入图片描述
PE方法就可以简单的理解为上述版本的float编码.

2.什么是Transformer位置编码

  • 摘抄自这里。

在这里插入图片描述

在以前的模型中,NLP的每个Sequence都是一个token一个token的输入到模型当中。比如有一句话是“我喜欢吃洋葱”,那么输入模型的顺序就是“我”,“喜”,“欢“,”吃“,”洋“,”葱”,一个字一个字的。

上面的输入方式其实就引入了一个问题。一个模型每次只吃了一个字,那么模型只能学习到前后两个字的信息,无法知道整句话讲了什么。为了解决这个问题,Transformer模型引用了Self-attention来解决这个问题。Self-attention的输入方式如下:

在这里插入图片描述
可以看到,对于Self-attention结果而言,它可以一次性的将所有的字都当做输入。但是NLP的输入是有特点的,其特点是输入的文本要按照一定的顺序才可以。因为,文本的顺序是带有一部分语义关系的。比如下面两句话,不同的语序就有不同的语义。

  • 句子1:我喜欢吃洋葱
  • 句子2:洋葱喜欢吃我

所以,对于Transformer结构而言,为了更好的发挥并行输入的特点,首先要解决的问题就是要让输入的内容具有一定的位置信息。在原论文中,为了引入位置信息,加入了Position机制。

对于Transformer而言,Position机制看似简单,其实不容易理解。这篇文章通过梳理位置信息的引入方式,然后详细讲解在Transformer中是如何做的。最后将通过数学来证明为什么这种编码方式可以引入相对的位置信息。

位置编码分类:总的来说,位置编码分为两个类型:函数型和表格型

  • 函数型:通过输入token位置信息,得到相应的位置编码

  • 表格型:建立一个长度为L的词表,按词表的长度来分配位置id

2.1.表格型

  • 方法一:使用[0,1]范围分配

这个方法的分配方式是,将0-1这个范围的,将第一个token分配0,最后一个token分配去1,其余的token按照文章的长度平均分配。具体形式如下:

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

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

  • 方法二:1-n正整数范围分配

这个方法比较直观,就是按照输入的顺序,一次分配给token所在的索引位置。具体形式如下:

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

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

总结:过去的方法总有这样或者那样的不好,所以Transformer对于位置信息的编码做了改进。

2.2.相对位置的关系-函数型

相对位置编码的特点,关注一个token与另一个token距离的相对位置(距离差几个token)。位置1和位置2的距离比位置3和位置10的距离更近,位置1和位置2与位置3和位置4都只相差1。

还是按照上面"我喜欢吃洋葱"中的“我”为例,看看相对位置关系是什么样子的:

在这里插入图片描述
可以看到,使用相对位置的方法,可以清晰的知道单词之间的距离远近的关系。

Transformer的Position

类型:首先给一个定义:Transformer的位置信息是函数型的。在GPT-3论文中给出的公式如下:

在这里插入图片描述

细节:首先需要注意的是,上个公式给出的每一个Token的位置信息编码不是一个数字,而是一个不同频率分割出来,和文本一样维度的向量。向量如下:

在这里插入图片描述
不同频率是通过 w n w_n wn 来表示的。得到位置向量P之后,将和模型的embedding向量相加,得到进入Transformer模型的最终表示。

在这里插入图片描述
① 关于 w i w_i wi : w i w_i wi 是频率

在这里插入图片描述

② 关于 $ t$:这里的 $ t$ 就是每个token的位置,比如说是位置1,位置2,以及位置 n

3.为什么可以表示相对距离?

上文说过,这样的位置信息表示方法可以表示不同距离token的相对关系。这里我们通过数学来证明。

回顾下中学的三角函数正余弦公式:

在这里插入图片描述

  • 已知某一个token的位置是 $pos $ ,如果某一个token表示为 p o s + k pos+k pos+k ,那就表明这个位置距上一个token为 k k k

  • 如果这时需要看看一个位置 $ pos$ 和 $ pos+k$ 这两个字符的关系。按照位置编码的的公式,可以计算 p o s + k pos+k pos+k
    的位置编码,其结果如下:
    在这里插入图片描述
    可以看看上面公式中,有一部分是似曾相识的:

在这里插入图片描述

根据上面的公式可以看出,似曾相识的部分带入 P E p o s + k PE_{pos+k} PEpos+k 的公式中,带入之后的结果如下:
在这里插入图片描述

可以知道,距离K是一个常数,所有上面公式中 sin() 和 cos() 的计算值也是常数,可以表示为:
在这里插入图片描述

这样,就可以将 P E p o s + k PE_{pos+k} PEpos+k 写成一个矩阵的乘法。

在这里插入图片描述

可以从上面的矩阵乘法角度看到,位置 pos 的编码与位置 pos+k 的编码是线性关系。

那么问题来了,上面的操作也只可以看到线性关系,怎么可以更直白地知道每个token的距离关系?

为了解答上面的问题,将 P E p o s PE_{pos} PEpos P E p o s + k PE_{pos+k} PEpos+k 相乘 (两个向量相乘),可以得到如下结果:

在这里插入图片描述

发现相乘后的结果为一个余弦的加和。这里影响值的因素就是 k 。如果两个token的距离越大,也就是K越大,根据余弦函数的性质可以知道,两个位置的 PE 相乘结果越小。这样的关系可以得到,如果两个token距离越远则乘积的结果越小。

其他
这样的方式虽说可以表示出相对的距离关系,但是也是有局限的。其中一个比较大的问题是:只能的到相对关系,无法得到方向关系。所谓的方向关系就是,对于两个token谁在谁的前面,或者谁在谁的后面是无法判断的。数学表示如下:

在这里插入图片描述

4.其他参考

在这里插入图片描述

为什么这么做有用:

  • pos+K=5,在计算第 5 个单词的位置编码的时候
  • pos=1,k=4
  • pos=2,k=3

在这里插入图片描述

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

位置编码Positional Encoding 的相关文章

  • utf-8特殊字符不显示[重复]

    这个问题在这里已经有答案了 我将网站从本地测试服务器移至 NameCheap 共享主机 现在我遇到了问题 某些页面无法正确显示 utf 8 特殊字符 而是显示问号 所有页面均采用 utf 8 编码 所有数据库表也是如此 奇怪的是 有些页面可
  • UnicodeDecodeError:“utf-8”编解码器无法解码字节错误

    我正在尝试得到回复urllib并解码它 为可读格式 文本是希伯来语 还包含以下字符 and 顶部页面编码为 coding utf 8 原始字符串是 b xff xfe x00 x00 r x00 n x00 x00i x00d x00 x0
  • 瑞典语字符和 UTF-8

    我在所有页面上都使用 UTF 8 但一些瑞典语字符 和 变得混乱 只是一个带有一些字母的方框 我的数据库设置为 utf8 general ci 但我什至没有连接 所以这并不重要 或者我应该使用另一个字符集 这不是瑞典语网站 都是英文的 但我
  • R默认编码为UTF-8

    如何在 library base R 中配置 Rprofile 以便默认字符集为 UTF 8 而不是本机 编码配置为行 options encoding native enc 我想我们需要放置 UTF 8 相关值来代替 native enc
  • 人类友好的二进制编码

    不久前 我发现一个网站描述了一种对人类友好的二进制到文本编码 例如 在输入 用于解码 时 它接受 0 o 和 O 全部作为相同的值 因为人们往往很容易混合这些字符 不幸的是我不记得它是怎么叫的 编辑 这就是我正在寻找的 其他Base32 的
  • 重音字符的问题

    I have a search box on my site and i need to replace all the Spanish characters that user types in to equivalent English
  • Silverlight 4.0 的最佳 Jpeg 编码器

    我想将 Writablebitmap 转换为 Jpeg 流 看起来没有平台支持 而且我在网上看到了一堆开源编码器库 我想听听您的意见 就性能和性能而言 推荐哪个可靠性 我取得了很好的经验FJCore http code google com
  • Swift - 特殊字符的编码和解码字符串

    这是我的问题 我目前正在开发一个应用程序 包括即时聊天 使用 FCM 一切正常 除了当我尝试发送 或表情符号等特殊字符时 收到的推送通知包含好的字符串 但是当讨论保存在服务器上然后重新加载时 我无法读取它们并获取 UTF8 文本 例如 的
  • mb_detect_encoding 无法在 Windows-1250 (CP1250) 上正常工作

    我在检测 CP1250 时遇到问题mb detect encoding http php net manual en function mb detect encoding php 就我而言 我想检测 3 种编码 mb detect enc
  • 如何在 Node.js 中进行 Base64 编码?

    Node js 是否有内置 Base64 编码 我问这个的原因是final from crypto只能输出十六进制 二进制或ASCII数据 例如 var cipher crypto createCipheriv des ede3 cbc e
  • 当存在 UTF-8 字符编码时,显示引号的问号图标

    由于某种原因 我添加后 在我的头标签之间 某些符号 即引号 显示为中间带有问号的菱形图标 就好像没有找到该符号一样 有人知道怎么回事吗 您的文本编辑器正在以某种非 UTF 8 很可能是 CP1252 的编码保存文件 包括引号 将文件实际转换
  • decodeURIComponent 与 unescape,unescape 有什么问题?

    在回答另一个问题时 我意识到我的 Javascript DOM 知识已经有点过时了 因为我仍在使用escape unescape对 URL 组件的内容进行编码 而看起来我现在应该使用encodeURIComponent decodeURIC
  • 在 R 中转换 HTML 字符实体编码

    R 有没有办法转换 HTML 字符实体编码 我想转换 HTML 字符实体 例如 amp to or gt to gt 对于 Perl 来说 存在 HTML Entities 包可以做到这一点 但我在 R 中找不到类似的东西 我也尝试过ico
  • RGB 缓冲区到 JPEG 缓冲区,这里出了什么问题?

    我需要一种简单的方法将包含 RGB 数据的缓冲区转换为 jpeg 我已经尝试过使用 libjpeg 但我根本无法让它正常工作 例如 将缓冲区保存为位图时会产生以下结果 使用 libjpeg 在内存中对同一图像进行编码会产生以下结果 将图像直
  • 如何对加密算法进行逆向工程?

    我编写了一个以这种方式加密文本的应用程序 获取输入文本 反转文本 转换为十六进制 用密钥进行异或 Base64编码 现在 我自己没有做很多加密 编码 所以我的问题可能听起来很愚蠢 但是 假设我得到一个包含上述算法内容的文件 而我不知道这个算
  • 来自 StreamReader 的原始文件字节,幻数检测

    我试图区分 文本文件 和 二进制 文件 因为我实际上想忽略具有 不可读 内容的文件 我有一个文件 我认为它是 GZIP 存档 我试图通过检测幻数 文件签名来忽略此类文件 如果我在 Notepad 中使用十六进制编辑器插件打开文件 我可以看到
  • CDO.消息编码问题

    我们目前正在将邮件递送系统更改为仅使用UTF 8 发件人姓名似乎有问题 当电子邮件包含非 ASCII 字符 希伯来语 时 主题和正文呈现正常 但发件人姓名 如出现在我的 gmail 帐户中 变为 有一行代码 myMail BodyPart
  • 如何将阿拉伯语、希伯来语写入 CSV 文件? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我无法向
  • 如何在 R 中将包含符号的绘图写入 PDF?

    我想在 R 中的箱形图的 x 轴上使用无穷大符号 我想将其写入 PDF 文件 我可以通过这样做来设置无穷大符号 names data 9 lt 但这让我在尝试编写时出现编码错误 conversion failure on in mbcsTo
  • ASCII - 代码点与字符编码

    我发现一篇有趣的文章 字符代码问题教程 http jkorpela fi chars html code http jkorpela fi chars html code 解释了术语 字符代码 代码点 和 字符编码 前者只是分配给一个字符的

随机推荐

  • ROS2学习笔记(十)-- ROS2 launch启动文件

    简介 xff1a 接触过ROS1的同学对launch肯定不陌生 xff0c 在ROS1中 xff0c 我们常用launch实现node和master同时启动 多节点同时启动配置等功能 xff0c ROS2中的launch也是用于多节点启动
  • C++vector的使用总结及常用vector操作

    一 C vector类为内置数组提供了一种替代表示 与string类一样 vector 类是随标准 C 引入的标准库的一部分 使用时需包含头文件 include lt vector gt 二 C vector类有两种使用方式 第一种 STL
  • cc2640 基于官方从机修改的通过手机实现蓝牙点灯例程

    在TI官方从机例程中的simpleBLEPeripheral c进行代码修改 添加引脚驱动头文件 xff1a include lt ti drivers pin PINCC26XX h gt PIN driver 添加全局变量 xff1a
  • cadence 17.0 生成钻孔文件 cam350打不开的问题解决

    17 0生成钻孔文件后 xff0c cam350打不开 这时用记事本打开钻孔文件 对比发现相较于16 6的版本 xff0c 多了以下一行红色高亮的的代码 将其删除就可以用cam350打开了 LEADER 12 HEADER CODE ASC
  • matlab 串口读取设置

    本例代码运行于 MATLAB2015b xff0c 参照网上的代码修改而成 xff0c 可以自定义一次读取的数据 xff0c 并做简单处理 xff0c 随后绘图 实测可用 实用 读串口 clear clc obj 61 serial 39
  • 室内定位综述

    本篇文章是作者研究生毕设的前稿 xff0c 每周更新补充 xff0c 主要是中外关于室内定位的论文综述 xff0c 偏向于TDOA方向 xff0c 也会更新些其他的方向 有不当的地方欢迎有人指正 61 2016 7 20 1 Contrib
  • CC2630 TIMAC协议栈低功耗问题

    项目功能 采集5s数据发送 休眠5s 采集5s数据发送 xff0c 循环往复 平台 CC2630 协议栈 xff1a timac 1 05 02 43299 问题描述 在休眠5s的过程中 xff0c 整体电流在7 8ma xff0c 只比数
  • c++ 大小写转换&&字符转数字

    大小写转换 amp amp 字符转数字 xff0c 实验笔记 int main 其实就是对ASCii表的操作 string s char a 61 39 a 39 int b 61 a 39 0 39 字符转成数字 int c 61 int
  • 数组方式赋值字符串及字面值常量赋值字符串的区别

    c 43 43 实验笔记 数组赋值字符串时需要显示 39 0 39 xff0c 否则在某些时候会有问题 int main const char a 61 39 a 39 39 v 39 39 b 39 39 b 39 39 0 39 数组需
  • STL:: allocator之deallocate & destory的区别与联系

    c 43 43 中的allocator是标准库中的一个类 xff0c 负责内存分配管理 下面是 STL源码剖析 中一个简单allocator实现的部分源代码 xff1a deallocate xff1a template lt class
  • allocator简单实现

    allocator是c 43 43 标准库中用于管理内存的一个类 主要包括以下类方法 xff1a 代码如下 xff08 来源于 STL源码剖析 xff09 xff1a ifndef JJALLOC define JJALLOC includ
  • ROS2学习笔记(十一)-- ROS2 bag数据记录与回放

    简介 xff1a ROS2提供了ros2 bag命令 xff0c 可以记录指定主题的数据到文件中 xff0c 也可以将记录下的内容再发布出来 xff0c 相当于是数据的回放 xff0c 除了通过命令行的方式实现数据记录以外 xff0c 也可
  • Altium Designer 10 导出文件(PDF,gerber,BOM)

    作者 xff1a 卢老师 华清远见嵌入式学院讲师 5 导出原理图文档 GERBER 文件 xff0c BOM对于导出 PDF 文档 xff0c 多人分析时 xff0c 不能保证所有的电脑都安装有 AD10 软件 xff0c 这个也很有必要
  • 纯C++的Socket访问Http封装类

    纯C 43 43 的Socket访问Http封装类 1 项目中要使用c 43 43 43 43 来访问Web服务器 xff0c 从网上找了个C 43 43 的封装类 xff0c 其中调用了MFC xff0c 在VC2005上用能用 xff0
  • 一个C++解析HTML的库

    HTTP协议使用广泛 xff0c 相应的 xff0c C 43 43 在这块需求也开始增加 一个好的解析库可以达到事半功倍的效果 xff0c 在此贴出我的解析库的代码 xff0c 方便新手朋友们使用 hHttpParse h ifndef
  • Intel Realsense D435i SDK Install

    Intel Realsense D435i 0 引言1 参考2 Install3 Other 0 引言 自己买的还没到 xff0c 借的同学 xff0c 生怕给他搞坏了 1 参考 ref0 官方giahubref1 官方Installref
  • OBVP问题推导

    OBVP问题推导 0 引言1 推导2 code 0 引言 记录一下 时间紧张 xff0c 不整理了 xff0c 直接上草稿纸 一元四次方程求解参考博客 1 推导 2 code 代码完全按照推导书写 xff0c 包括变量的命令 span cl
  • CMakeLists中的add_definitions()函数

    CMakeLists中的add definitions函数 0 引言1 add definitions 2 应用 0 引言 其实这个函数在安装一些库的时候 xff0c 它的CMakeLists里面就有这样的函数 典型的就是opencv了 o
  • Intel Realsense D435i&L515 驱动安装

    Intel Realsense D435i amp L515 驱动安装 0 引言1 D435i amp L515固件更新1 1 D435i固件更新1 2 L515固件更新 2 Intel Realsense驱动安装3 ROS Wrapper
  • 位置编码Positional Encoding

    位置编码Positional Encoding 1 Transformers中的PE2 什么是Transformer位置编码2 1 表格型2 2 相对位置的关系 函数型 3 为什么可以表示相对距离 xff1f 4 其他参考 内容全来自于网络