对 Transformer 中位置编码 Position Encoding 的理解

目录

什么是位置编码 Position Encoding

一、将绝对位置编码加在 Transformer 的输入端 (Sinusoidal 位置编码或可学习位置编码)

二、将绝对位置编码乘在 q k v (RoPE 位置编码)

三、将相对位置编码加在注意力权重   (ALiBi 位置编码)


什么是位置编码 Position Encoding

Transformer 的本质是一种全局注意力机制,它将输入序列中任意两个点之间的距离变为 1,可以实现长时或长距离的注意力机制。但这样带来的问题是,输入序列丧失了顺序信息,而对 NLP 来说输入字符的顺序是十分重要的,所以就需要位置编码 Position Encoding 来帮助 Transformer 感知输入序列的顺序信息。关于 Transformer 的基本原理和计算过程可以参考。基于位置编码 Position Encoding 的加载位置,可以将位置编码 Postion Encoding 分为:

  1. 如上图位置 1,将绝对位置编码加在 Transformer 的输入端,典型代表是 Sinusoidal 位置编码和可学习位置编码;
  2. 如上图位置 2,将绝对位置编码乘在 q k v ,典型代表是 RoPE 位置编码;
  3. 如上图位置 3,将相对位置编码加在注意力权重 q^{T}k,典型代表是 ALiBi 位置编码。

绝对位置编码指的是可以施加在某向量上的位置编码向量或者位置编码矩阵,在位置编码向量或者位置编码矩阵中包含位置或序列信息。相对位置编码并不是具体的位置编码向量或者位置编码矩阵,而是直接把基于两个位置的相对距离计算的权重直接加在注意力系数上。

一般而言,对于绝对位置编码的要求是:

  • 位置编码中的数值必须是有界的,不能类似于 1 .. n 的形式,这样不利于模型训练
  • 不同位置编码之间可以通过线性变换进行转换,且线性变换矩阵仅仅与两位置之间的相对位置有关,这样便于模型的学习
  • 不同位置编码之间的内积需要具有衰减特性,以体现距离近的位置相关度更强,距离远的位置相关度更弱

相对位置编码不存在具体数值,所以对其要求仅仅是:

  • 不同位置之间的编码值仅仅与两位置之间的相对距离有关,且这个编码值需要具有衰减特性,以体现距离近的位置相关度更强,距离远的位置相关度更弱

位置编码的原理是什么,在 Transfomer 计算中如何起作用,这个很难说清楚,深度学习本就具有不可解释性,更多的是通过大量实验尝试出来的结果。但是从可解释性上来说,从1 到 2 到 3,可解释性逐步变强。

在大语言模型中,对位置编码 Position Encoding 有一个新的要求,就是可延长性。所谓可延长性指的是训练时模型只看到了 1 .. n 位置的位置编码,但测试时可能出现 n+1 或者更远位置的位置编码。想要让位置编码具有可延长性,就需要让模型仅仅学习位置编码的相对特征而不是绝对特征,即任意两个位置,只要距离相同,那对加权系数的影响应该相同,从 1 到 2 到 3,理论上位置编码的可延长性逐步增强。但当前在大语言模型中,方案 2 的应用更广泛。

但实际上,深度学习模型是不可解释的,是没有严格理论逻辑的,很多都是总结的规律而已,在实际应用中可能需要多次尝试,选取最佳方案。

一、将绝对位置编码加在 Transformer 的输入端 (Sinusoidal 位置编码或可学习位置编码)

对于绝对位置编码最容易想到的就是二进制编码,假设输入特征的维度是 3,那二进制编码如下图所示:

可以获得 8 个位置的绝对位置编码,但此种编码方式不满足绝对位置编码要求中的后两点,所以实际使用效果并不好。

当前最常用的绝对位置编码方式为 Sinusoidal 编码,它满足所有要求。位置 t 处的绝对位置编码为:

