当前位置: 首页 > ds >正文

Transformer 位置编码对比

Transformer 位置编码(以原始正弦余弦位置编码为代表)和旋转位置编码(RoPE)是两种常用的序列位置信息编码方式,核心差异体现在原理、相对位置建模能力、长度扩展性等方面,具体区别如下:

1. 原理不同

  • 原始 Transformer 位置编码(正弦余弦)

    直接通过正弦和余弦函数生成绝对位置编码,公式为:

    对于序列中位置为iii的 token,其位置编码的第kkk维(kkk为偶数时)为PE(i,k)=sin⁡(i/100002k/dmodel)\text{PE}(i, k) = \sin(i / 10000^{2k/d_{\text{model}}})PE(i,k)=sin(i/100002k/dmodel);第kkk维(kkk为奇数时)为PE(i,k)=cos⁡(i/100002k/dmodel)\text{PE}(i, k) = \cos(i / 10000^{2k/d_{\text{model}}})PE(i,k)=cos(i/100002k/dmodel),其中dmodeld_{\text{model}}dmodel是模型维度。

    最终将生成的位置编码与输入的词向量直接相加,作为 Transformer 的输入。

  • 旋转位置编码(RoPE)

    通过旋转矩阵动态编码位置信息,核心是将位置嵌入到 query 和 key 向量中。对于位置为iii的 token,其 query/key 向量会被乘以一个与位置iii相关的旋转矩阵,使得向量 “旋转” 一定角度(角度随位置iii增大而增大)。

    旋转矩阵的参数由位置iii和维度kkk共同决定,最终通过 query 与 key 的点积计算,让注意力权重自然体现相对位置关系(而非直接与词向量相加)。

2. 相对位置建模能力不同

  • 原始位置编码

    设计初衷是通过正弦余弦的周期性捕捉相对位置(利用sin⁡(a+b)\sin(a+b)sin(a+b)cos⁡(a+b)\cos(a+b)cos(a+b)的三角恒等式),但本质上是绝对位置编码

    实际中,其对相对位置的表达能力有限:当序列过长时,不同绝对位置的正弦余弦值可能非常接近(如位置 1000 和 1001 的编码差异很小),导致模型难以区分远距离的相对位置。

  • RoPE

    天然建模相对位置:通过旋转矩阵的性质,query(位置iii)与 key(位置jjj)的点积结果**仅依赖于相对位置**** **,与绝对位置无关。

    这种机制让模型对相对位置的敏感程度更高,尤其在长序列中,对 “距离ddd的两个 token” 的建模一致性更好(如距离 5 的两个 token,无论在序列的开头还是中间,其注意力计算方式一致)。

3. 长度扩展性不同

  • 原始位置编码

    位置编码是预定义的(依赖训练时的最大序列长度)。若测试时序列长度超过训练时的最大长度(如训练用 512,测试用 1024),超出部分的位置编码会使用未训练过的正弦余弦值,可能导致模型性能下降,长度扩展性差

  • RoPE

    旋转矩阵可通过位置iii动态计算(无需预定义),无论序列长度是多少(即使远超训练时的最大长度),都能生成对应的位置编码,天然支持任意长度的序列,长度扩展性显著优于原始位置编码,更适合长文本任务(如文档级理解、长对话)。

4. 计算效率不同

  • 原始位置编码

    预计算后可直接复用,与词向量的加法操作耗时极短,计算效率高

  • RoPE

    需对每个 query 和 key 向量应用旋转矩阵(可通过复数运算优化,将旋转转化为复数乘法),计算量略高于原始位置编码,但优化后(如利用 GPU 并行计算)效率仍可接受,且收益(更好的长序列性能)远超额外开销。

总结

维度原始 Transformer 位置编码(正弦余弦)旋转位置编码(RoPE)
原理正弦余弦函数生成,与词向量相加旋转矩阵编码,融入 query/key 向量
相对位置建模弱(依赖三角恒等式,远距离区分差)强(点积仅依赖相对位置)
长度扩展性差(依赖预定义最大长度)好(支持任意长度序列)
计算效率高(仅加法)中(需旋转矩阵运算,可优化)
典型应用BERT、GPT-1 等早期模型LLaMA、ChatGLM 等现代大语言模型
http://www.xdnf.cn/news/16307.html

相关文章:

  • pytorch-geometric包(torch_scatter、torch_sparse、torch_cluster)
  • 【性能测试】Jmeter+Grafana+InfluxDB+Prometheus Windows安装部署教程
  • 保障工业核心命脉:深度解读工业交换机QoS的“智能流量治理”之道
  • LeetCode 刷题【12. 整数转罗马数字】
  • Spring Bean生命周期七步曲:定义、实例化、初始化、使用、销毁
  • Android Studio历史版本快速下载(二次修改记录)
  • 面试150 搜索二维矩阵
  • Android集成Google Map
  • 黑马头条项目详解
  • springboot项目如何写出优雅的service?
  • AI时代,我的编程工作搭子
  • TreeMap一致性哈希环设计与实现 —— 高可用的数据分布引擎
  • The Missing Semester of Your CS Education 学习笔记以及一些拓展知识(六)
  • 解决http的web服务中与https服务交互的问题
  • RuoYi-Vue 项目 Docker 全流程部署实战教程
  • PS一键图片智能添加噪点脚本 GrainLab for Photoshop安装与使用介绍
  • 5种最佳方法将iPhone语音备忘录传输到Mac
  • esp32 挂载mpu6050实现加速度计
  • Apache POI 实战应用:企业级文档处理解决方案
  • 编写程序,打印图案,要求该图案的行数由用户输入
  • Hadoop磁盘I/O瓶颈的监控与优化:从iostat指标到JBOD vs RAID的深度解析
  • 海思平台移植 CAN 通信全攻略:从硬件到应用
  • 独家|百度副总裁尚国斌即将离职,此前统筹百度地图;行业搜索及智能体业务总经理谢天转岗IDG
  • 最新免费使用Claude Code指南(Windows macOS/Linux)
  • 【Spring Cloud Gateway 实战系列】终极篇:演进方向与未来架构
  • Visual Studio 2010-.Net Framework 4.0-DevExpress安装
  • ADS数据流实现隐藏文件
  • 【AJAX】XMLHttpRequest、Promise 与 axios的关系
  • 动手学深度学习2.0-李沐Pytorch版
  • Windows 10 停服:个人与企业的 “系统选择题”