【位置编码】【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

相关文章

深入理解Apache Airflow 调度器(最新推荐)

《深入理解ApacheAirflow调度器(最新推荐)》ApacheAirflow调度器是数据管道管理系统的关键组件,负责编排dag中任务的执行,通过理解调度器的角色和工作方式,正确配置调度器,并... 目录什么是Airflow 调度器?Airflow 调度器工作机制配置Airflow调度器调优及优化建议最

一文带你理解Python中import机制与importlib的妙用

《一文带你理解Python中import机制与importlib的妙用》在Python编程的世界里,import语句是开发者最常用的工具之一,它就像一把钥匙,打开了通往各种功能和库的大门,下面就跟随小... 目录一、python import机制概述1.1 import语句的基本用法1.2 模块缓存机制1.

深入理解C语言的void*

《深入理解C语言的void*》本文主要介绍了C语言的void*,包括它的任意性、编译器对void*的类型检查以及需要显式类型转换的规则,具有一定的参考价值,感兴趣的可以了解一下... 目录一、void* 的类型任意性二、编译器对 void* 的类型检查三、需要显式类型转换占用的字节四、总结一、void* 的

深入理解Redis大key的危害及解决方案

《深入理解Redis大key的危害及解决方案》本文主要介绍了深入理解Redis大key的危害及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一、背景二、什么是大key三、大key评价标准四、大key 产生的原因与场景五、大key影响与危

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

如何用Java结合经纬度位置计算目标点的日出日落时间详解

《如何用Java结合经纬度位置计算目标点的日出日落时间详解》这篇文章主详细讲解了如何基于目标点的经纬度计算日出日落时间,提供了在线API和Java库两种计算方法,并通过实际案例展示了其应用,需要的朋友... 目录前言一、应用示例1、天安门升旗时间2、湖南省日出日落信息二、Java日出日落计算1、在线API2

认识、理解、分类——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