首页 > 其他分享 >【笔记】LLM位置编码之标准位置编码

【笔记】LLM位置编码之标准位置编码

时间:2024-10-25 20:16:09浏览次数:9  
标签:编码 cos frac 位置 pos 2i LLM PE sin

标准位置编码

起源

由于原始的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(10000d2i​pos+k​)=sin(10000d2i​pos​+10000d2i​k​) 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(10000d2i​pos+k​)=cos(10000d2i​pos​+10000d2i​k​)根据三角函数的和角公式:
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(10000d2i​pos​)cos(10000d2i​k​)+cos(10000d2i​pos​)sin(10000d2i​k​)

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(10000d2i​pos​)cos(10000d2i​k​)−sin(10000d2i​pos​)sin(10000d2i​k​)线性函数的形式
可以看到 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(10000d2i​k​) 或 cos ⁡ ( k 1000 0 2 i d ) \cos\left(\frac{k}{10000^{\frac{2i}{d}}}\right) cos(10000d2i​k​) 的线性组合。由于 sin ⁡ ( k 1000 0 2 i d ) \sin\left(\frac{k}{10000^{\frac{2i}{d}}}\right) sin(10000d2i​k​) 和 cos ⁡ ( k 1000 0 2 i d ) \cos\left(\frac{k}{10000^{\frac{2i}{d}}}\right) cos(10000d2i​k​) 是固定值,所以我们可以将它们视为常数,从而使得整个表达式变成了 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−1​PE(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(10000d2i​pos​)sin(10000d2i​pos+k​)+cos(10000d2i​pos​)cos(10000d2i​pos+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−1​cos(10000d2i​pos+k​−10000d2i​pos​)=i=0∑d/2−1​cos(10000d2i​k​)

结论

  • 当 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余弦函数组合,通过调整三角函数的频率,可以实现这种低位到高位的变化,这样就能把位置信息表示出来。

缺点

  • 位置编码是固定的,无法根据具体任务进行调整。
  • 固定的位置编码对序列长度有限制。在处理长序列时,正弦和余弦函数的频率可能不足以捕捉所有的位置信息,导致信息丢失。
  • 位置编码在训练阶段是静态的。这意味着在训练时确定的位置编码不适用于后续推理时的输入,尤其是推理序列长度大于训练序列长度。

标签:编码,cos,frac,位置,pos,2i,LLM,PE,sin
From: https://blog.csdn.net/m0_53162279/article/details/143241896

相关文章

  • FunAudioLLM/SenseVoice
    Skiptocontent NavigationMenu Product Solutions Resources OpenSource Enterprise Pricing  SigninSignup  FunAudioLLM/SenseVoicePublicNotificationsFork 292 Star 3.2k CodeIssues64Pullr......
  • vue-cli 跳转到页面指定位置
    原文关注公众号,后台里留言可进行提问,可在后台留言向作者提问解答问题!https://mp.weixin.qq.com/s?__biz=Mzg3NTAzMzAxNA==&mid=2247484254&idx=1&sn=361bbb2113be3eeda3802f0a805c5705&chksm=cec6fb87f9b1729174e3ae66bf9693207386256c964499c098fb8a6cc14b4ba266bc271073a3&tok......
  • 实战篇:(二十一)Java 开发指南:避免 18个常见错误,提升你的编码效率
    实战篇:(二十一)Java开发指南:避免18个常见错误,提升你的编码效率Java作为一门成熟的编程语言,拥有丰富的生态系统与广泛的应用。然而,即使是经验丰富的开发者,也时常会在日常开发中犯一些常见的错误。这些错误不仅会影响代码的可读性,还可能造成性能问题甚至难以调试的Bug。本......
  • 1024福利又来了,告诉你一个小秘密!树莓派跑LLM难上手?也许你可以试试Intel哪吒开发板
    # 1024程序员节|征文活动#前言大型语言模型(LLM)通过其卓越的文本理解与生成能力,为机器智能带来了革命性的进步。然而,这些模型的运行通常需要消耗大量的计算资源,因此它们主要部署在性能强大的服务器上。随着技术的发展和边缘计算的兴起,现在有潜力在更小巧、便携的设备上部......
  • 高德地图怎么添加公司位置信息?
    随着互联网的快速发展,高德地图也逐渐成为了我们日常出行的必备工具。无论是外出游玩,还是上班通勤,都需要依靠高德地图去规划路线,再导航前往目的地。而对于企业来说,将公司位置添加到高德地图上尤为重要。因为这样不仅可以方便客户和求职者轻松找到公司位置,提高到访便利性,还能增强......
  • 开源模型应用落地-Qwen2.5-7B-Instruct与vllm实现离线推理-CPU版本
    一、前言   离线推理能够在模型训练完成后,特别是在处理大规模数据时,利用预先准备好的输入数据进行批量推理,从而显著提高计算效率和响应速度。通过离线推理,可以在不依赖实时计算的情况下,快速生成预测结果,从而优化决策流程和提升用户体验。此外,离线推理还可以降低云计算成本......
  • EventTranscript.db占用空间太大,文件能否移动到其他位置?
    在大多数情况下,EventTranscript.db 文件可以被移动到其他位置(不建议移动、删除),这样做可能会对系统日志记录功能产生影响:日志记录功能:移动 EventTranscript.db 文件可能会导致系统日志记录工具无法正常工作。系统完整性:在操作系统中,日志文件的位置是系统配置的一部分,移动......
  • 前端摸小子,教你减少无意义的编码
     在高效摸鱼的同时,我一直在思考:有没有办法用几个简单的单词缩写,就能快速输出想要的代码呢?    答案是肯定的!接下来,我将向大家介绍前端程序员必备的两大摸鱼小技巧:   一、vscode自定义代码片段位置step1按下Ctrl+Shift+P(Mac上是Cmd+Shift+P),输入"snippet......
  • LLM速览篇【61-90】
    这些论文展示了大型语言模型在提升任务性能、改善人机交互、辅助复杂决策以及优化各类应用场景中的巨大潜力,表明LLM在多个领域中的应用发展迅速,并为解决现实世界问题提供了强大的工具。LLM相关研究论文总结这些研究论文探索了大型语言模型(LLM)在多个领域中的应用与发展。......
  • 在Windows系统中,打印机打印的痕迹通常会保存在以下几个文件夹或位置:
    在Windows系统中,打印机打印的痕迹通常会保存在以下几个文件夹或位置:打印队列:路径:C:\Windows\System32\spool\PRINTERS此文件夹存储所有待打印的文档的临时文件。需要管理员权限才能访问。打印日志:Windows的事件查看器中可以找到打印事件的日志。路径:控制面板 > 管......