Transformer中的位置编码详解

什么是位置编码

  1. 位置编码概述 位置编码的目的是为了补充序列的位置信息,这是因为自注意力机制本身不包含位置的概念(例如顺序信息)。位置编码的具体作用是,对于不同的输入序列成分,赋予其不同的位置标识,确保序列信息在不同的上下文中仍然,即使是相同的文本序列也因位置不同而有不同的含义。

Transformers 使用的位置编码方法,其中每个位置/词素都被分配一个编号。到此,位置编码的输出是一个矩阵,其中每行的每一行代表序列中的一个特定词素与其位置信息相结合。下图演示了一个较小的位置编码矩阵示例的构成方式。

位置编码矩阵

位置编码矩阵示例 - 序列 ‘I am a robot’

三角函数 

  1. 三角函数 三角函数是数学中的基本概念,不仅可以表达周期性的现象,还能描述波动的基本特性。这些函数的图像通常在[-1, 1]的区间内。三角函数的一般形式包括正弦和余弦两种,它们的周期性是函数的重要特性。以下表格列出了几种常见的三角函数形式及其特性:

位置编码公式 

位置编码的数学公式用于为每一个位置(即序列中的词素)分配一个独特的编码,以使其能够在不同的上下文中区别对待。位置编码使用下述公式来生成位置编码矩阵:

\begin{aligned}&P(k,2i)=\sin\left(\frac k{n^{2i/d}}\right)\text{(1)}\\&P(k,2i+1)=\cos\left(\frac k{n^{2i/d}}\right)\text{(2)}\end{aligned}

其中:

  • k:词素(即序列中的某个元素)的索引位置的值,0≤k<L/2
  • d:编码矩阵的维度
  • P(k,j):位置编码,用于给定词素 k 的频率编码的 (k, j) 处的值
  • n:用户定义的常数(例如,"Attention Is All You Need" 论文中的常数为 10,000)
  • i:用于确定频率的位置,0≤i<d/2,相当于确定位置编码矩阵中的行

位置编码示例

通过具体例子理解位置编码。以序列 “I am a robot” 为例,设定 n = 100, d = 4。在这个例子中,我们计算了 n = 100 和 d = 4 的序列的位置编码,位置编码的计算结果如下表:

位置编码矩阵示例 - 序列 ‘I am a robot’ 

Python实现位置编码 

使用 NumPy 库进行矩阵和数学运算以及 Matplotlib 库进行图形绘制,下面是 Python 代码示例以及其输出结果。

import numpy as np
import matplotlib.pyplot as pltdef getPositionEncoding(seq_len, d, n=10000):P = np.zeros((seq_len, d))for k in range(seq_len):for i in np.arange(int(d/2)):denominator = np.power(n, 2*i/d)P[k, 2*i] = np.sin(k/denominator)P[k, 2*i+1] = np.cos(k/denominator)return PP = getPositionEncoding(seq_len=4, d=4, n=100)
print(P)

单个序列的可视化 

使用 Matplotlib 库绘制不同位置的三角函数图,下面是 Python 代码示例以及其生成的图形。

import numpy as np
import matplotlib.pyplot as pltdef getPositionEncoding(seq_len, d, n=10000):P = np.zeros((seq_len, d))for k in range(seq_len):for i in np.arange(int(d/2)):denominator = np.power(n, 2*i/d)P[k, 2*i] = np.sin(k/denominator)P[k, 2*i+1] = np.cos(k/denominator)return Pdef plotSinusoid(k, d, n):x = np.arange(0, 100, 1)denominator = np.power(n, 2*k/d)y = np.sin(x/denominator)plt.plot(x, y)plt.title('k = ' + str(k))# 使用长序列和较大维度的参数
seq_len = 100
d = 512
n = 10000
P = getPositionEncoding(seq_len, d, n)
# 正弦波绘图
fig = plt.figure(figsize=(15, 4))
for i in range(4):plt.subplot(1, 4, i + 1)plotSinusoid(i*4, d, n)  # 确保传入函数的参数和生成P矩阵时的参数一致
plt.show()

下图是四个不同 k 值的正弦波形图。可以看到,随着 k 值的增大,波形周期发生了变化。

可视化结果:四个不同 k 值的正弦波形图,分别对应 k=0, k=4, k=8, 和 k=12 的情况。随着 k 值的增大,波形周期发生变化,显示了不同频率和波长的正弦波。

热图可视化编码矩阵 

使用 Python 的 Matplotlib 库的 matshow() 函数,可以将位置编码矩阵以热图的形式可视化。热图可以直观地展示不同位置编码的值的大小。下面是 Python 代码示例以及热图的输出结果。

# 热图绘图
fig2 = plt.figure(figsize=(15, 4))
cax = plt.matshow(P, aspect='auto')  # aspect='auto'保证热图在x轴和y轴方向拉伸以填满画布
plt.colorbar(cax)
plt.show()

  

热图结果:展示了一个长为 100,宽为 512 的位置编码矩阵的热图。热图中的颜色变化表示不同位置编码值的大小,可以看到随着位置的变化,颜色也呈现出周期性的变化模式。

位置编码的整体流程 