其中,\omega _{k}=\frac{1}{10000^{\frac{2k}{d}}} ,d 是特征长度,k 取值范围是 1 ~ d/2。可以看出来上面位置编码每两个为一组,对于长度为 d 的位置编码,总共包含 d/2 组 sin 与 cos 的组合,每一组组合中的角速度是相同的,从上往下角速度逐步变小,最后一组组合的角速度为 1/10000,足以保证有 2*3.1415*10000  个绝对位置编码而不重复。可以把这个位置编码想象成一个包含 d/2 个指针的时钟,一个 sin 与 cos 组合构成一根指针,总共 d/2 根指针,这些指针的旋转角速度,从上往下逐步减小,就像从秒针到时针变化一样,也像十进制编码一样从低位到高位变化速度逐步减慢,在最下面的指针完成一圈旋转之前,不会出现重复的位置编码。

Sinusoidal 位置编码的使用方式是直接加在经过 Input Embedding 后的特征向量上,很多人会有疑问,为何选择相加而不是 concat,感觉相加会存在信息损失。但如上图所示,当 Q 与 A 完全相等时,相加和 concat 的效果完全一样。当 Q 与 A 不相等时,如果 head 只有一个,那通过调整 p 的值也可以做到完全等效。当 Q 与 A 不相等时,且 head 有多个时,相加与 concat 相比只是损失了很小一部分自由度,但是却换来了计算速度和内存使用上的优势,且很多时候过多的自由度有可能会增加训练难度、增加过拟合风险和降低模型性能,所以这里一般使用相加而不是 concat。由于深度学习模型本质上其实就是线性特征提取加非线性激活函数,所以最终 q 还是求和得到的,即使相加与 concat 不是完全等效,但最终还是归于求和操作。

接下来分析一下绝对位置编码的原理,绝对位置编码是通过对 q 和 k 施加影响,进而影响 q^{T}k 这个注意力权重系数。所以如上图所示,当把绝对位置编码加在 Input Embedding 后的特征向量上,那对 q^{T}k 的影响很复杂,难以分析 p 对这个注意力权重系数造成了什么影响,所以可解释性很低。

在参考中,通过实际计算证明 Sinusoidal 是存在衰减特性的。从参考中可以知道,不同位置的位置编码可以通过一个仅与两位置相对距离相关的旋转矩阵线性变换得到,且不同位置编码的内积满足衰减性,所以 Sinusoidal 位置编码满足所有 3 点要求。

但 Sinusoidal 位置编码的可延长性并不好,推测原因可能是如上公式所示,当 x1 x2 Q K 固定时,q^{T}k 的结果并不仅仅取决于 p1 和 p2 的相对位置,还取决于其绝对位置。

很多应用下,直接让绝对位置编码变为可学习的参数,虽然效果也很好,但这个的可解释性就更低了。

二、将绝对位置编码乘在 q k v (RoPE 位置编码)

RoPE (Rotary Position Embedding) 旋转式位置编码是通过将一个向量旋转某个角度,为其赋予位置信息。它本质上与 Sinusoidal 位置编码是一样的,都是通过旋转角度来赋予特征向量以位置信息。有时也称 RoPE 为相对位置编码。

还是以从上到下的指针分布举例,对于 Sinusoidal 位置编码,其生成位置编码向量的过程就是,首先让所有指针都从 0 位置开始旋转,每个编码的序列位置对应一个旋转时长,只是从上到下的指针旋转速度不一样,越往下速度越慢。对于 RoPE,它并不会真的生成一个位置编码向量,而是生成一个位置编码旋转矩阵,并作用于 q 和 k 上,q 和 k 也是从上往下,每两个值构成一个指针,长度为 d 的 q 总共包含 d/2 个指针,且 q 确定后,每个指针的指向也就确定好了,且一般肯定不是起于 0 位置,这里与 Sinusoidal 不同。然后基于编码的序列位置对 q 的所有指针旋转一个时间长度,从上到下的旋转角速度从大到小,以实现对 q 的位置编码。这个旋转过程就是由位置编码旋转矩阵实现的,位置编码旋转矩阵的形式为:

其中,i 表示维度分组索引,\theta _{i}=10000^{\frac{-2i}{d}} 表示的是旋转角速度,m 是编码的序列位置,也可以说是旋转时间长度。

