transformer 位置编码

目录

pytorch 实现位置编码

通俗易懂的:

从上面效果图可以看出,这个三角函数式位置编码满足以下四个特点:

transformer 位置编码

transformer 位置编码通俗解释

绝对位置和相对位置


pytorch 实现位置编码

转自:https://www.jianshu.com/p/303fef5c212a

import torch
from torch import nn 
from d2l import torch as d2l
#@save
class PositionalEncoding(nn.Module):"""位置编码"""def __init__(self, num_hiddens, dropout, max_len=1000):super(PositionalEncoding, self).__init__()self.dropout = nn.Dropout(dropout)# 创建一个足够长的Pself.P = torch.zeros((1, max_len, num_hiddens))X = torch.arange(max_len, dtype=torch.float32).reshape(-1, 1) / torch.pow(10000, torch.arange(0, num_hiddens, 2, dtype=torch.float32) / num_hiddens)self.P[:, :, 0::2] = torch.sin(X)self.P[:, :, 1::2] = torch.cos(X)def forward(self, X):X = X + self.P[:, :X.shape[1], :].to(X.device)return self.dropout(X)
encoding_dim, num_steps = 32, 60
pos_encoding = PositionalEncoding(encoding_dim, 0)
pos_encoding.eval()
X = pos_encoding(torch.zeros((1, num_steps, encoding_dim)))
P = pos_encoding.P[:, :X.shape[1], :]
d2l.plot(torch.arange(num_steps), P[0, :, 6:10].T, xlabel='Row (position)',figsize=(6, 2.5), legend=["Col %d" % d for d in torch.arange(6, 10)])
P = P[0, :, :].unsqueeze(0).unsqueeze(0)
d2l.show_heatmaps(P, xlabel='Column (encoding dimension)',ylabel='Row (position)', figsize=(3.5, 4), cmap='Blues')

通俗易懂的:

以下内容转自:

Transformer的位置编码_transformer 位置编码器-CSDN博客

建议看原文,本文不完整,

1. 什么是位置编码,为什么要使用位置编码
简单来说位置编码就是给一个句子中的每个token一个位置信息,通过位置编码可以明确token的前后顺序关系。

对任何语言来说,句子中词汇的顺序和位置都是非常重要的。它们定义了语法,从而定义了句子的实际语义。RNN结构本身就涵盖了单词的顺序,RNN按顺序逐字分析句子,这就直接在处理的时候整合了文本的顺序信息。

但Transformer架构抛弃了循环机制,仅采用多头自注意机制。避免了RNN较大的时间成本。并且从理论上讲,它可以捕捉句子中较长的依赖关系。

由于句子中的单词同时流经Transformer的编码器、解码器堆栈,模型本身对每个单词没有任何位置信息的。因此,仍然需要一种方法将单词的顺序整合到模型中。

想给模型一些位置信息,一个方案是在每个单词中添加一条关于其在句子中位置的信息。我们称之为“信息片段”,即位置编码。

2. 两种简单的位置编码
最容易想到两种位置编码:
(1)为每个时间步添加一个0-1范围内的数字,其中0表示第一个单词,1表示最后一个单词。

我喜欢吃洋葱 【0 0.16 0.32.....1】我真的不喜欢吃洋葱【0 0.125 0.25.....1】


问题:我们可以看到,如果句子长度不同,那么位置编码是不一样,所以无法表示句子之间有什么相似性。

(2)1-n正整数范围分配

我喜欢吃洋葱 【1,2,3,4,5,6】我真的不喜欢吃洋葱【1,2,3,4,5,6,7】



问题:往往句子越长,后面的值越大,数字越大说明这个位置占的权重也越大,这样的方式无法凸显每个位置的真实的权重。

3. Transformer的位置编码
可以看到上面两种简单的位置编码方式都有明显的不足,理想情况下,应满足以下标准:

每个时间步都有唯一的编码。
在不同长度的句子中,两个时间步之间的距离应该一致。
模型不受句子长短的影响,并且编码范围是有界的。(不会随着句子加长数字就无限增大)
必须是确定性的。
Transformer的作者设计了一种可以满足上面要求的三角函数位置编码方式。首先为每个不同位置的单词(token)单独生成一个位置向量(或者叫位置嵌入,即position embedding,缩写为PE);其次,这种编码并没有集成到模型本身中,该向量用于为每个单词提供有关其在句子中位置的信息,也就是说,其修改了模型的输入,添加了单词的顺序信息。

位置编码方式如下:

4. 为什么要使用三角函数进行位置编码
可以使得不同位置的编码向量之间有一定的规律性,比如相邻位置之间的差异较小,而距离较远的位置之间的差异较大。

这是由正弦和余弦函数的连续性和单调性保证的,即对于任意两个相邻的位置,它们对应的编码向量在每一个维度上都只有微小的变化,而对于任意两个距离较远的位置,它们对应的编码向量在每一个维度上都有较大的差异。

可以使得编码向量在任意维度上都能保持唯一性,即不同位置在同一个维度上不会有相同的值。

这是由正弦和余弦函数的周期性和相位差保证的,即对于任意两个不同的位置,它们对应的编码向量在每一个维度上都不相等。


我们假设max_len为50, d dd 取128,所以 w ww 的取值范围就是0.0001~1,t tt 的范围是0~49,所以三角函数自变量的取值范围是0~49,结果的取值范围为-1~1。则在 t tt 为0时,对应的位置编码为[0, 1, 0, 1, 0, 1, ···, 0, 1],这一点可以从下图的第一行看出来是0,1交替的。

