【Transformer】Positional Encoding

news2024/11/13 10:56:27

文章目录

  • 为什么需要位置编码?
  • 预备知识
    • 三角函数求和公式
    • 旋转矩阵
      • 逆时针旋转
      • 顺时针旋转
  • 原始Transformer中的位置编码
    • 论文中的介绍
    • 具体计算过程
    • 为什么是线性变换?
  • 大模型常用的旋转位置编码RoPE
    • 基本原理
    • Llama3中的代码实现
  • 参考资料

为什么需要位置编码?

众所周知,老生常谈,Transformer模型的核心是自注意力机制(Self-Attention),这一机制的特点是输入序列中的所有元素都是同时被处理的,而不是像RNN那样按顺序处理。这种并行处理的方式虽然具有很高的效率,但也导致了模型无法自然地获取输入序列中元素的位置信息

比如,自注意力机制在处理 AI 好 难 学难 学 好 AI 这两个元素相同,但是位置不同的序列时,得到的每个元素对应的attention值是相同的,也没办法区分。

因此,Positional Encoding 的作用,就是在把 Word Embedding 送入 Attention 之前,把位置信息给带上,使得模型能够在进行自注意力计算时感知到输入元素的相对和绝对位置。

网络社区中对 Positional Encoding 分类的方法很多,按照不同的分类方法划分,大致可以分为:

  • 绝对位置编码和相对位置编码
    • 绝对位置编码,为输入序列中的每个位置提供一个唯一的表示,通常是通过预定义的方法生成,并直接添加到输入表示中
    • 相对位置编码,是对两个单词之间的相对位置进行建模,并且将相对位置信息加入到Self-Attention结构中,形如Transformer-XL,DeBERTa等采用的就是相对位置编码。Self-Attention的本质是两个单词信息的内积操作,相对位置编码的思想是对内积的计算方式进行改进,在内积中注入两个单词的相对位置因素
  • 固定式位置编码和可学习式位置编码
    • 这种分类方式,说的是 绝对位置编码 的不同实现方式
    • 固定位置编码,主要是 Transformer论文中提出的正弦和余弦位置编码(Sinusoidal Positional Encoding)方法,使用正弦和余弦函数生成不同频率的编码
    • 可学习式位置编码,没有固定的位置编码公式,通过初始化位置向量让模型根据上下文数据自适应地学习出来,Bert和GPT采用的就是可学习式
  • 绝对位置编码添加的位置不同
    • 绝对位置编码加在 Transformer 的输入端,典型代表是绝对位置编码( Sinusoidal 位置编码和可学习位置编码 )
    • 绝对位置编码乘在 q , k , v q, k, v q,k,v,典型代表是 RoPE 位置编码
    • 相对位置编码加在注意力权重 q T k q^{T}k qTk,典型代表是 ALiBi 位置编码

根据本人面试经历,只要是和Positional Encoding相关的问题,基本都是 Transformer论文中提出的正弦和余弦位置编码,以及目前大模型常用的RoPE,这两个方法。因此,本文主要以这两个方法为例来深入讨论。

预备知识

三角函数求和公式

s i n ( α + β ) = s i n α ∗ C o s β + c o s α ∗ S i n β \rm{sin}(\alpha+\beta) = sin\alpha*Cos\beta + cos\alpha * Sin\beta sin(α+β)=sinαCosβ+cosαSinβ
s i n ( α − β ) = s i n α ∗ C o s β − c o s α ∗ S i n β \rm{sin}(\alpha-\beta) = sin\alpha*Cos\beta - cos\alpha * Sin\beta sin(αβ)=sinαCosβcosαSinβ

c o s ( α + β ) = c o s α ∗ c o s β − s i n α ∗ S i n β \rm{cos}(\alpha+\beta) = cos\alpha*cos\beta - sin\alpha * Sin\beta cos(α+β)=cosαcosβsinαSinβ
c o s ( α − β ) = c o s α ∗ c o s β + s i n α ∗ S i n β \rm{cos}(\alpha-\beta) = cos\alpha*cos\beta + sin\alpha * Sin\beta cos(αβ)=cosαcosβ+sinαSinβ

旋转矩阵

逆时针旋转

