【笔记】LLM位置编码之标准位置编码
标准位置编码
起源
由于原始的transformer模型不包含递归和卷积,为了使模型利用序列的顺序,原文在input embeddings 上加入了“位置编码”,位置编码的维度和input embeddings的维度 d m o d e l d_{model} dmodel一样大,所以两者可以相加。加入位置编码的位置如下图所示:
 
原理
使用不同频率的正弦和余弦函数:
 
 其中 p o s pos pos是token在序列中的位置, i i i是维度,也就是说,位置编码的每一个维度对应于一个正弦波,波长从 2 π 2\pi 2π到 10000 10000 10000  × 2 π \times 2\pi ×2π形成几何级数。偶数用 s i n sin sin,单数用 c o s cos cos。
 (下图展示位置编码的细节,来源在这)
 
证明:对于任何固定的偏移量 k k k, P E p o s + k PE_{pos+k} PEpos+k可以表示为 P E p o s PE_{pos} PEpos的线性函数。
 P E ( p o s + k , 2 i ) = sin  ( p o s + k 1000 0 2 i d ) = sin  ( p o s 1000 0 2 i d + k 1000 0 2 i d ) PE(pos+k, 2i) = \sin\left(\frac{pos+k}{10000^{\frac{2i}{d}}}\right) = \sin\left(\frac{pos}{10000^{\frac{2i}{d}}} + \frac{k}{10000^{\frac{2i}{d}}}\right) PE(pos+k,2i)=sin(10000d2ipos+k)=sin(10000d2ipos+10000d2ik) P E ( p o s + k , 2 i + 1 ) = cos  ( p o s + k 1000 0 2 i d ) = cos  ( p o s 1000 0 2 i d + k 1000 0 2 i d ) PE(pos+k, 2i + 1) = \cos\left(\frac{pos+k}{10000^{\frac{2i}{d}}}\right) = \cos\left(\frac{pos}{10000^{\frac{2i}{d}}} + \frac{k}{10000^{\frac{2i}{d}}}\right) PE(pos+k,2i+1)=cos(10000d2ipos+k)=cos(10000d2ipos+10000d2ik)根据三角函数的和角公式:
  sin  ( a + b ) = sin  a cos  b + cos  a sin  b \sin(a + b) = \sin a \cos b + \cos a \sin b sin(a+b)=sinacosb+cosasinb cos  ( a + b ) = cos  a cos  b − sin  a sin  b \cos(a + b) = \cos a \cos b - \sin a \sin b cos(a+b)=cosacosb−sinasinb因此可以得到:
  P E ( p o s + k , 2 i ) = sin  ( p o s 1000 0 2 i d ) cos  ( k 1000 0 2 i d ) + cos  ( p o s 1000 0 2 i d ) sin  ( k 1000 0 2 i d ) PE(pos+k, 2i) = \sin\left(\frac{pos}{10000^{\frac{2i}{d}}}\right) \cos\left(\frac{k}{10000^{\frac{2i}{d}}}\right) + \cos\left(\frac{pos}{10000^{\frac{2i}{d}}}\right) \sin\left(\frac{k}{10000^{\frac{2i}{d}}}\right) PE(pos+k,2i)=sin(10000d2ipos)cos(10000d2ik)+cos(10000d2ipos)sin(10000d2ik)
 P E ( p o s + k , 2 i + 1 ) = cos  ( p o s 1000 0 2 i d ) cos  ( k 1000 0 2 i d ) − sin  ( p o s 1000 0 2 i d ) sin  ( k 1000 0 2 i d ) PE(pos+k, 2i + 1) = \cos\left(\frac{pos}{10000^{\frac{2i}{d}}}\right) \cos\left(\frac{k}{10000^{\frac{2i}{d}}}\right) - \sin\left(\frac{pos}{10000^{\frac{2i}{d}}}\right) \sin\left(\frac{k}{10000^{\frac{2i}{d}}}\right) PE(pos+k,2i+1)=cos(10000d2ipos)cos(10000d2ik)−sin(10000d2ipos)sin(10000d2ik)线性函数的形式
 可以看到  P E ( p o s + k , 2 i ) PE(pos+k, 2i) PE(pos+k,2i) 和  P E ( p o s + k , 2 i + 1 ) PE(pos+k, 2i + 1) PE(pos+k,2i+1) 的结果都是  P E ( p o s ) PE(pos) PE(pos) 和  sin  ( k 1000 0 2 i d ) \sin\left(\frac{k}{10000^{\frac{2i}{d}}}\right) sin(10000d2ik) 或  cos  ( k 1000 0 2 i d ) \cos\left(\frac{k}{10000^{\frac{2i}{d}}}\right) cos(10000d2ik) 的线性组合。由于  sin  ( k 1000 0 2 i d ) \sin\left(\frac{k}{10000^{\frac{2i}{d}}}\right) sin(10000d2ik) 和  cos  ( k 1000 0 2 i d ) \cos\left(\frac{k}{10000^{\frac{2i}{d}}}\right) cos(10000d2ik) 是固定值,所以我们可以将它们视为常数,从而使得整个表达式变成了  P E ( p o s ) PE(pos) PE(pos) 的线性函数。