接下来分析一下 RoPE 编码的原理,它是直接作用在 q 和 k 之上,从而影响 q^{T}k 这个注意力权重系数。所以如上图所示,当把旋转位置编码矩阵乘在 q 和 k 上时,对 q^{T}k 的影响也很复杂,在参考中存在对这个式子的拆解分析,相比 Sinusoidal 要简单点,所以可解释性稍微好点。

在参考中,通过实际计算证明 RoPE 是存在衰减特性的。RoPE 的旋转位置矩阵显然可以通过线性变换进行变换。所以 RoPE 满足绝对位置编码的 3 个要求。

RoPE 位置编码的可延长性很好,推测原因可能是如上公式所示,当 x1 x2 固定时,q^{T}k 的结果仅仅取决于 x1 和 x2 的相对位置,模型最终计算结果仅仅与相对位置有关,故具有理论上的可延长性。

三、将相对位置编码加在注意力权重 q^{T}k  (ALiBi 位置编码)

ALiBi (Attention with Linear Biases Enables Input Length Extrapolation)是相对位置编码,它的原理很简单,它直接作用于注意力权重 q^{T}k 之上,AliBi 就是一个如下图所示的矩阵,可以直接与 q^{T}k  求和。观察这个矩阵可以发现,这是一个相对距离矩阵,只要相对位置越近则衰减越小,且衰减的幅度与绝对位置无关。所以,ALiBi 既满足相对位置编码的一个要求,也具有很好的可延长性。ALiBi 的可解释性也非常好。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Hive3.0.0出库库表中timestamp字段读取为null

在利用sqoop1.99.7做数据迁移的时候,从mysql导出表格到hive建立对应的表格,字段中使用了timestamp类型,在读取数据的时候,发现数据为null。查找问题方法如下: 1、查询库表字段类型 命令:desc tablen…

如何避免SQL注入攻击?

🐓序言 当涉及到数据库操作时,防止SQL注入攻击至关重要。SQL注入是一种常见的网络安全威胁,攻击者通过在用户输入中插入恶意的SQL代码,从而可以执行未经授权的数据库操作。 🐓避免方式 使用参数化查询 使用参数化查询…

js实现拖放效果

dataTransfer对象 说明:dataTransfer对象用于从被拖动元素向放置目标传递字符串数据。因为这个对象是 event 的属性,所以在拖放事件的事件处理程序外部无法访问 dataTransfer。在事件处理程序内部,可以使用这个对象的属性和方法实现拖放功能…

基于Java在线玩具商城系统设计与实现(源码+部署文档)

博主介绍: ✌至今服务客户已经1000、专注于Java技术领域、项目定制、技术答疑、开发工具、毕业项目实战 ✌ 🍅 文末获取源码联系 🍅 👇🏻 精彩专栏 推荐订阅 👇🏻 不然下次找不到 Java项目精品实…

Java 基础学习(二十)Maven、XML与WebServer

1 Maven 1.1 什么是Maven 1.1.1 Maven概述 Maven是一种流行的构建工具,用于管理Java项目的构建,依赖管理和项目信息管理。它使用XML文件来定义项目结构和构建步骤,并使用插件来执行各种构建任务。Maven可以自动下载项目依赖项并管理它们的…

Spring 事务传播行为

实现原理 : Aop (TransactionInterceptor) 实现 使用spring声明式事务注意事项 同一个bean中的方法调用必须重新声明一个bean调用、否则后续方法调用的事务默认使用第一个第二个不生效 package com.cloud.person.service.impl;import com.cloud.person.dao.S1Mapper; import…

【Linux】详细分析/dev/loop的基本知识 | 空间满了的解决方法

目录 前言1. 基本知识2. 内存满了2.1 清空2.2 扩增 3. 彩蛋 前言 服务器一直down机,翻找日志文件一直找不到缘由,最终发现是挂载的内存满了,那本身这个文件就什么用呢? 1. 基本知识 /dev/loop是一种特殊的设备文件,…

Linux环境开发工具之gcc/g++

前言 我们前面介绍了yum和vim,可以在Linux上安装和卸载软件了也可以在vim上写C/C代码了!但代码写完后如何编译呢?这就是我们今天来介绍gcc和g! 本期内容介绍 gcc和g 程序的翻译过程 动静态库的链接 一、gcc和g 1.1什么是gcc和g…

mysql-->highgo迁移