Transformer模型的位置编码过程包括将词汇转换为向量,然后与位置编码相加,以保持位置信息。以下是该过程的详细描述:
 

  • 输入序列(Input sequence): I, am, a, Robot
  • 词向量嵌入(Word embedding): 将每个输入词转换为一个嵌入向量(embedding vector)。
    • v0​ 是 "I" 的嵌入向量
    • v1​ 是 "am" 的嵌入向量
    • v2​ 是 "a" 的嵌入向量
    • v3​ 是 "Robot" 的嵌入向量
  • 位置编码矩阵(Positional Encoding Matrix): 计算序列中每个词的位置编码向量。
    • P0​ 是 "I" 的位置编码向量
    • P1​ 是 "am" 的位置编码向量
    • P2​ 是 "a" 的位置编码向量
    • P3​ 是 "Robot" 的位置编码向量
  • 位置编码层的输出(Output of positional encoding layer): 词向量和位置编码向量相加,得到最终的编码向量。
    • y0​ 是 "I" 的位置编码
    • y1​ 是 "am" 的位置编码
    • y2​ 是 "a" 的位置编码
    • y3​ 是 "Robot" 的位置编码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/640324.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

❤️新版Linux零基础快速入门到精通——第三部分❤️

❤️新版Linux零基础快速入门到精通——第三部分❤️ 非科班的我&#xff01;Ta&#xff01;还是来了~~~3. Linux权限管控3.1 认知root用户3.1.1 Switch User——su3.1.2 sudo命令3.1.3 为普通用户配置sudo认证 3.2 用户和用户组3.2.1 用户、用户组3.2.2 用户组管理3.2.3 用户管…

人工智能大模型培训老师叶梓 探索知识库问答中的查询图生成:处理多跳复杂问题的新方法

在人工智能领域&#xff0c;基于知识库的问答&#xff08;KBQA&#xff09;技术正变得越来越重要。它使得机器能够理解自然语言问题&#xff0c;并从结构化的知识库中检索答案。然而&#xff0c;面对多跳复杂问题&#xff0c;传统的KBQA方法往往力不从心。近期&#xff0c;研究…

网工不能不知道这10个工具,全都很好用!

你们好&#xff0c;我的网工朋友。 有阵子没做网工工具合集了&#xff0c;不少朋友私信我说“老杨怎么不一次性多放点安装包”。 所以有了今天这篇10个好用工具安利&#xff0c;这次尽可能把有的安装包都给你安排上了。 它们涵盖了从基础的网络监控、故障排查到高级的网络安…

那些早期的iax和SIP软电话软件界面,看看你见过几个?

目录 一些iax/sip软电话UI图片SIP软电话的界面怎么设计SIP软电话的功能有哪些 早期voip发展中&#xff0c;很多公司开发了自己的SIP软电话&#xff0c;有些已经不存在了&#xff0c;有些还在使用中&#xff0c;比如X-Lite&#xff0c;Zoiper等等&#xff0c;我们一起看看这些早…

基于SpringBoot的“论坛管理系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“论坛管理系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 论坛管理系统结构图 前台首页功能界面图 用户登录…

转行做银行测试,需要了解哪些?

在这个内卷严重的时代&#xff0c;银行的业务不断增加&#xff0c;随着软件信息化的要求越来越高&#xff0c;银行对软件测试人员也提出了非常高的要求。 银行的软件测试是针对银行的软件系统&#xff08;如柜面系统、信贷系统&#xff09;和银行专用设备&#xff08;如ATM机、…

SAP打印输出设置

SAP打印输入有很多方式&#xff0c;适合不同的应用场景。 一.打印输出总体概览图 二.前台打印 这个是比较常见的&#xff0c;前端打印的出现减轻了管理员的工作量&#xff0c;用户可以选择自己电脑上的打印机输出&#xff0c;不需要所有打印机都在SAP平台中进行配置&#xff0…

Redis中的慢查询日志和监视器

慢查询 添加新日志 在每次执行命令的之前和之后&#xff0c;程序都会记录微妙格式的当前UNIX时间戳&#xff0c;这两个时间戳之间的差就是服务器执行命令所耗费的时长&#xff0c;服务器会将这个时长作为参数之一传给slowlogPushEntryIfNeeded函数&#xff0c;而slowlogPushE…

YOLOv9有效改进专栏汇总|未来更新卷积、主干、检测头注意力机制、特征融合方式等创新![2024/4/21]

​ 专栏介绍&#xff1a;YOLOv9改进系列 | 包含深度学习最新创新&#xff0c;助力高效涨点&#xff01;&#xff01;&#xff01; 专栏介绍 YOLOv9作为最新的YOLO系列模型&#xff0c;对于做目标检测的同学是必不可少的。本专栏将针对2024年最新推出的YOLOv9检测模型&#xff0…

如何处理Keil uVision5注释无法输入汉字且输入汉字变成问号的问题

好久没用KEIL&#xff0c;今天在注释中出现无法输入汉字的情况&#xff0c;且输入或粘贴的汉字都变成了问号&#xff0c;解决方法很简单&#xff0c;将General Editor Settings: Encoding:设置为Chinese GB2312(Simplified)即可&#xff08;出现问号的当前设置是Encode in ANSI…

“傻瓜”学计量——核密度估计KDE

提纲&#xff1a; 什么是核密度估计&#xff0c;是干什么的 代码 1 前言 参数估计vs非参数估计参数估计是样本数据来自一个具有明确概率密度函数的总体。非参数估计是样本数据的概率分布未知&#xff0c;这时&#xff0c;为了对样本数据进行建模&#xff0c;需要估计样本数据…

双线性插值计算手动实现以及原理

双线性插值计算手动实现以及原理 代码原理 代码 先贴代码吧&#xff0c;原理其实也比较简单&#xff0c;看代码基本也就理解了&#xff0c;时间太晚了&#xff0c;原理后续再补吧。 import torch from torch.nn import functional as F import numpy as np from itertools im…