得出结论:
 对于任何固定的偏移量  k k k,都有:
  P E p o s + k = f ( P E p o s ) PE_{pos+k} = f(PE_{pos}) PEpos+k=f(PEpos)其中  f f f 是一个线性函数。这证明了在 Transformer 的位置编码中,相对位置  P E p o s + k PE_{pos+k} PEpos+k 可以表示为  P E p o s PE_{pos} PEpos 的线性函数。
计算 P E p o s + k 与 P E p o s PE_{pos+k} 与PE_{pos} PEpos+k与PEpos的内积
 Dot ( P E p o s , P E p o s + k ) = ∑ i = 0 d / 2 − 1 P E ( p o s , 2 i ) ⋅ P E ( p o s + k , 2 i ) + P E ( p o s , 2 i + 1 ) ⋅ P E ( p o s + k , 2 i + 1 ) \text{Dot}(PE_{pos}, PE_{pos+k}) = \sum_{i=0}^{d/2-1} PE(pos, 2i) \cdot PE(pos+k, 2i) + PE(pos, 2i + 1) \cdot PE(pos+k, 2i + 1) Dot(PEpos,PEpos+k)=i=0∑d/2−1PE(pos,2i)⋅PE(pos+k,2i)+PE(pos,2i+1)⋅PE(pos+k,2i+1)
 将内积展开为:
  Dot ( P E p o s , P E p o s + k ) = ∑ i = 0 d / 2 − 1 [ sin  ( p o s 1000 0 2 i d ) sin  ( p o s + k 1000 0 2 i d ) + cos  ( p o s 1000 0 2 i d ) cos  ( p o s + k 1000 0 2 i d ) ] \text{Dot}(PE_{pos}, PE_{pos+k}) = \sum_{i=0}^{d/2-1} \left[ \sin\left(\frac{pos}{10000^{\frac{2i}{d}}}\right) \sin\left(\frac{pos+k}{10000^{\frac{2i}{d}}}\right) + \cos\left(\frac{pos}{10000^{\frac{2i}{d}}}\right) \cos\left(\frac{pos+k}{10000^{\frac{2i}{d}}}\right) \right] Dot(PEpos,PEpos+k)=i=0∑d/2−1[sin(10000d2ipos)sin(10000d2ipos+k)+cos(10000d2ipos)cos(10000d2ipos+k)]
 根据 sin  ( a ) sin  ( b ) + cos  ( a ) cos  ( b ) = cos  ( a − b ) \sin(a) \sin(b) + \cos(a) \cos(b) = \cos(a - b) sin(a)sin(b)+cos(a)cos(b)=cos(a−b)可得:
  Dot ( P E p o s , P E p o s + k ) = ∑ i = 0 d / 2 − 1 cos  ( p o s + k 1000 0 2 i d − p o s 1000 0 2 i d ) = ∑ i = 0 d / 2 − 1 cos  ( k 1000 0 2 i d ) \text{Dot}(PE_{pos}, PE_{pos+k}) = \sum_{i=0}^{d/2-1} \cos\left(\frac{pos+k}{10000^{\frac{2i}{d}}} - \frac{pos}{10000^{\frac{2i}{d}}}\right)= \sum_{i=0}^{d/2-1} \cos\left(\frac{k}{10000^{\frac{2i}{d}}}\right) Dot(PEpos,PEpos+k)=i=0∑d/2−1cos(10000d2ipos+k−10000d2ipos)=i=0∑d/2−1cos(10000d2ik)
