【位置编码】【Positional Encoding】直观理解位置编码!把位置编码想象成秒针!

2024-08-30 19:36

本文主要是介绍【位置编码】【Positional Encoding】直观理解位置编码!把位置编码想象成秒针!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【位置编码】【Positional Encoding】直观理解位置编码!把位置编码想象成秒针!

你们有没有好奇过为啥位置编码非得长成这样:
P E ( p o s , 2 i ) = s i n ( p o s 1000 0 2 i / d m o d e l ) P E ( p o s , 2 i + 1 ) = c o s ( p o s 1000 0 2 i / d m o d e l ) PE(pos,2i)=sin(\frac{pos}{10000^{2i/d_{model}}})\\ PE(pos,2i+1)=cos(\frac{pos}{10000^{2i/d_{model}}}) PE(pos,2i)=sin(100002i/dmodelpos)PE(pos,2i+1)=cos(100002i/dmodelpos)

  • 为什么位置编码一定要分为奇数和偶数分别考虑?
  • 为什么又要有sin又要有cos?

这里提供一个直观的理解方案,位置编码想象成秒针可以帮助你轻松理解为什么要如此编码。

【转载注明出处】

为了解释位置编码,我们先考虑下面的场景:

不一样的秒表

假设我们手上有三个不一样的“秒表”,这些秒表长这样:
特殊的秒表

这三个秒表都只有一个指针,不同的是第一个秒表的指针10s转一圈,第二个秒表的指针100s转一圈,第三个秒表1000s转一圈

现在,考虑一个问题:
Q: 如果我在 0 0 0秒时同时按下这3个秒表,问在 t t t秒时这三个表的指针转过的角度 ϕ 1 , ϕ 2 , ϕ 3 \phi_1,\phi_2,\phi_3 ϕ1,ϕ2,ϕ3分别是多少?

这个答案很简单!
A: 我们可以知道,第一个表每秒钟转 2 π / 10 2\pi/10 2π/10,第二个表每秒钟转 2 π / 100 2\pi/100 2π/100,第三个表每秒钟转 2 π / 1000 2\pi/1000 2π/1000,因此:
ϕ 1 = t × 2 π / 10 , ϕ 2 = t × 2 π / 100 , ϕ 3 = t × 2 π / 1000 \phi_1=t\times2\pi/10,\phi_2=t\times2\pi/100,\phi_3=t\times2\pi/1000 ϕ1=t×2π/10,ϕ2=t×2π/100,ϕ3=t×2π/1000

从时间到角度

现在,其实我们可以把每个时间 t t t对应成一个坐标:
t → ( ϕ 1 , ϕ 2 , ϕ 3 ) t\rightarrow(\phi_1,\phi_2,\phi_3) t(ϕ1,ϕ2,ϕ3)同样的这样的一个坐标也能唯一的对应一个时间!(如果第三个秒表没有转完完整一圈的话)

从角度到坐标

进一步,我们还可以用三角函数来表达一个角度 ϕ \phi ϕ,比如在0到2 π \pi π的范围内 ( s i n ( ϕ ) , c o s ( ϕ ) ) (sin(\phi),cos(\phi)) (sin(ϕ),cos(ϕ))这个坐标可以唯一确定 ϕ \phi ϕ。这个坐标也就是指针的端点的平面坐标(指针长度为1的话):
在这里插入图片描述
到目前为止我们就得到了这样的一个变化过程:
t → ( ϕ 1 , ϕ 2 , ϕ 3 ) → ( s i n ( ϕ 1 ) , c o s ( ϕ 1 ) , s i n ( ϕ 2 ) , c o s ( ϕ 2 ) , s i n ( ϕ 3 ) , c o s ( ϕ 3 ) ) t\rightarrow(\phi_1,\phi_2,\phi_3)\\\rightarrow(sin(\phi_1),cos(\phi_1),sin(\phi_2),cos(\phi_2),sin(\phi_3),cos(\phi_3)) t(ϕ1,ϕ2,ϕ3)(sin(ϕ1),cos(ϕ1),sin(ϕ2),cos(ϕ2),sin(ϕ3),cos(ϕ3))
因此我们就可以反过来,用这些角度表达时间 t t t:
( s i n ( ϕ 1 ) , c o s ( ϕ 1 ) , s i n ( ϕ 2 ) , c o s ( ϕ 2 ) , s i n ( ϕ 3 ) , c o s ( ϕ 3 ) ) → t (sin(\phi_1),cos(\phi_1),sin(\phi_2),cos(\phi_2),sin(\phi_3),cos(\phi_3))\rightarrow t (sin(ϕ1),cos(ϕ1),sin(ϕ2),cos(ϕ2),sin(ϕ3),cos(ϕ3))t其中 ϕ 1 = t × 2 π / 10 , ϕ 2 = t × 2 π / 100 , ϕ 3 = t × 2 π / 1000 \phi_1=t\times2\pi/10,\phi_2=t\times2\pi/100,\phi_3=t\times2\pi/1000 ϕ1=t×2π/10,ϕ2=t×2π/100,ϕ3=t×2π/1000