相邻token位置编码每一位的 w ww 相同只有 t tt 相差1,由于三角函数的连续性,所以相邻token的位置编码值只有比很小的差别。


从上面效果图可以看出,这个三角函数式位置编码满足以下四个特点:

语句中每个词的位置编码是唯一的;
不同长度的句子中任意相邻两个词的间隔距离是一致的;
模型可以很容易处理更长的语句,并且值有界;
位置编码是确定性的。


原文链接:https://blog.csdn.net/comli_cn/article/details/130427510

transformer 位置编码

transformer 位置编码通俗解释

Transformer位置编码图解 - 知乎

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)

绝对位置和相对位置

Transformer位置编码(基础) - 知乎

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

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

相关文章

分类预测 | Matlab实现AOA-SVM算术优化支持向量机的数据分类预测【23年新算法】

分类预测 | Matlab实现AOA-SVM算术优化支持向量机的数据分类预测【23年新算法】 目录 分类预测 | Matlab实现AOA-SVM算术优化支持向量机的数据分类预测【23年新算法】分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现AOA-SVM算术优化支持向量机的数据分类预测…

坦克大战(二)

欢迎来到程序小院 坦克大战(二) 玩法:键盘(A W S D)键来控制方向,空格键发射子弹,N:下一关,P:上一关,Enter:开始,赶紧去闯关吧^^。开…

主馆位置即将售罄“2024北京国际信息通信展会”众多知名企聚京城

2024北京国际信息通信展,将于2024年9月份在北京国家会议中心盛大召开。作为全球信息通信技术领域的重要盛会,此次展会将汇集业内顶尖企业,展示最新的技术成果和产品。 目前,主馆位置即将售罄,华为、浪潮、中国移动、通…

使用小程序实现App灰度测试的好处

灰度测试(Gray Testing)是一种软件测试策略,也被称为渐进性测试或部分上线测试。在灰度测试中,新的软件版本或功能并非一次性推送给所有用户,而是仅在一小部分用户中进行测试。这可以帮助开发团队逐步暴露新功能或版本…

react-native利用百度地图SDK实现管道的采集

一、效果图 二、具体实现步骤 1、安装react-native-baidu-map npm install react-native-baidu-map 2、查看百度地图sdk的文档 通过参数配置,可选择定位模式、可设定返回经纬度坐标类型、可设定是单次定位还是连续定位 主要配置 option.setLocationMode(Location…

隐私计算介绍

这里只对隐私计算做一些概念性的浅显介绍,作为入门了解即可 目录 隐私计算概述隐私计算概念隐私计算背景国外各个国家和地区纷纷出台了围绕数据使用和保护的公共政策国内近年来也出台了数据安全、隐私和使用相关的政策法规 隐私计算技术发展 隐私计算技术安全多方计…

Web前端-CSS(文本样式)

文章目录 1.font字体1.1 font-size:大小1.2 font-family:字体1.3 font-weight:字体粗细1.4 font-style:字体风格1.5 font总结 2. css外观属性2.1 color:文本颜色2.2 text-align:文本水平对齐方式2.3 line-height:行间距2.4 text-indent:首行缩进2.5 text-decoration 文本的装饰…

协同物联:设备物联与车间数据采集的融合

随着工业4.0和智能制造的快速发展,物联网技术在工业领域的应用逐渐普及。其中,协同物联、设备物联和车间数据采集技术对于提升企业生产效率和降低运营成本具有重要意义。本文将深入探讨这些技术在现代工业环境中的应用及它们如何共同推动企业向数字化转型…

c语言:输出26个英文字母|练习题

一、题目 分两排&#xff0c;输出26个英文字母 如图&#xff1a; 二、思路分析 1、从第13个字母分行显示 2、从A开始&#xff0c;在A的ASC码后面&#xff0c;按顺序加1~26 三、代码图片【带注释】 四、源代码【带注释】 #include <stdio.h> //题目:输入26个字母&#x…

DBeaver Ultimate for Mac/win:掌握数据库的终极利器,助您高效管理数据!

在当今数字化时代&#xff0c;数据管理变得越来越重要。而作为一款功能强大的数据库管理工具&#xff0c;DBeaver Ultimate&#xff08;简称DBU&#xff09;助您轻松应对各种复杂的数据管理任务。无论您是数据库管理员、开发人员还是数据分析师&#xff0c;DBU都能为您提供全面…

穿越时光的Java之旅

穿越时光的Java之旅 《穿越时光的Java之旅》摘要引言1. 从大一开始的编程启蒙1.1 编程的初衷1.2 学习Java的初体验1.3 遇到的挑战与解决之道2. 大二&#xff1a;探索专业分流与技术方向选择2.1 专业选择的思考2.2 技术领域的广度与深度2.3 找到感兴趣的方向2.4 实践与项目经验3…

Unity中URP下的半透明效果实现

文章目录 前言一、实现半透明的步骤1、修改Blend模式&#xff0c;使之透明2、打开深度写入&#xff0c;防止透明对象穿模3、在Tags中&#xff0c;修改渲染类型和渲染队列为半透明 Transparent 二、对透明效果实现从下到上的透明渐变1、 我们在 Varying 中&#xff0c;定义一个v…