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

transformer-词嵌入和位置嵌入详解

文章目录

  • 1、介绍一下位置嵌入Positional Encoding、什么是Positional Encoding呢?为什么Transformer需要Positional Enconding? Transformer 的 Positional Encoding 是如何表达相对位置关系的?
  • 2、我来简单举个例子
    • 2.1 词向量:每个token都会被映射为词向量
    • 2.2 位置嵌入
  • 3、对位置编码公式中2i和2i+1的进一步解释

1、介绍一下位置嵌入Positional Encoding、什么是Positional Encoding呢?为什么Transformer需要Positional Enconding? Transformer 的 Positional Encoding 是如何表达相对位置关系的?

答: 一句话概括,Positional Encoding就是句子中词语相对位置的编码,让Transformer保留词语的位置信息。
Attention 对位置不敏感的原因,因此其无法捕捉到输入序列中 token 的位置信息。一种可行的办法就是在输入的时候加入每个 token 的位置信息。

首先, 在任何一门语言中,词语的位置和顺序对句子意思表达都是至关重要的。 传统的RNN模型在处理句子时,以序列的模式逐个处理句子中的词语,这使得词语的顺序信息在处理过程中被天然的保存下来了,并不需要额外的处理。 而对于Transformer来说,由于句子中的词语都是同时进入网络进行处理,顺序信息在输入网络时就已丢失。因此,Transformer是需要额外的处理来告知每个词语的相对位置的。 其中的一个解决方案,就是论文中提到的Positional Encoding,将能表示位置信息的编码添加到输入中,让网络知道每个词的位置和顺序。

作者:月球上的人
链接:https://zhuanlan.zhihu.com/p/338592312
在这里插入图片描述

