# 热门搜索 #
搜索
位置编码发展史:从零开始带你推导神秘的RoPE
4675点击    2024-07-26 09:23

RNN每个step的隐状态都取决于上一个step的输出,这种连续的状态转移方式使得RNN天然带有位置信息。而Transformer仅依靠Attention机制来关注序列中不同token之间的相关性,如果只使用token embedding就无法获得句子中字与字之间的位置信息,也就是说如果没有位置编码,输入“我不爱你”与“不我爱你”的效果是相同的,因此我们要在里面额外引入位置信息。


绝对位置编码


通常所说的大模型的模型结构一般基于Transformer改进而来。Transformer结构如下:



最初的Transformer设计中,绝对位置编码会加到输入中:在输入的第k个向量


中加入位置向量变为,其中只依赖于token位于句子中的编号k。


函数式绝对位置编码


绝对位置编码在进行Attention前使用正余弦函数来表示绝对位置,公式如下:


其中PE表示位置编码,pos表示一句话中token的位置,每个token的位置编码是一个向量,i表示这个向量中每个元素的index,这个向量的奇数位置元素使用余弦值,偶数位置元素使用正弦值,


表示位置编码向量的维度。



这种编码的优点是相邻的位置编码向量很相似,较远的位置编码向量差异很大,说明基于正余弦函数的绝对位置可以表现位置的相关性,而且可以直接计算提高效率。


训练式绝对位置编码


基于万物皆可训练的思想诞生了训练式绝对位置编码,它根据位置信息编码id,再通过Embedding层,学习该位置Embedding参数,比如Bert最大长度为512,编码维度为768,那么就初始化一个512×768的矩阵作为位置向量,让它随着训练过程更新。


从BERT提出后,大部分模型的位置编码都遵循这种方式,但这种位置编码有一个缺陷,就是它不具备外推性能,是指一旦我们在预测时的序列长度超过了训练阶段的长度,它的位置信息就位于模型的盲区,需要重新训练更长的位置编码。


相对位置编码


绝对和相对在概念上理解是很简单的,但它们在Transformer的实现上是完全不一样的。


  • 由于绝对位置编码只关注单个位置信息,因此它的实现通常在输入层,可以通过简单的向量相加融入模型


  • 而相对位置一定是pair对(某两个token之间)的信息,因此它无法直接在输入层实现,通常是通过改变Attention_score的计算方式来实现



比如在LLaMA模型结构中,计算相对位置编码就是在计算Attention_score的同时实现的。而相对位置编码在计算方法上也可以分为训练式相对位置编码与函数式相对位置编码。


训练式相对位置编码


训练式的代表就是Deberta,它的做法是对于第m和第n个位置的token,其相对位置可以表示为:


即两个token之间的相对距离,由最大距离与最小距离做约束(相对位置不能超过最大距离


或小于最小距离),绝对位置向量需要有模型能容纳句子的最大长度(max_len)个向量才能决定,现在的大模型能识别上下文的长度为128k,若用绝对位置向量我们要用128k个向量来代表位置向量,而相对位置向量只需个位置向量来表示即可。


在计算两个token之间的attention值时,假设两个token的向量表示分别为


和,根据上式得到它们的距离为,然后学习得到它们的相对距离的位置向量为和,就可以计算它们的attention_score:


这样一来,只需要有限个位置编码,就可以表达出任意长度的相对位置(因为进行了截断),不管是选择可训练式的还是三角函数式的,都可以达到处理任意长度文本的需求。这就是最基础的训练式相对位置编码方式,本质上是学习相对位置的Embedding,再在Attention计算时将位置信息融入其中。


函数式相对位置编码


函数式相对位置编码,不再需要额外的训练向量,它的本质在于通过给原始的


向量经过一系列变换来表示其相对位置,我从简单二维形式推导至高维形式。


核心想法与理论基础是:






  • 绝对编码是指:在计算中考虑了token在句子中的绝对位置
  • 相对编码是指:两个向量内积计算只依赖于向量所处句子中的相对位置m-n


与此同时,就巧妙地在QK计算过程中将绝对位置与相对位置融合到了一起:




既然向量拆分了,那我们就可以采用分块矩阵来进行变换,每个块只关注两个分量的信息,且每个块的幅角也可以不同。


因为采用矩阵相乘的方式来实现RoPE会浪费很多显存,因此在实际计算中采用逐位相乘的方式来实现



至此,整个位置编码的发展过程与旋转编码的推导介绍完了。技术发展重要的原因就是因为当前技术解决不了目前的问题,希望大家在学习过程中可以带着“这个新技术解决了什么问题”的思维模式去学习


文章来自于微信公众号“AI有温度”,作者 “安泰Rolling”


AITNT资源拓展
根据文章内容,系统为您匹配了更有价值的资源信息。内容由AI生成,仅供参考
1
RAG

【开源免费】graphrag是微软推出的RAG项目,与传统的通过 RAG 方法使用向量相似性作为搜索技术不同,GraphRAG是使用知识图谱在推理复杂信息时大幅提高问答性能。

项目地址:https://github.com/microsoft/graphrag

【开源免费】Dify是最早一批实现RAG,Agent,模型管理等一站式AI开发的工具平台,并且项目方一直持续维护。其中在任务编排方面相对领先对手,可以帮助研发实现像字节扣子那样的功能。

项目地址:https://github.com/langgenius/dify


【开源免费】RAGFlow是和Dify类似的开源项目,该项目在大文件解析方面做的更出色,拓展编排方面相对弱一些。

项目地址:https://github.com/infiniflow/ragflow/tree/main


【开源免费】phidata是一个可以实现将数据转化成向量存储,并通过AI实现RAG功能的项目

项目地址:https://github.com/phidatahq/phidata


【开源免费】TaskingAI 是一个提供RAG,Agent,大模型管理等AI项目开发的工具平台,比LangChain更强大的中间件AI平台工具。

项目地址:https://github.com/TaskingAI/TaskingAI