结论
- 当 k k k 较小时,内积值较大,表示 P E p o s + k PE_{pos+k} PEpos+k 和 P E p o s PE_{pos} PEpos 的相似度较高,相对位置较近。
- 当 k k k 较大时,内积值减小,表示相似度降低,相对位置较远。
- c o s ( k ) = c o s ( − k ) cos(k)=cos(-k) cos(k)=cos(−k),因此该方法无法区别方向。
通俗理解
参考文章
 最简单直观的加入位置信息的方式就是使用1,2,3,4,…直接对句子进行位置编码(one-hot)。用二进制转化举个例子:
 
 上表中维度0,维度1,维度2,维度3拼成的数字就是该位置对应的二进制表示。可以看到每个维度(每一列)其实都是有周期的,并且周期是不同的。具体来说,每个比特位的变化率都是不一样的,越低位的变化越快(越往右边走,变化频率越快),红色位置0和1每个数字会变化一次,而黄色位,每8个数字才会变化一次。这样就能够说明使用多个周期不同的周期函数组成的多维度编码和递增序列编码其实是可以等价的。这也回答了为什么周期函数能够引入位置信息。
同样的道理,不同频率的sin正弦函数和cos余弦函数组合,通过调整三角函数的频率,可以实现这种低位到高位的变化,这样就能把位置信息表示出来。
缺点
- 位置编码是固定的,无法根据具体任务进行调整。
- 固定的位置编码对序列长度有限制。在处理长序列时,正弦和余弦函数的频率可能不足以捕捉所有的位置信息,导致信息丢失。
- 位置编码在训练阶段是静态的。这意味着在训练时确定的位置编码不适用于后续推理时的输入,尤其是推理序列长度大于训练序列长度。
相关文章:
 
【笔记】LLM位置编码之标准位置编码
标准位置编码 起源原理证明:对于任何固定的偏移量 k k k, P E p o s k PE_{posk} PEposk可以表示为 P E p o s PE_{pos} PEpos的线性函数。计算 P E p o s k 与 P E p o s PE_{posk} 与PE_{pos} PEposk与PEpos的内积结论 通俗理解缺点 起源 由…...
环 境 配 置
01 Ubuntu18.04中QT环境 1. 下载安装包 官网 http://download.qt.io/archive/qt/5.9/5.9.1/qt-opensource-linux-x64-5.9.1.run 国内镜像服务器 https://mirrors.tuna.tsinghua.edu.cn/qt/archive/qt/5.9/5.9.1/qt-opensource-linux-x64-5.9.1.run QQ群 ...... 2. 安装 把下载…...
理解dbt artifacts及其实际应用
dbt是数据分析领域的一种变革性工具,它使数据专业人员能够对仓库中的数据进行转换和建模。它的强大功能之一是生成dbt artifacts:dbt运行的结构化输出,提供对dbt项目及其操作的深入了解。 dbt 构件介绍 dbt构件是每次dbt运行时生成的JSON文…...
100种算法【Python版】第15篇——KMP算法
本文目录 1 算法原理1.1 部分匹配表2 实现步骤3 示例说明4 python实例5 算法应用领域1 算法原理 KMP(Knuth-Morris-Pratt)算法是一种用于高效字符串匹配的算法。它通过预处理模式字符串,构建一个部分匹配表(前缀函数),以避免重复比较,从而提高匹配效率。KMP 算法通过利…...
 
【软件工程】软件项目管理/工程项目管理复习资料
第一章 软件项目管理概述习题 一. 填空题 实现项目目标的制约因素有( 项目范围 )、( 成本 )、( 进度计划 )、( 客户满意度 )等。 项目管理( 启动过程组 )、…...
 
C语言基础题(大合集2)
1. 时间转换 给定秒数 --> 输出秒数 转化成 时/分/秒 //时间转换 //给定秒数 --> 转换成 小时/分/秒 int main() {//输入int seconds 0;int h 0;//小时int m 0;//分钟int s 0;//秒scanf("%d", &seconds);//计算h seconds / 60 / 60;m seconds / 60…...
 
