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 plt

def 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 P

P = getPositionEncoding(seq_len=4, d=4, n=100)
print(P)

单个序列的可视化 

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

import numpy as np
import matplotlib.pyplot as plt

def 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 P

def 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.mfbz.cn/a/557699.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++-命名空间

C 命名空间是一种用于组织代码的机制&#xff0c;可以帮助避免命名冲突&#xff0c;提高代码的可读性和可维护性。命名空间将代码分组到逻辑单元中&#xff0c;允许在不同的代码单元中使用相同的名称而不会产生冲突。 命名空间通过将代码放置在一个命名空间内部来实现。在 C 中…

被Claude3的图生代码技术秀到了,前端开发效率,提升到秒级

被Claude3的图生代码技术秀到了&#xff01;前端开发效率&#xff0c;提升到秒级 上传一张网站图片&#xff0c;用Claude3 生成实现这个网站的代码的教程来啦&#xff01; 在Claude3 的中文网站上一分钟就能实现&#xff0c;生成前端代码。中文网站地址是https://askmanyai.c…

探索 IntelliJ IDEA 2024.1最新变化:全面升级助力编码效率

探索 IntelliJ IDEA 2024.1最新变化&#xff1a;全面升级助力编码效率 文章目录 探索 IntelliJ IDEA 2024.1最新变化&#xff1a;全面升级助力编码效率摘要引言 IntelliJ IDEA 2024.1 最新变化关键亮点全行代码补全 Ultimate对 Java 22 功能的支持新终端 Beta编辑器中的粘性行 …

解决跨域和https不能访问的问题。

本地安装了项目,是一键安装的,安装之后还是apache的web服务器,有个视频服务用的是https的服务,要对这个项目进行二次开发,本地调用没问题,可是别人已调用就跨域。只能本地访问。 现在有两个问题:1.解决跨域问题 2.还要解决https访问的问题。 解决思路,用nginx 的ssl证…

本地项目如何设置https——2024-04-19

问题&#xff1a;由于项目引用了html5-qrcode插件&#xff0c;但是该插件在本地移动端调试时只能使用https访问&#xff0c;所有原本的本地地址是http&#xff0c;就需要改成https以方便调试。 解决方法&#xff1a;使用本地https证书 1&#xff09;从项目文件下打开cmd逐步输…

Springboot配置文件(application.yml)的加载顺序

spring boot 启动会扫描一下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件 file…/config/ file…/ classpath:/config classpath:/ 以上是按照优先级从高到低的顺序&#xff0c;所有位置的文件都会被加载&#xff0c;高优先级配置内容会…

代码随想录算法训练营第四十四天| LeetCode70. 爬楼梯 (进阶)、322. 零钱兑换、279.完全平方数

一、LeetCode 70. 爬楼梯 &#xff08;进阶&#xff09; 题目链接/文章讲解/视频讲解&#xff1a;https://programmercarl.com/0070.%E7%88%AC%E6%A5%BC%E6%A2%AF%E5%AE%8C%E5%85%A8%E8%83%8C%E5%8C%85%E7%89%88%E6%9C%AC.html 状态&#xff1a;已解决 1.思路 这道题跟70.爬楼…

突破“三个九”!离子阱量子计算再创新高

如果把量子计算比作一场球赛&#xff0c;Quantinuum无疑又打了一记漂亮的好球。实际上&#xff0c;结合今年春季在量子体积、逻辑量子比特和布线问题等方面的进展&#xff0c;这个团队已经接近于完成一场完美的比赛。 3月&#xff0c;Quantinuum的研究人员证明了QCCD架构的可扩…

JavaScript 流程控制-循环

一、循环 二、 for 循环 重复执行的语句被称为循环体&#xff0c;能否继续重复执行&#xff0c;取决于循环的终止条件。 由循环体及循环的终止条件组成的语句被称为循环语句 1、语法结构 for 循环 主要用于把某些代码循环若干次&#xff0c;通常跟计数有关 for &#xff08…

springboot结合vue实现文件上传下载功能