在这里插入图片描述
假设向量 a , b \bold{a}, \bold{b} a,b的长度均为1,将 a \bold{a} a逆时针旋转 θ \theta θ角度,变成 b \bold{b} b的过程如下:
a = [ c o s μ , s i n μ \bold{a} = [\rm{cos}\mu, sin\mu a=[cosμ,sinμ]
b = [ c o s ( μ + θ ) , s i n ( μ + θ ) \bold{b} = [\rm{cos}(\mu+\theta), sin(\mu+\theta) b=[cos(μ+θ),sin(μ+θ)]

根据上面的三角函数求和公式可得:
b = [ c o s θ c o s μ − s i n θ s i n μ , s i n μ c o s θ + c o s μ s i n θ \bold{b} = [\rm{cos}\theta cos\mu - sin\theta sin\mu,sin\mu cos\theta + cos\mu sin\theta b=[cosθcosμsinθsinμ,sinμcosθ+cosμsinθ]

这里我们用矩阵乘来简化计算:
b T = [ c o s θ − s i n θ s i n θ c o s θ ] [ c o s μ s i n μ ] \bold{b}^{\rm{T}} = \begin{bmatrix} \rm{cos}\theta & -sin\theta \\ sin\theta & \rm{cos}\theta \end{bmatrix} \begin{bmatrix} \rm{cos}\mu \\ sin\mu \end{bmatrix} bT=[cosθsinθsinθcosθ][cosμsinμ]

因此,逆时针的旋转矩阵为 [ c o s θ − s i n θ s i n θ c o s θ ] \begin{bmatrix} \rm{cos}\theta & -sin\theta \\ sin\theta & \rm{cos}\theta \end{bmatrix} [cosθsinθsinθcosθ]

顺时针旋转

在这里插入图片描述

假设向量 a , b \bold{a}, \bold{b} a,b的长度均为1,将 a \bold{a} a顺时针旋转 θ \theta θ角度,变成 b \bold{b} b的过程如下:
a = [ c o s μ , s i n μ \bold{a} = [\rm{cos}\mu, sin\mu a=[cosμ,sinμ]
b = [ c o s ( μ − θ ) , s i n ( μ − θ ) \bold{b} = [\rm{cos}(\mu-\theta), sin(\mu-\theta) b=[cos(μθ),sin(μθ)]

根据上面的三角函数求和公式可得:
b = [ c o s θ c o s μ + s i n θ s i n μ , s i n μ c o s θ − c o s μ s i n θ \bold{b} = [\rm{cos}\theta cos\mu + sin\theta sin\mu,sin\mu cos\theta - cos\mu sin\theta b=[cosθcosμ+sinθsinμ,sinμcosθcosμsinθ]

这里我们用矩阵乘来简化计算:
b T = [ c o s θ s i n θ − s i n θ c o s θ ] [ c o s μ s i n μ ] \bold{b}^{\rm{T}} = \begin{bmatrix} \rm{cos}\theta & sin\theta \\ -sin\theta & \rm{cos}\theta \end{bmatrix} \begin{bmatrix} \rm{cos}\mu \\ sin\mu \end{bmatrix} bT=[cosθsinθsinθcosθ][cosμsinμ]

因此,顺时针的旋转矩阵为: [ c o s θ s i n θ − s i n θ c o s θ ] \begin{bmatrix} \rm{cos}\theta & sin\theta \\ -sin\theta & \rm{cos}\theta \end{bmatrix} [cosθsinθsinθcosθ]

原始Transformer中的位置编码

论文中的介绍

首先贴上Transformer论文中,对于Positional Encoding部分的全部介绍:

在这里插入图片描述
我真的服了,这么重要的位置编码,论文里就写了这么一点??现在看来,内容虽然少,但是句句都是关键,每一句都是面试官想要考你的点,蚌埠住了!

回到正题,论文里面对Positional Encoding的描述主要有以下几个点:

  • 位置编码的维度和token的embedding的维度一致,所以可以直接add
  • 位置编码的具体实现方式是:sine and cosine functions of different frequencies,也就是同时使用正弦函数和余弦函数来表示每个token的绝对位置
  • sine and cosine functions of different frequencies中,包括两个关键变量,一个是pos,表示 是哪个token,另一个是i,表示token中不同embedding的位置
  • 使用这种正余弦位置编码的方式,可以在计算attention时,很轻松的学习relative positions,也就是相对位置,理由是, P E p o s + k PE_{pos+k} PEpos+k可以表示为 P E p o s PE_{pos} PEpos的线性变换!!(其实就是旋转矩阵)
  • 选择正余弦位置编码方式,也是因为它可以允许模型外推到,比训练期间遇到的序列长度更长的序列长度,这个特性对于扩大模型推理时的长度非常友好!!

具体计算过程

下面,让我们通过一个具体的示例,来理解Transformer论文的正余弦位置编码,到底是怎么计算的?(参考这篇blog)

假设我们的输入如下,第一行是输入文本,第二行tokenization后的tokens,最后是每个token对应的embedding(维度是5):

在这里插入图片描述
首先,对于pos=0的token5(对应text为When)来说,计算它的 位置编码 方式如下:

在这里插入图片描述
可以看到,token的每个维度,都会计算一个位置编码,对于维度位置i为奇数,使用sin函数来计算,对于偶数,则使用cos函数来计算。这和论文中的PE计算公式一致

同理,对于所有输入tokens,分别计算他们的位置编码:

在这里插入图片描述

这里可以感觉出来,越靠前的token计算的位置编码,他们使用的正余弦函数的频率越大,振荡的越快,相反,越往后的tokne,在embedding维度上振荡越慢,大概如下图所示:

在这里插入图片描述

为什么是线性变换?

到这里,相信大家对Transformer论文的正余弦位置编码的计算过程,有了一个清晰的理解。现在来思考论文中的一个点:为什么 P E p o s + k PE_{pos+k} PEpos+k可以表示为 P E p o s PE_{pos} PEpos的线性变换?

大模型常用的旋转位置编码RoPE

基本原理

Llama3中的代码实现

参考资料

  • [1] https://note.mowen.cn/note/detail?noteUuid=Q2_oDhFEqD2pD8Iv4uSzn
  • [2] https://note.mowen.cn/note/detail?noteUuid=waAeRtCgZXLO62f9RhUWa
  • [3] https://www.bilibili.com/video/BV1F1421B7iv/?share_source=copy_web&vd_source=79b1ab42a5b1cccc2807bc14de489fa7
  • [4] https://www.jianshu.com/p/e8be3dbfb4c5
  • [5] https://blog.csdn.net/BIT_Legend/article/details/137042032
  • [6] https://medium.com/@fareedkhandev/understanding-transformers-a-step-by-step-math-example-part-1-a7809015150a

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

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

相关文章

DPDK基础入门(五):报文转发

网络处理模块划分 Packet Input: 接收数据包,将其引入处理流程。Pre-processing: 对数据包进行初步处理,例如基本的检查和标记。Input Classification: 细化数据包的分类,例如基于协议或流进行分流。Ingress Queuing: 将数据包放入队列中进行…

【信息学奥赛题】

目录 一、计算机组成与工作原理 二、计算机信息表示 三、计算机软件系统 四、计算机网络基础 五、多媒体知识 六、数据结构 七、程序语言知识 八、知识性问题 一、计算机组成与工作原理 1.下列不属于冯诺依曼计算机模型的核心思想是(D&#xff…

Spring源码(3)Aware接口、初始化和销毁方法、@Scope、@Primary

1、目标 本文的主要目标是学习Spring源码中Aware接口、初始化和销毁方法、Scope注解、Primary注解的使用 2、Aware接口 Component public class MyBeanAware implements BeanNameAware, ApplicationContextAware {Overridepublic void setBeanName(String name) {System.out…

Linux系统本地化部署Dify并安装Ollama运行llava大语言模型详细教程

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

屏保壁纸 芝麻时钟比屏保壁纸更好看的桌面动态屏保 大气美观

屏保壁纸 芝麻时钟比屏保壁纸更好看的桌面动态屏保 大气美观,今天小编给大家带来一款非常大气美观的桌面时钟屏保,比屏保壁纸更好看,更美观的桌面屏保软件。非常有个性化哦,我们看看这种屏保主题,是不是让你眼前一亮呢…

20240908 每日AI必读资讯

新AI编程工具爆火:手机2分钟创建一个APP! - AI初创公司Replit推出的智能体——Replit Agent。开发环境、编写代码、安装软件包、配置数据库、部署等等,统统自动化! - 操作方式也是极其简单,只需一个提出Prompt的动作…

HBuilderx 安装 compile-node-sass编译工具

在使用HBuilderx工具,利用uni-app框架开发前端过程中,应用 “.scss”扩展名的的样式文件,scss作为css的预编译文件,在实际开发中是需要编译的,所以需要安装插件 compile-node-sass。 本人在CSDN下载插件“compile-node…

2.软件生命周期及流程(包含笔试/面试题)

一、软件生命周期 1.什么是软件的生命周期? 软件生命周期就是软件从开始研发到最终被废弃不用的一整个过程。 二、软件生命周期模型 1.瀑布型生命周期模型(基本不用这个模型) 最早期的模型,流程是从上而下的,如同瀑布流…

【机器人工具箱Robotics Toolbox开发笔记(二)】Matlab中机器人工具箱的下载与安装

Matlab机器人工具箱(Robotics Toolbox)可从Peter Corke教授提供的网站上免费下载。网址为:http://www.petercorke.com/Robotics_Toolbox.html。 图1 网站所提供的机器人工具箱版本 在Downloading the Toolbox栏目中单击here按钮进入下载页面,然后在该页面中填写国家、组织…

基于Python爬虫的淘宝服装数据分析项目

文章目录 一.项目介绍二.爬虫代码代码分析 三. 数据处理四. 数据可视化 一.项目介绍 该项目是基于Python爬虫的淘宝服装数据分析项目,以致于帮助商家了解当前服装市场的需求,制定更加精确的营销策略。首先,需要爬取淘宝中关于服装的大量数据…

JS_函数声明

JS中的方法,多称为函数,函数的声明语法和JAVA中有较大区别 函数说明 函数没有权限控制符不用声明函数的返回值类型,需要返回在函数体中直接return即可,也无需void关键字参数列表中,无需数据类型调用函数时,实参和形参的个数可以不一致声明函数时需要用function关键字函数没有…

STM32F407VET6开发板RT-Thread MSH 串口的适配

相关文章 STM32F407VET6开发板RT-Thread的移植适配 环境 STM32F407VET6 开发板(魔女),http://www.stm32er.com/ Keil MDK5,版本 5.36 串口驱动 RT-Thread 通过适配 串口驱动,可以使用 MSH shell 当前手动搭建的 …

c++基础版

c基础版 Windows环境搭建第一个C程序c程序运行原理注释常亮字面常亮符号常亮 变量数据类型整型实型常量类型确定char类型字符串布尔类型 控制台输入随机数产生枚举定义数组数组便利 指针基础野指针空指针指针运算动态内存分配 结构体结构体默认值结构体数组结构体指针结构体指针…

JavaWeb笔记整理13——Mybatis

目录 Mybatis介绍 删除 预编译SQL SQL注入 新增 更新 查询 数据封装 条件查询 XML映射文件 动态SQL 更新案例 foreach Mybatis介绍 删除 预编译SQL SQL注入 新增 更新 查询 数据封装 条件查询 XML映射文件 动态SQL <if> 更新案例<set> foreach &l…

消息中间件 --Kafka

一、 Kafka 1.kafka介绍 Kafka 是一个分布式流媒体平台,类似于消息队列或企业消息传递系统。 生产者发送消息&#xff0c;多个消费者只能有一个消费者接收到消息 生产者发送消息&#xff0c;多个消费者都可以接收到消息 producer&#xff1a;发布消息的对象称之为主题生产者…

人工智能,语音识别也算一种人工智能。

现在挺晚了&#xff0c;还是没有去睡觉&#xff0c;自己在想什么呢&#xff0c;也不确定。 这是一篇用语音写的文章&#xff0c;先按自己的想法说出来&#xff0c;然后再适当修改&#xff0c;也许就是一个不错的文章。 看来以后就不需要打字了&#xff0c;语音识别度很高&#…

两数之和--力扣1

两数之和 题目思路C代码 题目 思路 根据题目要求&#xff0c;元素不能重复且不需要排序&#xff0c;我们这里使用哈希表unordered_map。注意题目说了只对应一种答案。 所以我们在循环中&#xff0c;使用目标值减去当前循环的nums[i]&#xff0c;得到差值&#xff0c;如果我们…

ICM20948 DMP代码详解(8)

接前一篇文章&#xff1a;ICM20948 DMP代码详解&#xff08;7&#xff09; 上一回讲解了EMP-App中的入口函数main()中重点关注的第2段代码的后一个函数inv_icm20948_register_aux_compass&#xff0c;讲解了其各个参数&#xff0c;本回对于函数代码进行解析。为了便于理解和回顾…

市场独宠大尺寸超微小间距LED显示屏COB智能会议一体机

在当今这个信息化高速发展的时代&#xff0c;大屏幕显示设备已成为企业会议、教育培训、展览展示、商业广告等多个领域不可或缺的重要工具。随着技术的不断进步&#xff0c;市场上涌现出了投影机、液晶一体机、DLP背投、小间距LED、LED会议一体机以及新兴的COB智能会议一体机等…

vulhub Thinkphp5 2-rce远程代码执行漏洞

步骤一&#xff1a; 执行以下命令启动靶场环境并在浏览器访问 cd /vulhub/thinkphp/2-rce #进入漏洞环境所在目录docker-compose up -d #启动靶场docker ps #查看容器信息 步骤二&#xff1a;访问网页 步骤三&#xff1a;?s/Index/index/L/${phpinfo()} 步骤四&#xff1a;?…