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

自注意力和位置编码

一、自注意力

1、给定一个由词元组成的输入序列x1,…,xn, 其中任意xi∈R^d(1≤i≤n)。 该序列的自注意力输出为一个长度相同的序列 y1,…,yn,其中:

2、自注意力池化层将xi当作key,value,query来对序列抽取特征得到y1,…,yn

二、跟CNN、RNN对比(目标都是将由n个词元组成的序列映射到另一个长度相等的序列,其中的每个输入词元或输出词元都由d维向量表示)(不是很明白,有空问问老师)

1、CNN:序列长度是n,输入和输出的通道数量都是d, 所以卷积层的计算复杂度为O(knd^2);卷积神经网络是分层的,因此为有O(1)个顺序操作, 最大路径长度为O(n/k)。

2、RNN:当更新循环神经网络的隐状态时, d×d权重矩阵和d维隐状态的乘法计算复杂度为O(d2)。 由于序列长度为n,因此循环神经网络层的计算复杂度为O(nd2);有O(n)个顺序操作无法并行化,最大路径长度也是O(n)。

3、在自注意力中,查询、键和值都是n×d矩阵。 考虑缩放的”点-积“注意力, 其中n×d矩阵乘以d×n矩阵。 之后输出的n×n矩阵乘以n×d矩阵。 因此,自注意力具有O(n2d)计算复杂性。 每个词元都通过自注意力直接连接到任何其他词元,有O(1)个顺序操作可以并行计算, 最大路径长度也是O(1)。

三、位置编码

1、自注意力则因为并行计算而放弃了顺序操作。 为了使用序列的顺序信息,通过在输入表示中添加 位置编码(positional encoding)来注入绝对的或相对的位置信息。

2、输入表示X∈R^(n×d)包含一个序列中n个词元的d维嵌入表示。 位置编码使用相同形状的位置嵌入矩阵 P∈R^(n×d)输出X+P

3、位置编码矩阵

4、绝对位置信息

        竖着看,有三维,第一维00001111变化很慢,第二位00110011变化中等,第三维01010101变化最快,大概是这样子叭。。。。

5、相对位置信息

        除了捕获绝对位置信息之外,位置编码还允许模型学习得到输入序列中相对位置信息。 这是因为对于任何确定的位置偏移δ,位置i+δ处 的位置编码可以线性投影位置i处的位置编码来表示。也就是:

        位于i+δ处的位置编码可以线性投影位置i处的位置编码来表示

        令ωj=1/100002^(j/d), 对于任何确定的位置偏移δ中,任何一对 (p^(i,2j),p^(i,2j+1))都可以线性投影到 (p^(i+δ,2j),p^(i+δ,2j+1))

6、代码

#@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)

四、总结

1、在自注意力中,查询、键和值都来自同一组输入。

2、卷积神经网络和自注意力都拥有并行计算的优势,而且自注意力的最大路径长度最短。但是因为其计算复杂度是关于序列长度的二次方,所以在很长的序列中计算会非常慢。

3、为了使用序列的顺序信息,可以通过在输入表示中添加位置编码,来注入绝对的或相对的位置信息

http://www.lryc.cn/news/415481.html

相关文章:

  • “文件夹提示无法访问?高效数据恢复策略全解析“
  • 结构开发笔记(一):外壳IP防水等级与IP防水铝壳体初步选型
  • WPF Datagrid控件,获取某一个单元格中的控件
  • P10838 『FLA - I』庭中有奇树
  • WebRTC简介
  • 一套直播系统带商城源码 附搭建教程
  • Netty 总结与补充(十)
  • 循环实现异步变同步的问题
  • 测试GPT4o分析巴黎奥运会奖牌数据
  • TF卡(SD NAND)参考设计和使用提示
  • 电源芯片负载调整率测试方法、原理以及自动化测试的优势-纳米软件
  • C++威力强大的助手 --- const
  • 测试环境搭建整套大数据系统(十八:ubuntu镜像源进行更新)
  • 第128天:内网安全-横向移动IPCATSC 命令Impacket 套件CS 插件全自动
  • 记录一次学习过程(msf、cs的使用、横向渗透等等)
  • C#中DataTable新增列、删除列、更改列名、交换列位置
  • C#编写多导联扫描式的波形图Demo
  • QT网络编程
  • Django ASGI服务
  • Servlet(2)
  • 电竞玩家的云端盛宴!四大云电脑平台:ToDesk、顺网云、青椒云、极云普惠云实测大比拼
  • 基础复习(反射、注解、动态代理)
  • OGG同步目标端中文乱码处理
  • 使用WPF调用Python进行图像灰度处理
  • (二)测试工具
  • springboot 博客交流平台-计算机毕业设计源码56406
  • 从0开始搭建vue + flask 旅游景点数据分析系统( 八):美化前端可视化图形
  • 【前端面试】七、算法-迭代器和生成器
  • vs+qt一些问题
  • 基于K8S配置Jenkins主从节点实例