Transformer 摈弃了 RNN 的结构,因此需要一个东西来标记各个字之间的时序 or 位置关系,而这个东西,就是位置嵌入。作者为此设计了一种Positional Encoding,首先,它不是一个数字,而是一个包含句子中特定位置信息的d维向量。其次,这种嵌入方式没有集成到模型中,相反,这个向量是用来给句子中的每个字提供位置信息的,换句话说,我们通过注入每个字位置信息的方式,增强了模型的输入(其实说白了就是将位置嵌入和字嵌入相加,然后作为输入)
pos表示token在sequence中的位置,位置编码的公式中的i表示的是第i个 position embedding 维度(即你看哈,pm要被表示为一个向量哈,这个向量呢每个维度都得有值吧,它是怎么控制那个分母上的指数呢,就是靠每个维度在向量中的索引的变形,具体变形还是看上面那个图片里的公式,有了这个i之后就可以控制这个向量里的每两个值使用的是同一个分母
在这里插入图片描述
上图以及pos和i的含义解释参考:解释 Transformer 中的绝对位置编码(这个文章吊炸天,太强了!!!)

2、我来简单举个例子

我爱北京天安门

分词:我、爱、北京、天安门

2.1 词向量:每个token都会被映射为词向量

我      e0--->[1,2,2,4]
爱      e1--->[0,2,6,3]
北京    e2--->[8,0,7,5]
天安门  e3--->[9,2,8,1]

2.2 位置嵌入

按上面的公式计算,那就是会出现4个位置嵌入
我 , 爱 , 北京 , 天安门 我,爱,北京,天安门 ,,北京,天安门

p 0 , p 1 , p 2 , p 3 p_0, p_1, p_2, p_3 p0,p1,p2,p3
每个位置嵌入的维度是4,令
p 0 = [ x 0 , x 1 , x 2 , x 3 ] p_0=[x0,x1,x2,x3] p0=[x0,x1,x2,x3]

那么x0:
x 0 = s i n ( m 1000 0 2 ∗ i d ) = s i n ( 0 1000 0 2 ∗ 0 4 ) x_0 = sin(\frac{m}{10000^\frac{2*i}{d}})=sin(\frac{0}{10000^\frac{2*0}{4}}) x0=sin(10000d2im)=sin(100004200)

其中:

m=0,即“我”在句子“我爱北京天安门”中是处于第0个位置
i=0,即现在是计算的“我”的位置嵌入的第0维度是多少值,则i=0
d=4,即嵌入向量的维度

那么x1:
x 1 = c o s ( m 1000 0 2 ∗ i d ) = c o s ( 0 1000 0 2 ∗ 1 4 ) x_1 = cos(\frac{m}{10000^\frac{2*i}{d}})=cos(\frac{0}{10000^\frac{2*1}{4}}) x1=cos(10000d2im)=cos(100004210)
其中:

m=0,即“我”在句子“我爱北京天安门”中的位置
i=1,即现在是计算的“我”的位置嵌入的第1维度
d=4,即嵌入向量的维度

那么x2:
x 2 = s i n ( m 1000 0 2 ∗ i d ) = s i n ( 0 1000 0 2 ∗ 2 4 ) x_2 = sin(\frac{m}{10000^\frac{2*i}{d}})=sin(\frac{0}{10000^\frac{2*2}{4}}) x2=sin(10000d2im)=sin(100004220)

其中:

m=0,即“我”在句子“我爱北京天安门”中是处于第0个位置
i=2,即现在是计算的“我”的位置嵌入的第2维度是多少值
d=4,即嵌入向量的维度

那么x3:
x 3 = c o s ( m 1000 0 2 ∗ i d ) = c o s ( 0 1000 0 2 ∗ 3 4 ) x_3 = cos(\frac{m}{10000^\frac{2*i}{d}})=cos(\frac{0}{10000^\frac{2*3}{4}}) x3=cos(10000d2im)=cos(100004230)

其中:

m=0,即“我”在句子“我爱北京天安门”中是处于第0个位置
i=3,即现在是计算的“我”的位置嵌入的第3维度是多少值
d=4,即嵌入向量的维度

那么
p 0 = ( s i n ( m 1000 0 2 ∗ i d ) , c o s ( m 1000 0 2 ∗ i d ) , s i n ( m 1000 0 2 ∗ i d ) , c o s ( m 1000 0 2 ∗ i d ) ) = ( s i n ( 0 1000 0 2 ∗ 0 4 ) , c o s ( 0 1000 0 2 ∗ 1 4 ) , s i n ( 0 1000 0 2 ∗ 2 d ) , c o s ( 0 1000 0 2 ∗ 3 4 ) ) = ( s i n 0 , c o s 0 , s i n 0 , c o s 0 ) = ( 0 , 1 , 0 , 1 ) \begin{aligned} p_0&= (sin(\frac{m}{10000^\frac{2*i}{d}}),cos(\frac{m}{10000^\frac{2*i}{d}}),sin(\frac{m}{10000^\frac{2*i}{d}}),cos(\frac{m}{10000^\frac{2*i}{d}}))\\ &=(sin(\frac{0}{10000^\frac{2*0}{4}}),cos(\frac{0}{10000^\frac{2*1}{4}}),sin(\frac{0}{10000^\frac{2*2}{d}}),cos(\frac{0}{10000^\frac{2*3}{4}}))\\ &=(sin0,cos0,sin0,cos0)\\ &=(0,1,0,1)\\ \end{aligned} p0=(sin(10000d2im),cos(10000d2im),sin(10000d2im),cos(10000d2im))=(sin(100004200),cos(100004210),sin(10000d220),cos(100004230))=(sin0,cos0,sin0,cos0)=(0,1,0,1)
那么”我的“输入:
e 0 + p 0 = [ 1 , 2 , 2 , 4 ] + [ 0 , 1 , 0 , 1 ] = ( 0 , 1 , 0 , 1 ) \begin{aligned} e_0+p_0 &=[1,2,2,4]+[0,1,0,1]\\ &=(0,1,0,1)\\ \end{aligned} e0+p0=[1,2,2,4]+[0,1,0,1]=(0,1,0,1)

3、对位置编码公式中2i和2i+1的进一步解释

不用追求2i和2i+1的值到底是多少,只需认识到,2i是偶数,2i+1是奇数

还有一个重要的话:上面的公式中2i2i+1指的是词语向量中,每个维度的位置
举例:我的词向量表示:

[5, 8.3, 24, 31, 90, 55, 48]

词向量中的每个数字的位置下标为:

[0, 1, 2, 3, 4, 5, 6]

那么位置下标表示为奇偶的表示:

[i,2i+1,i,2i+1,i,2i+1,i,2i+1,i]这里的i的值不用追究,只需要知道位置下标是奇数还是偶数即可

所以用

[sin,cos,sin,cos,sin,cos,sin]

来计算位置向量

http://www.xdnf.cn/news/206.html

相关文章:

  • postman使用设置
  • 2025 年第十五届 MathorCup竞赛赛题浅析-助攻快速选题
  • Qt工具栏中添加按钮QAction
  • 内网穿透服务器—FRP
  • 深入理解分布式缓存 以及Redis 实现缓存更新通知方案
  • 基于Ubuntu22.04和OpenCV4.5.4的物联网人脸识别考勤机
  • java线程池原理及使用和处理流程
  • 隐马尔可夫模型(HMM)与序列标注任务详解
  • hadoop三大组件的结构及各自的作用
  • Python作业4 文本词云统计,生成词云
  • 欣佰特携数十款机器人相关前沿产品,亮相第二届人形机器人和具身智能行业盛会
  • 在国产麒麟Kylin Linux Advanced Server V10中使用QT5开发环境并支持中文输入
  • SimBody安装
  • AI中台系统设计方案探讨
  • CentOS 7系统yum报错解决方案(CentOS 7官方EOL问题修复)
  • 健康养生:开启活力生活新篇章
  • Oracle AWR快照保留策略及其修改
  • mybatis plus打印sql日志到指定目录
  • js前端复制对象
  • 神经接口安全攻防:从技术漏洞到伦理挑战
  • 有什么好用的工程项目施工数据管理信息系统?这类系统有何好处?
  • 麒麟操作系统漏洞修复保姆级教程弱(一)算法漏洞修复
  • 【数据融合实战手册·实战篇】二维赋能三维的5种高阶玩法:手把手教你用Mapmost打造智慧城市标杆案例
  • 重构未来智能:Anthropic 解码Agent设计哲学三重奏
  • Unity-微信截图功能简单复刻-02屏幕采样
  • 青少年编程与数学 02-016 Python数据结构与算法 28课题、图像处理算法
  • 深入理解红黑树:原理、实现与应用
  • openbmb/MiniCPM-V-2_6 和 AIDC-AI/Ovis2-1B 的网络结构体对比
  • 日本公司如何实现B2B商城订货系统的自动化和个性化?
  • 电子电器架构 --- EOL 工厂刷写(产线)