1、迁移工具免安装,解压双击迁移工具,会进入如下界面:migration.rar 2、新建组–>创建新的服务 3、在创建好的服务下,新建数据库连接,建立源表和目标表 4、这一步是获取源库(Mysql数据库)与目标库(瀚高数据库&…

Web开发基本流程

Web是全球广域网,能够通过浏览器访问的网站。我们要访问网站,首先要在浏览器输入对应的域名。 浏览器也是一个程序,京东的网站也是一个程序,在京东那边电脑运行着,我们只是通过浏览器远程访问。京东的程序由三个部分组…

Thread类中start方法和run方法的源码简单解读,联系和区别

我们可以打开idea,按住ctrl将光标移至所查方法上,单击右键,即可查看这两个方法的源码: 1. start方法源码 我们从上至下分析一下: 这个threadStatus是一个int型的变量来表示线程是否开始,0为没有开始,非0为开始,因此当threadStatus不为0时,会抛出非法开始线程的异常. group对象…

VMware扩容硬盘

最近研究Oracle的备份导入导出功能,但是因为磁盘容量不够导致表空间的扩容没办法,从而没办法导入数据库的dmp文件。得想办法先扩容磁盘容量。话不多说上截图操作。 操作环境:VMware10 , Centos 6.9 VMware扩容硬盘步骤 一、关闭虚拟机&…

爬虫(Web Crawler)介绍与应用

## 摘要 本文将介绍什么是爬虫(Web Crawler)以及其在信息抓取、数据分析等领域的应用。我们将深入探讨爬虫的工作原理、设计特点以及开发过程中需要考虑的关键问题。 ## 一、什么是爬虫 爬虫是一种自动化程序或脚本,用于从互联网上抓取信息…

C++中的凸包:convexHull使用手册【c++重要方法】

最近工作中,用到了凸包,查了一些资料,差不多搞明白了,在这里做一个总结,希望可以帮助到你! 什么时候需要它? 如果你想要把一群散落的点,包裹起来。而且希望这个包裹尽可能地紧凑&a…

【c++】类和对象(四)深入了解拷贝构造函数

🔥个人主页:Quitecoder 🔥专栏:c笔记仓 朋友们大家好啊,本篇内容带大家深入了解拷贝构造函数 目录 1.拷贝构造函数1.1传值调用的无限调用1.2浅拷贝1.3深拷贝1.4深拷贝的实现 1.拷贝构造函数 拷贝构造函数是一种特殊的…

Linux/Pandora

Pandora Enumeration nmap 第一次扫描发现系统对外开放了22和80端口,端口详细信息如下 访问80端口,显示PLAY是Panda.htb的扩展,将网络监控解决方案带到家门口 尝试添加Panda.htb到/etc/hosts中,访问得到的页面却是一样的&#x…

工具推荐-eNSP(Enterprise Network Simulation Platform)

一.简介 1.1 一款由华为提供的免费的、可扩展的、图形化操作的网络仿真工具平台。 1.2 主要对企业网络路由器、交换机进行软件仿真,完美呈现真实设备实景,支持大型网络模拟。 1.3 让广大用户有机会在没有真实设备的情况下能够模拟,进行模拟网络架构和建…

Mamba复现与代码解读

文章目录 环境配置demo推理源码解析参数解读Mamba块(Mamba Block)状态空间模型(SSM)选择性扫描算法(selective_scan)前向传播(forward) 均方根归一化 (RMSNorm)残差块(Re…

批量删除 rabbitmq中随机队列

批量删除 amq.gen–* 随机队列 操作错误产生了无效随机队列,需要批量删除 过滤列出指定amq.gen–队列 # 列出 指定 vhost/qq 以amq.gen开头的所有队列 rabbitmqctl list_queues --vhost / | grep ^amq.gen-# 批量删除队列 #由于list_queues会列出队列名称以及对应…

Windows系统部署瀚高数据库

1.安装包解压之后,执行setup.exe hgdb-enterprise-6.0.4.rar 2.勾选“我接受协议”,点击下一步,设置数据库安装目录(注意安装路径,不要包含中文,也尽量不要包含特殊符号。这里默认会是“6.0.4”&#xff0…
最新文章