位置编码

在上述的例子中,令时间 t ← p o s t\leftarrow pos tpos。且我们有 d m o d e l / 2 d_{model}/2 dmodel/2个秒表,第 i i i个秒表转一圈的需要的时间是 2 π × 1000 0 2 i / d m o d e l 2\pi\times 10000^{2i/d_{model}} 2π×100002i/dmodel,那么经过时间 p o s pos pos之后第 i i i个秒表的角度 ϕ i = p o s × 2 π 2 π × 1000 0 2 i / d m o d e l = p o s 1000 0 2 i / d m o d e l \phi_i=pos\times \frac{2\pi}{2\pi\times10000^{2i/d_{model}}}=\frac{pos}{10000^{2i/d_{model}}} ϕi=pos×2π×100002i/dmodel2π=100002i/dmodelpos
那么我们同样可以用这 d m o d e l / 2 d_{model}/2 dmodel/2个秒表的端点坐标表达 p o s pos pos
( s i n ( ϕ 1 ) , c o s ( ϕ 1 ) , ⋯ ) → p o s (sin(\phi_1),cos(\phi_1),\cdots)\rightarrow pos (sin(ϕ1),cos(ϕ1),)pos

可以直接注意到,上式就是我们提到的位置编码!
P E ( p o s , 2 i ) = s i n ( p o s 1000 0 2 i / d m o d e l ) P E ( p o s , 2 i + 1 ) = c o s ( p o s 1000 0 2 i / d m o d e l ) PE(pos,2i)=sin(\frac{pos}{10000^{2i/d_{model}}})\\ PE(pos,2i+1)=cos(\frac{pos}{10000^{2i/d_{model}}}) PE(pos,2i)=sin(100002i/dmodelpos)PE(pos,2i+1)=cos(100002i/dmodelpos) 一摸一样!

这篇关于【位置编码】【Positional Encoding】直观理解位置编码!把位置编码想象成秒针!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1121746

相关文章

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

【C++高阶】C++类型转换全攻略:深入理解并高效应用

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C++ “ 登神长阶 ” 🤡往期回顾🤡:C++ 智能指针 🌹🌹期待您的关注 🌹🌹 ❀C++的类型转换 📒1. C语言中的类型转换📚2. C++强制类型转换⛰️static_cast🌞reinterpret_cast⭐const_cast🍁dynamic_cast 📜3. C++强制类型转换的原因📝

POJ1269 判断2条直线的位置关系

题目大意:给两个点能够确定一条直线,题目给出两条直线(由4个点确定),要求判断出这两条直线的关系:平行,同线,相交。如果相交还要求出交点坐标。 解题思路: 先判断两条直线p1p2, q1q2是否共线, 如果不是,再判断 直线 是否平行, 如果还不是, 则两直线相交。  判断共线:  p1p2q1 共线 且 p1p2q2 共线 ,共线用叉乘为 0  来判断,  判断 平行:  p1p

深入理解RxJava:响应式编程的现代方式

在当今的软件开发世界中,异步编程和事件驱动的架构变得越来越重要。RxJava,作为响应式编程(Reactive Programming)的一个流行库,为Java和Android开发者提供了一种强大的方式来处理异步任务和事件流。本文将深入探讨RxJava的核心概念、优势以及如何在实际项目中应用它。 文章目录 💯 什么是RxJava?💯 响应式编程的优势💯 RxJava的核心概念

如何通俗理解注意力机制?

1、注意力机制(Attention Mechanism)是机器学习和深度学习中一种模拟人类注意力的方法,用于提高模型在处理大量信息时的效率和效果。通俗地理解,它就像是在一堆信息中找到最重要的部分,把注意力集中在这些关键点上,从而更好地完成任务。以下是几个简单的比喻来帮助理解注意力机制: 2、寻找重点:想象一下,你在阅读一篇文章的时候,有些段落特别重要,你会特别注意这些段落,反复阅读,而对其他部分

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

深入理解数据库的 4NF:多值依赖与消除数据异常

在数据库设计中, "范式" 是一个常常被提到的重要概念。许多初学者在学习数据库设计时,经常听到第一范式(1NF)、第二范式(2NF)、第三范式(3NF)以及 BCNF(Boyce-Codd范式)。这些范式都旨在通过消除数据冗余和异常来优化数据库结构。然而,当我们谈到 4NF(第四范式)时,事情变得更加复杂。本文将带你深入了解 多值依赖 和 4NF,帮助你在数据库设计中消除更高级别的异常。 什么是

form表单提交编码的问题

浏览器在form提交后,会生成一个HTTP的头部信息"content-type",标准规定其形式为Content-type: application/x-www-form-urlencoded; charset=UTF-8        那么我们如果需要修改编码,不使用默认的,那么可以如下这样操作修改编码,来满足需求: hmtl代码:   <meta http-equiv="Conte