Stable Diffusion视频插件Ebsynth Utility使用方法
在Stable Diffusion中安装完Ebsynth Utility后,就可以开始试用了。 启动Stable Diffusion后,出面画面: 1、步骤1:视频分帧及生成蒙板帧 填入工程目录,选择上传所用的视频文件:注意对目录命名的要求-不能有…...
Ubuntu忘记密码
如果你忘记了WSL(Windows Subsystem for Linux)中Linux发行版的密码,可以按照以下步骤来重置密码: 一、对于Ubuntu或Debian等基于Debian的发行版(以Ubuntu为例) 关闭WSL实例(如果正在运行&…...
使用Python实现深度学习模型:智能极端天气事件预测
极端天气事件,如暴雨、台风和热浪,往往会对人类社会和自然环境产生深远的影响。近年来,气象数据和深度学习技术的发展使得智能预测极端天气成为可能。通过训练深度学习模型,我们可以建立一个自动化的预测系统,从大量的历史气象数据中学习并预测未来的极端天气事件。这篇文…...
cJson函数解析
获取json版本号 CJSON_PUBLIC(const char*) cJSON_Version(void);设置自定义内存分配函数 CJSON_PUBLIC(void) cJSON_InitHooks(cJSON_Hooks* hooks);解析 JSON 字符串并将其转换为 cJSON 数据结构 CJSON_PUBLIC(cJSON *) cJSON_Parse(const char *value);用于解析指定长度的…...
 
基于SSM+微信小程序的跑腿平台管理系统(跑腿3)
👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 基于SSM微信小程序的跑腿平台管理系统实现了管理员、接单员及用户三个角色。 1、管理员实现了首页、个人中心、管理员管理、基础数据管理、接单详情、跑腿任务管理等。 2、接单员实现了…...
 
mit6824-02-Lab1:MapReduce分布式实现
文章目录 写在前面总体思路分析代码实现参考链接 写在前面 具体上次写6824的第一篇文章已经过去了快一个月,上次学习了MapReduce论文相关理论后一直没有继续写代码实现,自己一边要搞论文没有整块时间实现,这两天抽写了相关代码,算…...
 
【NOIP普及组】 装箱问题
【NOIP普及组】 装箱问题 💐The Begin💐点点关注,收藏不迷路💐 有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0&…...
Flutter主题最佳实践
Styling your Flutter app not only makes it visually appealing but also enhances the user experience. Flutter offers a robust theming system that helps you maintain consistency and customize your app’s look and feel. 设计 Flutter 应用程序的风格不仅能使其在…...
 
计算机网络:网络层 —— IPv4 数据报的首部格式
文章目录 IPv4数据报的首部格式IPv4数据报分片生存时间 TTL字段协议字段首部检验和字段 IPv4数据报的首部格式 IPv4 数据报的首部格式及其内容是实现 IPv4 协议各种功能的基础。 在 TCP/IP 标准中,各种数据格式常常以32比特(即4字节)为单位来描述 固定部分&#x…...
MySQL 之 索引
索引 概述 是帮助MySQL高效获取数据的数据结构,在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在数据结构上实现高效查找算法,这种…...
 
手动探针台的用途及组成部分
探针台系统分为手动探针台与自动探针台,以下我们主要分析手动探针台。 探针台用途: 手动探针台又称探针测试台主要用途是为半导体芯片的电参数测试提供一个测试平台,探针台可吸附多种规格芯片,并提供多个可调测试针以及探针座&am…...
❤️算法笔记❤️-(每日一刷-5、最长回文串)
文章目录 题目思路解答 题目 给你一个字符串 s,找到 s 中最长的 回文 子串。 示例 1: 输入:s "babad" 输出:"bab" 解释:"aba" 同样是符合题意的答案。示例 2: 输入…...
nginx 路径匹配,关于“/“对规则的影响
1、基本规则 假如后端实际地址为: http://127.0.0.1:8080/api/user/getById?id123 则: 1)通过nginx转发,使用http://127.0.0.1/api/user/getById?id123访问 server {listen 80;server_name 127.0.0.1;location /api…...
安全知识见闻-网络安全热门证书
一、OSCP(Offensive Security Certified Professional) 1. 证书介绍 2.考点 3.部分考试要求 4.练习方法 二、OSEP(Offensive Security Exploit Developer) 1.证书介绍 2.考点 3.练习方法 三、CISSP(Certified lnformation Systems Security Professional&a…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
 
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
 
解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
 
【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
 
家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
 
什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
 
项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...
 
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...
 
【JVM】Java虚拟机(二)——垃圾回收
目录 一、如何判断对象可以回收 (一)引用计数法 (二)可达性分析算法 二、垃圾回收算法 (一)标记清除 (二)标记整理 (三)复制 (四ÿ…...
 
c++第七天 继承与派生2
这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分:派生类构造函数与析构函数 当创建一个派生类对象时,基类成员是如何初始化的? 1.当派生类对象创建的时候,基类成员的初始化顺序 …...