紧接着上一次的博客&#xff0c;这次来实现一下文件(主要是图片)的上传和下载功能&#xff0c;上一次的博客如下所示&#xff1a; Springboot集成JWT token实现权限验证-CSDN博客 其实文件的上传和下载功能(后端的部分)&#xff0c;在我之前的博客就已经有写了&#xff0c;所以…

力扣经典150题第三十题:长度最小的子数组

目录 力扣经典150题解析之三十&#xff1a;长度最小的子数组1. 介绍2. 问题描述3. 示例4. 解题思路方法一&#xff1a;滑动窗口 5. 算法实现6. 复杂度分析7. 测试与验证测试用例设计测试结果分析 8. 进阶9. 总结10. 参考文献感谢阅读 力扣经典150题解析之三十&#xff1a;长度最…

重构国内游戏账号登录系统的思考和实践

本期作者 背景 账号登录系统&#xff0c;作为游戏发行平台最重要的应用之一&#xff0c;在当前的发行平台的应用架构中&#xff0c;主要承载的是用户的账号注册、登录、实名、防沉迷、隐私合规、风控等职责。合规作为企业经营的生命线&#xff0c;同时&#xff0c;账号登录作为…

数据结构系列-堆的实现

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 堆的实现&#xff0c;其实也就是二叉树的实现&#xff0c;我们在这里是基于数组对其进行实现的&#xff01; typedef struct Heap {HPDataType* a;int size;int capacity; }HP;…

毕业设计做一个linux操作系统怎么样?

毕业设计选择做操作系统的话&#xff0c;不太建议做的规模太大&#xff0c;你可以参考一下Linux内核的代码量&#xff0c;完全从头写的工作量还是挺大的。如果是一行一行从头写&#xff0c;学生期间&#xff0c;一学期写10000-20000行有效代码就很强了&#xff0c;而且还要学习…

【面经】2024春招-云计算后台研发工程师1(3个问题,移动TW等)

【面经】2024春招-云计算后台研发工程师1&#xff08;3个问题&#xff0c;移动&TW等&#xff09; 文章目录 岗位与面经基础1&#xff1a;数据库 & 网络&#xff08;3个问题&#xff09;基础2&#xff1a;系统 & 语法模板3&#xff1a;算法 & 项目&#xff08;移…

探索人工智能绘图的奇妙世界

探索人工智能绘图的奇妙世界 人工智能绘图的基本原理机器之美&#xff1a;AI绘图作品AI绘图对艺术创作的影响未来展望与挑战图书推荐&#x1f449;AI绘画教程&#xff1a;Midjourney使用方法与技巧从入门到精通内容简介获取方式&#x1f449;搜索之道&#xff1a;信息素养与终身…

Timelapse - 2024.04.09 -Win

阅读须知&#xff1a; 探索者安全团队技术文章仅供参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作,由于传播、利用本公众号所提供的技术和信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者 本人负责&#xff0c;作者不为此承担任何责任,如…

centos6.5重启docker容器死机问题

概述 近期在整理服务问题&#xff0c;使用docker容器重新部署服务。 过程中有不少坑&#xff0c;主要是系统配置和系统版本的问题。 环境 CentOS release 6.5 (Final) docker version 1.7.1 问题现象 使用restart命令重启docker容器&#xff0c;系统突然卡死&#xff0c…

protobuf抓包,读包

protobuf抓包 有时候会遇到使用protobuf协议的http请求, 而protobuf封包后的二进制几乎不可读, 如何调试呢 protobuf就是类似一个json的数据传输协议, 相比json更快, 体积更小; 缺点就是不可读 Content-Type: application/x-protobuf数据大概是下面这样的(浏览器开发者工具 自…

(十八)C++自制植物大战僵尸游戏的游戏暂停实现

植物大战僵尸游戏开发教程专栏地址http://t.csdnimg.cn/uzrnw 游戏暂停 当玩家遇到突发事件&#xff0c;可以通过暂停功能暂停游戏&#xff0c;以便及时处理问题。在激烈的游戏中&#xff0c;玩家可能需要暂停游戏来进行策略调整。此外&#xff0c;长时间的游戏对战可能会让玩…
最新文章